如何有效地更新已安装的应用程序列表?

时间:2018-04-15 01:30:10

标签: android

在这个问题中我基本上不需要编写代码来解决我的问题,我需要一种有效的方法(解决方案,流程或逻辑)来解决当前的问题。

在我的应用程序中,我有两个活动(MainActivity - InstalledAppsActivity)

加载已安装的应用列表(包名称+标签+图标)需要时间(然后填充GridView):

我将它们保存在静态通用应用详情列表中(InstalledAppsActivity的成员)。

我使用在AndroidManifest.xml中注册的AppsBroadcastReceiver 监控安装/卸载应用操作

这是重要的部分

AppsBroadcastReceiver会触发包含包名称及其状态的广播,并由我的InstalledAppsActivity接收,以更新静态通用安装应用详情列表(更新GridView适配器)。

到目前为止一切顺利,除非InstalledAppsActivity被销毁:

如果用户按下后退按钮,则会发生InstalledAppsActivity:unregisterReceiver,并且不会收到包含名称和状态的已触发广播,这意味着静态通用列表(包含应用程序详细信息并由GridView适配器使用)将无法获取更新。

获取我的静态通用应用详情列表以获取更新的最佳方法/流程是什么,无论InstalledAppsActivity是活着还是被销毁?

1 个答案:

答案 0 :(得分:2)

基于documentation

  

针对Android 8.0或更高版本的应用无法再在其清单中为隐式广播注册广播接收器。隐式广播是一种不专门针对该应用的广播。例如,ACTION_PACKAGE_REPLACED是一个隐式广播,因为它被发送给所有已注册的侦听器,让他们知道设备上的某些包已被替换

可能有两种方法:

  1. 启动前台服务并注册ACTION_PACKAGE_ADDED。 缺点是它总是可见并且可能导致电池排水。这也会导致用户烦恼。
  2. 使用JobScheduler定期安排作业。然后,您可以使用PackageManager.getChangedPackages
  3. 基于PackageManager.getChangedPackages的文档:

      

    返回已更改的包的名称[例如。添加,删除或更新],因为给定的序列号。如果没有更改包,则返回null。序列号从0开始,每次启动都会重置。

    但是,根据BroadcastReceiver exception list,您仍然可以注册ACTION_PACKAGE_FULLY_REMOVED以便在完全删除包时接收广播并相应地执行您的任务