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

Pet*_*scu 51 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);
Run Code Online (Sandbox Code Playgroud)

这应该在安装新应用程序时举杯.但遗憾的是,事实并非如此.它不会进入onReceive方法.任何帮助表示赞赏.

Hua*_*ang 105

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

在清单文件中:

<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>
Run Code Online (Sandbox Code Playgroud)

在java代码中:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
intentFilter.addAction(Intent.ACTION_PACKAGE_INSTALL);
intentFilter.addDataScheme("package");
registerReceiver(br, intentFilter);
Run Code Online (Sandbox Code Playgroud)

这应该适合你.

  • @HirenDabhi,只需添加相应的intent过滤器的动作:`<action android:name ="android.intent.action.PACKAGE_REMOVED"/>`. (8认同)
  • 只需添加intentFilter.addDataScheme("package"); 我的代码解决了一切.谢谢. (7认同)
  • 我认为不需要"ACTION_PACKAGE_INSTALL",正如文档所述(此处:http://developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_INSTALL):"此常量在API级别14中已弃用.这个常数从未被使用过." (4认同)
  • 顺便说一句,收到的包URI(`intent.getData().toString()`)是这样的 - "package:com.rovio.angrybirds" (4认同)
  • @HirenDabhi是的,我也发现了.我认为这是因为当您在自己的应用程序中注册并且卸载应用程序时,已卸载已注册的BroadcastReceiver,然后卸载该应用程序,因此该BroadcastReceiver将不会收到其自己的卸载事件. (3认同)
  • 这仅用于安装新应用程序.但是如何在广播接收器中获得卸载我的applcation事件? (2认同)

Com*_*are 26

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

相反,你需要调用getChangedPackages()PackageManager周期性,如通过定期JobScheduler的工作.这不会为您提供实时结果,但实时结果不再是Android 8.0+的选项.

  • @KarsenGauss:我[博客文章](https://commonsware.com/blog/2017/04/11/android-o-implicit-broadcast-ban.html)涵盖了这一点. (6认同)

THA*_*rum 25

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

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