Android OSから発行されるブロードキャストインテントの受信

Androidではいくつかの標準ブロードキャストインテントが定義されていて、システムの様々な状態変化を取得できるようになっています。今回はアプリのアンインストールの検知を試してみました。
# 最初、機内モードIN/OUTを検知しようとしてうまく検知できず…

【参考】 android.content.Intent のリファレンスの Standard Broadcast Actions の項
http://developer.android.com/reference/android/content/Intent.html

テスト環境は以下の通りです。

AndroidManifest.xmlの記述

の子要素として を記述します。PACKAGE_REMOVED (アプリのアンインストール時に発行されるブロードキャストインテント) を受信して、android:name属性に指定したUninstallReceiverクラスを起動することを指定います。
試してみた限りでは、intent-filter中の は必須で、これがないとロードキャストレシーバが起動されませんでした。

    <application>
    ....
        <receiver android:name=".UninstallReceiver">
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_REMOVED" />  
                <data android:scheme="package" />       
            </intent-filter>
        </receiver>
    </application>

Broadcast Receiverの作成

以下のようなブロードキャストレシーバを記述します。AndroidManifestの記述に従って、PACKAGE_REMOVEDが発行されるとUninstallReceiverがインスタンス化され、onReceiverが呼び出されることになります。ここでは、別のアクティビティ (Main) を起動する処理を行っています。

UninstallReceiver.java

public class UninstallReceiver extends BroadcastReceiver {
    private static final String TAG = "DEBUG";
        @Override
        public void onReceive(Context context, Intent received_intent) {
            Log.d(TAG, "receiver activated");
            Intent intent = new Intent(context, Main.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setAction(Intent.ACTION_MAIN);
            context.startActivity(intent);
	}
    }
}

実行結果

上記のテスト用アプリをインストールした後で、別のダミーアプリのインストール→アンインストールを行ったところ、UninstallReceiverで呼び出しているアクティビティが表示されることを確認しました。
また、logcatを見ると、以下のようにUninstallReceiver#onReceive中で出力しているログの存在を確認できます。