接收程序包安装和卸载事件

时间:2011-09-19 11:37:37

标签: android broadcastreceiver

我正在尝试检测何时安装新的应用程序但仅在我的应用程序正在运行时。我设法通过制作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方法。任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:101)

我尝试在清单文件或java代码中注册BroadcastReceiver。但是这两种方法都无法触发onReceive()方法。 在谷歌搜索这个问题之后,我在SO中找到了来自另一个Thread的两种方法的解决方案: Android Notification App

在清单文件中:

<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>

在java代码中:

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

这应该适合你。

答案 1 :(得分:24)

为了补充上面的Huang的答案,以下是如何获取新安装的应用程序的包名称:

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

答案 2 :(得分:21)

其他答案指出要收听ACTION_PACKAGE_ADDEDACTION_PACKAGE_REPLACED广播。对于Android 7.1及更低版本来说这很好。在Android 8.0+上,您无法在清单中注册这些广播。

相反,您需要定期call getChangedPackages() on PackageManager,例如通过定期JobScheduler工作。这不会为您提供实时结果,但实时结果不再是Android 8.0 +的选项。

答案 3 :(得分:1)

此代码适用于REMOVED_APPLICATION。

使用以下代码,U不需要使用清单。只需在ur Java类中编写此代码。

 BroadcastReceiver  uninstallApplication = new BroadcastReceiver() {

      @Override
      public void onReceive(Context context, Intent intent) {

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
          String packageName = Objects.requireNonNull(intent.getData()).getEncodedSchemeSpecificPart();

       Toast.makeText(context, "USER UNINSTALL : " + packageName, Toast.LENGTH_SHORT).show();




        }
      }
    };
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
    intentFilter.addDataScheme("package");
    registerReceiver(uninstallApplication, intentFilter);