パッケージの追加・削除を感知するには

パッケージがインストールされたり、アンインストールされると次のインテントが発行されます。

このアクションをBroadcastReceiverで受け取ってやればパッケージの追加・削除を感知できます。

手順は次の通りです。

1. BroadcastReceiverの準備

まず、次のような空のレシーバークラスを作ります。

public class PackageRceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context arg0, Intent arg1){}
}

ここではPackageReceiverという名前のレシーバークラスを作りました。

その後、AndroidManifest.xmlを開いてapplicationタグ内にレシーバーを追加します。

<!-- レシーバーを追加 -->
   <receiver android:name=".PackageRceiver" >
       <intent-filter>
           <action android:name="android.intent.action.PACKAGE_ADDED" />
           <action android:name="android.intent.action.PACKAGE_REMOVED" />
        <data android:scheme="package" />
       </intent-filter>
   </receiver>

2. レシーバーの実装

実際にパッケージの追加・削除を感知するにはActivityクラスなどにレシーバーを登録します。

class MyActivity extends Activity
{
    private PackageRceiver packageReceiver;
    
    private final String LOG_TAG = MyActivity.class.getName();

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        /**レシーバーを実装・登録*/
        IntentFilter filter 
            = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
        filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
        filter.addDataScheme("package");
        packageReceiver = new PackageRceiver()
        {
            @Override
            public void onReceive(Context context, Intent intent) 
            {
                String action = intent.getAction();
                
                if(action.equals(Intent.ACTION_PACKAGE_ADDED)){
                    Log.i(LOG_TAG, "追加されたパッケージURI = "
                             + intent.getData());
                }
                if(action.equals(Intent.ACTION_PACKAGE_REMOVED)){
                    Log.i(LOG_TAG, "削除されたパッケージURI = " 
                            + intent.getData());
                }
            }
        };
        registerReceiver(packageReceiver, filter);
    }
    
    @Override
    public void onDestroy()
    {
        super.onDestroy();
        
        unregisterReceiver(packageReceiver);
            ///使わなくなったら必ず登録解除
    }
}

追加または削除されたパッケージ名のURIはIntentgetDataから次のような形式で得ることができます。

package:com.xxx.myapp

パッケージ名の前にpackage:がついているので正しいパッケージ名を得るにはpackage:を削除する処理が必要です。

関連項目
プライバシーポリシー