アプリの再インストールを検知する方法

アプリのインストール情報を検知するためandroid.manufestに以下の定義をする。

<receiver android:name=".MyReciever">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_ADDED" />
        <action android:name="android.intent.action.PACKAGE_CHANGED" />
        <action android:name="android.intent.action.PACKAGE_DATA_CLEARED" />
        <action android:name="android.intent.action.PACKAGE_INSTALL" />
        <action android:name="android.intent.action.PACKAGE_REMOVED" />
        <action android:name="android.intent.action.PACKAGE_REPLACED" />
        <action android:name="android.intent.action.PACKAGE_RESTARTED" />
    </intent-filter>
</receiver>

そしてjavaのコードでレシーバーを定義する。

public class MyrReciever extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		String action = intent.getAction();
		Log.d("MyrReciever" ,action);
	}
}

しかしこれだけではインテントが飛んでこない。
調べてみるとandroid deveopersに回答があった。
どうやらインテントフィルターにschemeを追加する必要があるらしい。
つまり、android.manufestを以下のように書き換える。

<receiver android:name=".MyReciever">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_ADDED" />
        <action android:name="android.intent.action.PACKAGE_CHANGED" />
        <action android:name="android.intent.action.PACKAGE_DATA_CLEARED" />
        <action android:name="android.intent.action.PACKAGE_INSTALL" />
        <action android:name="android.intent.action.PACKAGE_REMOVED" />
        <action android:name="android.intent.action.PACKAGE_REPLACED" />
        <action android:name="android.intent.action.PACKAGE_RESTARTED" />
        <data android:scheme="package"/>
    </intent-filter>
</receiver>

これでパッケージの状態が変化するとブロードキャストレシーバーにインテントが飛んでくるようになる。
ちなみにdataタグにpathを指定することで変更を通知するパッケージを絞ることができるようだ。

2012/2/9
通知するパッケージを絞れるというのは勘違いのようでした。
これらのブロードキャストのUriは"package:com.example.myapp"というURIだか何なんだかよく分からない形式になっていて、どうもintent-filterで絞りをかける手段はないようです。

<data android:scheme="package" android:path="com.example.myapp" />

参考:
Google グループ