BroadcastReceiver和已暂停的活动

16

我在一个活动中以编程方式注册了一个广播接收器。它响应PACKAGE_REMOVED意图,当一个包被移除时触发。

问题是,它没有接收到这个消息。我认为这是由于在我离开活动并移动到另一个活动卸载应用程序时,意图被触发,所以原始活动被暂停了。

可能是因为一个暂停的活动(在其中接收器没有在onPause中取消注册)也会暂停接收器吗?

3个回答

38

当你在活动中以编程方式注册广播接收器时,当活动暂停时,它将无法接收到广播。广播接收器文档对此并不是很清楚。他们建议在onPause上注销广播接收器仅为了减少系统开销。

如果您想要在您的活动不在前台时接收事件,则可以使用receiver元素在清单文件中注册接收器。


1
如果在当前已暂停的活动中注册了位于清单中的接收器,那么它能够访问其封闭活动的私有变量吗? - Peterdk
没关系,我现在明白了,Receiver类不是一个接口,而是你需要继承的一个类。 - Peterdk
2
被踩了。我经常创建本地广播接收器,即使活动已暂停,它们仍会被调用。甚至不会调用恢复。不确定您从哪里获取了这个错误信息,但显然是错误的。 - Johann

5
将一个接收器添加到您的项目中,您甚至无需启动应用程序就可以获得此事件。
public class TestReciver extends BroadcastReceiver  {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("TestReciver",intent.getAction()+"\n"
                +intent.getDataString()+"\n"
                +"UID: "+intent.getIntExtra(Intent.EXTRA_UID,0)+"\n"
                +"DATA_REMOVED: "+intent.getBooleanExtra(Intent.EXTRA_DATA_REMOVED, false)+"\n"
                +"REPLACING: "+intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)
            );
    }

}

在您的清单文件中像这样添加它(在您的<application>标签内):

<receiver android:name="TestReciver" >
    <intent-filter >
        <action android:name="android.intent.action.PACKAGE_REMOVED" />
        <data android:scheme="package" />
    </intent-filter>
</receiver>

当您使用此类接收器时,无需调用任何注册或注销函数,因此它始终准备好获取数据。
需要注意的是,如果您允许用户将您的应用移动到SD卡,则此方法将无法正常工作。 如果在卸载SD卡时发送事件,则无法访问接收器,您将错过该事件。

2
也许您可以在后台运行的服务中注册接收器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接