我在一项活动中以编程方式注册了广播接收器。它响应PACKAGE_REMOVED
意图,当包被删除时会触发。
问题是,它没有收到此消息。我认为这是因为当我离开活动并转移到另一个活动以卸载应用程序时,意图被触发,因此原始活动暂停。
可能暂停活动(接收器未在onPause
中取消注册)也会暂停接收器吗?
答案 0 :(得分:36)
当您在活动中以编程方式注册广播接收器时,当活动暂停时,它将不会获得广播。 BroadcastReceiver docs并不像在这一点上那样清晰。他们建议仅在onPause上取消注册以减少系统开销。
如果您想要在活动不在前台时接收活动,请使用receiver元素在清单中注册接收器。
答案 1 :(得分:5)
为您的项目添加Receiver,即使您没有启动应用程序,也会收到此事件。
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 :(得分:2)
也许你可以在服务中注册接收器