16

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

问题是,它没有收到此消息。我认为这是因为当我离开活动并移动到另一个活动以卸载应用程序时,意图被触发,因此原始活动被暂停。可能是暂停的活动(接收者未在其中未注册onPause)也会暂停接收者吗?

4

3 回答 3

38

当您在活动中以编程方式注册广播接收器时,当活动暂停时它将不会收到广播。BroadcastReceiver文档在这一点上并没有那么清楚。他们建议仅在 onPause 上取消注册以减少系统开销。

如果您想在活动不在前台时接收事件,请使用接收器元素在清单中注册接收器。

于 2011-11-10T16:56:08.250 回答
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 卡时发送事件,接收器将无法访问,您将错过该事件。

于 2011-11-11T21:55:16.430 回答
2

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

于 2011-11-11T03:10:35.970 回答