Android应用未启动时接收系统广播并启动服务的实现疑问
实现Android应用未启动时接收系统广播并触发服务
核心需求
- 希望应用未启动时能接收特定系统广播,进而启动服务执行代码
- 已知开机时系统可向未启动的已注册应用发送广播并触发代码,确认此逻辑是否可应用到其他广播场景
- 曾实现后台服务,但仅在应用启动时触发,应用停止后服务随即终止,疑问是否需要改用前台服务,以及如何确保应用未运行时仍能接收广播并触发代码
2023年3月22日更新:静态注册接收器未生效
需要监听应用包添加事件,已添加QUERY_ALL_PACKAGES权限及对应queries配置,清单代码如下:
.... <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" /> <queries> <intent> <action android:name="android.intent.action.MAIN" /> </intent> </queries> .... <application> .... <receiver android:name=".receiveInstalled" android:exported="true" android:enabled="true"> <intent-filter> <action android:name="android.intent.action.PACKAGE_ADDED" /> <data android:scheme="package" /> </intent-filter> </receiver> .... </application>
接收器类代码:
class receiveInstalled : BroadcastReceiver() { override fun onReceive(p0: Context?, p1: Intent?) { if(Intent.ACTION_PACKAGE_ADDED == p1?.action) { val retcomponent = p0?.startService(Intent(p0, GetService2::class.java)) Log.v("check_services", "startService " + retcomponent) val getname = p1?.data?.schemeSpecificPart Log.v("check_services", "intent received " + getname.toString()) Log.v("check_services", "query " + p1?.data?.scheme) } } }
动态注册接收器可正常触发,但应用关闭后失效,代码对比:
val intentFilter = IntentFilter() intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED) intentFilter.addDataScheme("package") registerReceiver(receiveInstalled(), intentFilter)
2023年3月22日更新(续):ADB发送广播的测试结果
- 触发成功的命令:
am broadcast -a "android.intent.action.PACKAGE_ADDED" -n com.temp.getservice2/.receiveInstalled Broadcasting: Intent { act=android.intent.action.PACKAGE_ADDED flg=0x400000 cmp=com.temp.getservice2/.receiveInstalled } Broadcast completed: result=0
- 触发失败的命令:
am broadcast -a "android.intent.action.PACKAGE_ADDED" Broadcasting: Intent { act=android.intent.action.PACKAGE_ADDED flg=0x400000 } Broadcast completed: result=0
内容的提问来源于stack exchange,提问作者localacct
相关产品推荐
相关产品推荐

