アプリの再インストールを検知する方法
アプリのインストール情報を検知するため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 グループ