接收包安装和卸载事件

我试图检测一个新的应用程序正在安装,但只有当我的应用程序正在运行。 我设法通过制作一个BroadcastReceiver并在AndroidManifest文件中激活它来检测应用程序的安装,但即使我的应用程序已closures,这也会检测到。 所以这就是为什么我需要手动激活和停用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方法中input。 任何帮助表示赞赏。

我尝试在清单文件或Java代码中注册BroadcastReceiver 。 但是这两个方法都无法触发onReceive()方法。 谷歌search这个问题后,我find了一个解决scheme从另一个线程在SO: Android通知应用程序

在清单文件中:

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

这应该适合你。

只要添加上面的Huang的答案,下面是如何获取新安装的应用程序的包名称:

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

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

相反,您需要定期在PackageManager上调用getChangedPackages() ,例如通过定期的JobScheduler作业。 这不会给你实时的结果,但实时结果不再是Android 8.0以上的选项。