这个问题是来自Android Enthusiasts Stack Exchange的migrated,因为它可以在Stack Overflow. Migrated上回答6天前。
我正在尝试编写一个Android应用程序,可以接收特定的广播消息,即使应用程序尚未启动,然后开始执行一些代码(调用服务等)。如何才能做到这一点?
这似乎是可能的,因为当设备启动时,操作系统可以向应用程序(已注册接收事件)发送广播消息,即使它们尚未启动,并且可以继续执行某些代码。
我尝试过实现一个后台服务,但它只在应用程序启动时触发,并在应用程序停止时立即停止。
我是否必须实现前台服务,但我如何确保它可以接收广播消息并触发代码的执行,即使应用程序尚未运行?
这可以做到吗?或者它只是特定于设备启动的东西?
2023年3月22日**
我尝试修改我的manifest文件以在那里添加接收器,但我的接收器仍然没有被调用。据我所知,因为我想在添加包时触发我的接收器,所以我需要QUERY_ALL_PACKAGE权限,可能还需要相应的查询。
AndroidManifest.xml
....
<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)
}
}
}
如果我试图在代码中添加registerReceiver,我的接收器会被调用,但在这种情况下,如果我的应用程序关闭,接收器不会被触发。我在这里包含代码以进行比较和完整性。
val intentFilter = IntentFilter()
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED)
intentFilter.addDataScheme("package")
registerReceiver(receiveInstalled(), intentFilter)
编辑2023年3月22日第2部分
不知何故,当我使用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
1条答案
按热度按时间vyu0f0g11#
看起来这可能是您的问题的原因:
https://developer.android.com/about/versions/oreo/background.html#broadcasts
您不能在清单中注册接收器以在隐式广播(PACKAGE_ADDED是隐式的)时触发。因此,在这种情况下,您不能构建将由Android启动的组件。
How to register for ACTION_PACKAGE_ADDED and ACTION_PACKAGE_REMOVED on Android Oreo?
了解更多信息