web-dev-qa-db-ja.com

パッケージのインストールおよびアンインストールイベントの受信

アプリが実行されている場合にのみ、新しいアプリがインストールされていることを検出しようとしています。 BroadcastReceiverを作成してAndroidManifestファイル内でアクティブにすることで、アプリのインストールを検出できましたが、アプリが閉じていても検出できます。そのため、broadcastreveiverを手動でアクティブおよび非アクティブにする必要があります。これを行うには、このコードがあります:

br = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Log.i("Enter", "Enters here");
        Toast.makeText(context, "App Installed!!!!.", Toast.LENGTH_LONG).show();
    }
};
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
intentFilter.addAction(Intent.ACTION_PACKAGE_INSTALL);
registerReceiver(br, intentFilter);

これにより、新しいアプリがインストールされたときに乾杯するはずです。しかし、悲しいことにそうではありません。 onReceiveメソッドには入りません。どんな助けも大歓迎です。

51
Petre Popescu

マニフェストファイルまたはJavaコード)にBroadcastReceiverを登録しようとしましたが、これら2つのメソッドは両方ともonReceive()メソッドをトリガーできませんでした。問題、SOの別のスレッドから両方のメソッドのソリューションを見つけました: Android Notification App

マニフェストファイル(では、このアプローチはAPI 26(Android 8)以降適用されなくなり、以前のAndroid versions):

<receiver Android:name=".YourReceiver">
    <intent-filter>
        <action Android:name="Android.intent.action.PACKAGE_INSTALL" />
        <action Android:name="Android.intent.action.PACKAGE_ADDED" />
        <data Android:scheme="package"/>
    </intent-filter>
</receiver>

In Java code:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
intentFilter.addAction(Intent.ACTION_PACKAGE_INSTALL);
intentFilter.addDataScheme("package");
registerReceiver(br, intentFilter);

これはあなたのために働くはずです。

103
Huang

上記のHuangの回答に追加するために、新しくインストールされたアプリケーションのパッケージ名を取得する方法を次に示します。

public class YourReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String packageName = intent.getData().getEncodedSchemeSpecificPart();
    }
}
25
THANN Phearum

他の回答は、_ACTION_PACKAGE_ADDED_および_ACTION_PACKAGE_REPLACED_ブロードキャストのリッスンを示しています。 Android 7.1以前では問題ありません。Android 8.0+では、マニフェストにこれらのブロードキャストを登録できません。

代わりに、定期的なPackageManagerジョブなどを使用して、 JobSchedulergetChangedPackages()を呼び出す を定期的に行う必要があります。これにより、リアルタイムの結果は得られませんが、リアルタイムの結果はAndroid 8.0+。

23
CommonsWare