android 当操作系统发送广播消息时启动服务

mzmfm0qo  于 2023-03-28  发布在  Android
关注(0)|答案(1)|浏览(148)

这个问题是来自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
vyu0f0g1

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?
了解更多信息

相关问题