在这个问题中我基本上不需要编写代码来解决我的问题,我需要一种有效的方法(解决方案,流程或逻辑)来解决当前的问题。
在我的应用程序中,我有两个活动(MainActivity - InstalledAppsActivity)
加载已安装的应用列表(包名称+标签+图标)需要时间(然后填充GridView):
我将它们保存在静态通用应用详情列表中(InstalledAppsActivity的成员)。
我使用在AndroidManifest.xml中注册的AppsBroadcastReceiver 监控安装/卸载应用操作
这是重要的部分
AppsBroadcastReceiver会触发包含包名称及其状态的广播,并由我的InstalledAppsActivity接收,以更新静态通用安装应用详情列表(更新GridView适配器)。
到目前为止一切顺利,除非InstalledAppsActivity被销毁:
如果用户按下后退按钮,则会发生InstalledAppsActivity:unregisterReceiver,并且不会收到包含名称和状态的已触发广播,这意味着静态通用列表(包含应用程序详细信息并由GridView适配器使用)将无法获取更新。
获取我的静态通用应用详情列表以获取更新的最佳方法/流程是什么,无论InstalledAppsActivity是活着还是被销毁?
答案 0 :(得分:2)
针对Android 8.0或更高版本的应用无法再在其清单中为隐式广播注册广播接收器。隐式广播是一种不专门针对该应用的广播。例如,ACTION_PACKAGE_REPLACED是一个隐式广播,因为它被发送给所有已注册的侦听器,让他们知道设备上的某些包已被替换
可能有两种方法:
ACTION_PACKAGE_ADDED
。
缺点是它总是可见并且可能导致电池排水。这也会导致用户烦恼。JobScheduler
定期安排作业。然后,您可以使用PackageManager.getChangedPackages
基于PackageManager.getChangedPackages的文档:
返回已更改的包的名称[例如。添加,删除或更新],因为给定的序列号。如果没有更改包,则返回null。序列号从0开始,每次启动都会重置。
但是,根据BroadcastReceiver exception list,您仍然可以注册ACTION_PACKAGE_FULLY_REMOVED
以便在完全删除包时接收广播并相应地执行您的任务