首页 > 解决方案 > 为什么我的 Manifest 声明的广播接收器会在一段时间后停止监听显式广播?

问题描述

我正在尝试创建两个应用程序,它们通过其中一个接收另一个广播进行通信。
发送方 App A 拥有很多权限,并在各种低功耗模式情况下(深度瞌睡、轻度瞌睡……)发出这些广播。应用程序 B 没有运行,只有一个声明为 Receiver 的清单,它接收广播并执行一些工作。
一旦我打开并关闭了接收应用程序,这可以正常工作一天或更长时间,然后接收器突然停止接收。我说它停止接收是因为即使手机已打开并连接以进行调试,当我发送广播时,我的 adb 桥也不会显示其进程。它不显示进程是正常的,因为没有任何东西在运行,但是一旦我调用接收器,它通常会在调试器工作时显示一个进程。一旦它停止工作,这个过程就不会弹出,我看不到接收器工作的副作用。

App B清单中的接收者

     <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.NOTIFICATIONBROADCSTACTION" />
            </intent-filter>
        </receiver>

在 App AI 中尝试了普通广播和有序广播。两次问题都在一段时间后发生。我使用了有序广播,认为接收器的唤醒锁可能已经用完了。这就是为什么我持有部分唤醒锁,直到我的有序广播接收器返回。但是,由于它不会首先被调用,所以这不应该改变任何东西。

 Intent intent = new Intent();
        intent.setAction("com.example.NOTIFICATIONBROADCSTACTION");
        putIntentExtras(intent,m);
        PackageManager packageManager = getPackageManager();
        List<ResolveInfo> infos = packageManager.queryBroadcastReceivers(intent, 0);
        for (ResolveInfo info : infos) {
            ComponentName cn = new ComponentName(info.activityInfo.packageName,
                    info.activityInfo.name);
                    intent.setComponent(cn);
            //sendBroadcast(intent);
            sendOrderedBroadcast(intent, null, bc,null, MainActivity.RESULT_CANCELED,null,null);

        }

我有一种感觉,如果用户暂时不与它交互,android 会将我的接收器标记为非活动或将其删除。
由于清单声明的接收器要求应用程序必须至少打开一次才能在操作系统上注册,我觉得这个要求有点像在一段时间后通过超时接收器来重置。

有谁知道发生了什么以及为什么我的接收器停止工作?
如果是这样,您是否有解决此问题的方法。

值得一提的是,App B 可能没有任何需要用户确认的权限,但如果您有包含此功能的解决方案,请留下评论。

标签: androidbroadcastreceiverbroadcast

解决方案


推荐阅读