2011年3月25日金曜日

Androidアプリをインストール時に起動させる

Androidで常駐アプリケーションを作成する場合、サービス(Service)を利用する。サービスの実装方法は…他のサイトを見るとして、以下の点について実装方法を調べてみた。
  • 端末を再起動後、自動的に常駐する
  • アプリケーションが停止されても、自動的に再常駐する
  • インストール直後から自動的に常駐する

端末を再起動後、自動的に常駐する


これは、Androidシステムが発行するブロードキャスト(ACTION_BOOT_COMPLETED)を受け取った際に、サービスを起動させることで実現できる。具体的に必要となる作業は以下の3つ。
  • サービスクラスの定義
  • ブロードキャストレシーバクラスの定義
  • レシーバの定義

サービスクラスを定義
Androidに常駐して行いたい作業を記述するクラス。下記の例では具体的な処理内容は定義していない。
public class MyService extends Service
{
  @Override
  public void onCreate()
  {
    super.onCreate();
    // 初期化
  }

  @Override
  public void onStart(Intent intent, int startId)
  {
    super.onStart(intent, startId);
    // 常駐作業
  }

  @Override
  public IBinder onBind(Intent arg0)
  {
    return null;
  }
}

ブロードキャストを受け取るレシーバクラスを定義
システムの起動完了通知(ACTION_BOOT_COMPLETED)を受け取り、サービス(MyService.class)を起動する。
public class MyReceiver extends BroadcastReceiver
{
  @Override
  public void onReceive(Context context, Intent i)
  {
    if (Intent.ACTION_BOOT_COMPLETED.equals(i.getAction()))
    {
      context.startService(new Intent(context, MyService.class));
    }
  }
}

レシーバの定義
AndroidManifext.xmlの<application>タグ内に、下記のレシーバの定義を追加する。
<receiver
  android:exported="true" 
  android:name=".MyReceiver">

  <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
  
</receiver>
また、<manifest>タグ内に、下記のパーミッション定義を追加擦る必要もある。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

アプリケーションが停止されても、自動的に再常駐する


これは、あえて実装する必要はない。Androidリファレンスの記述では、Context.stopService()もしくはstopSelf()が呼び出されるまで、サービスは起動し続けるし、iMoniの中の人によれば色々な理由でサービスが殺されることはあるものの勝手に再起動するという仕様らしい。

サービスの実装面では考慮すべきことが沢山あるが、落ちても再起動させるという観点からすれば、特にやることはない。


インストール直後から自動的に常駐する


これも、Androidシステムが発行するブロードキャストをきっかけにしてサービス起動を行うことで実現できる。受け取るブロードキャストはINSTALL_REFERRERというもの。具体的に必要となる作業は以下の3つ。
  • サービスクラスの定義
  • ブロードキャストレシーバクラスの定義
  • レシーバの定義

サービスクラスを定義
前述と同様なので省略

ブロードキャストレシーバクラスの定義
アプリケーションのインストール完了通知を受け取り、サービス(MyService.class)を起動する。
public class MyReceiver extends BroadcastReceiver
{
  @Override
  public void onReceive(Context context, Intent i)
  {
    context.startService(new Intent(context, MyService.class));
  }
}

レシーバの定義
Androidマーケットからのインストールを検知するレシーバを定義する。
<receiver
android:exported="true" 
android:name=".MyReceiver">

  <intent-filter>
    <action android:name="com.android.vending.INSTALL_REFERRER"/>
  </intent-filter>
  
</receiver>

注意点
  • 動くかどうか試してない:D
  • Androidマーケットからインストールしないと検知できないらしい


P.S


動くかどうか試していないのは、かなりイケてない。。。近いうちに、サクっとDeveloper登録してお試ししてみよう。

4 件のコメント: