Android获取有关安装或删除的应用程序的广播

Android获取有关安装或删除的应用程序的广播,android,broadcastreceiver,Android,Broadcastreceiver,我想开发一个应用程序,可以接收有关正在安装或删除的其他应用程序的广播。到目前为止,我尝试了下面的代码,但它仅在发生删除安装时提供广播事件,而不提供有关beibg安装或删除的其他应用程序的信息。那么,有没有办法获取新安装的应用程序的包名呢 在manifset中: receiver android:name=".apps.AppListener"> <intent-filter android:priority="100"> <action andr

我想开发一个应用程序,可以接收有关正在安装或删除的其他应用程序的广播。到目前为止,我尝试了下面的代码,但它仅在发生删除安装时提供广播事件,而不提供有关beibg安装或删除的其他应用程序的信息。那么,有没有办法获取新安装的应用程序的包名呢

在manifset中:

receiver android:name=".apps.AppListener">
    <intent-filter android:priority="100">
         <action android:name="android.intent.action.PACKAGE_INSTALL"/>
         <action android:name="android.intent.action.PACKAGE_ADDED"/>  
         <action android:name="android.intent.action.PACKAGE_REMOVED"/>
         <data android:scheme="package"/> 
    </intent-filter>
</receiver>
添加: 对于Api 14或更高版本,这是不推荐的

     <action android:name="android.intent.action.PACKAGE_INSTALL"/> 

有两个选项:

(一) 如果您询问在卸载同一应用程序时是否可以接收广播,则答案是:

除非您是系统应用程序,否则无法执行此操作

Android不会在安装应用程序时通知应用程序。这将是一个安全风险,因为它会使应用程序阻止卸载

(二) 如果您询问其他应用程序何时卸载,则这可能是以下内容的重复:


您在onReceive函数中获取的意图包含与正在添加或删除的包相关的信息

intent.getData().toString()
您可以通过此函数获取应用程序名称:

  private String getApplicationName(Context context, String data, int flag) {

        final PackageManager pckManager = context.getPackageManager();
        ApplicationInfo applicationInformation;
        try {
            applicationInformation = pckManager.getApplicationInfo(data, flag);
        } catch (PackageManager.NameNotFoundException e) {
            applicationInformation = null;
        }
        final String applicationName = (String) (applicationInformation != null ? pckManager.getApplicationLabel(applicationInformation) : "(unknown)");

        return applicationName;
    }
有关更多信息,请查看:

包名嵌入到您在onReceive()方法中接收的意图中。您可以使用以下代码段来阅读:

Uri data = broadcastIntent.getData();
String installedPackageName = data.getEncodedSchemeSpecificPart();
对于添加的包、删除的包和替换的包,您可以使用上述代码获取包名称

在应用程序更新的情况下,您将获得2次背靠背广播,如下所示: 1.包装2已拆除。更换包装

在应用程序更新的情况下,包_REMOVED intent将包含额外的布尔值,以区分应用程序删除和应用程序更新。 您可以按如下方式阅读此布尔值:

boolean isReplacing = broadcastIntent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
仅为了获取包名,您调用PackageManagerService api的开销很大。我们必须避免它


希望,这将对您有所帮助。

谢谢,但我无法获得有关正在安装的应用程序的信息。我认为API 14或更高版本不推荐使用PACKAGE_安装。这方面有什么解决办法吗?但是如何知道在清单中没有安装PACKAGE_的情况下是否安装了应用程序(因为它已被弃用),您可以检查操作:intent.getAction().equals(“android.intent.action.PACKAGE_已添加”)
boolean isReplacing = broadcastIntent.getBooleanExtra(Intent.EXTRA_REPLACING, false);