接收包安装和卸载事件
我试图检测一个新的应用程序正在安装,但只有当我的应用程序正在运行。 我设法通过制作一个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_ADDED
和ACTION_PACKAGE_REPLACED
广播。 这对于Android 7.1及更低版本来说很好。 在Android 8.0+上,您无法在清单中注册这些广播。
相反,您需要定期在PackageManager
上调用getChangedPackages()
,例如通过定期的JobScheduler
作业。 这不会给你实时的结果,但实时结果不再是Android 8.0以上的选项。