[英]BroadcastReceiver onReceive() not Called when registered dynamically
[英]BroadcastReceiver onReceive triggered when registered
我有一个广播接收器,它在注册时被触发(随后用onPause / onResume重新触发),这肯定是错误的行为? 我错过了什么吗?
class FooActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
broadcastReceiver = new FooBroadcastReceiver();
intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
}
@Override
protected void onResume() {
super.onResume();
registerReceiver(connectivityReceiver, intentFilter);
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(connectivityReceiver);
}
class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (connectivityAction(intent)) {
Log.d("footag", "onReceive");
}
}
private boolean connectivityAction(Intent intent) {
return ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction());
}
}
CONNECTIVITY_ACTION
广播似乎在某些设备上很粘(即使文档暗示它不是)。 这意味着当您注册接收器时,它将立即使用最近发送的广播呼叫onReceive()
。 由于您在onPause()
和onResume()
中注册和取消注册,因此您将获得对onReceive()
的大量调用。 您可能希望以不同的方式执行此操作。
谢谢你的回答! 我的解决方案是他们所有的结果,通过切换到清单声明的接收器并在onResume / onPause中启用/禁用接收器组件停止了接收器的粘性。 通过启用/禁用组件,我可以放心,我是二等公民。
@Override
protected void onResume() {
super.onResume();
setReceiverState(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
}
@Override
protected void onPause() {
super.onPause();
setReceiverState(PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
}
private void setReceiverState(int receiverState) {
ComponentName receiver = new ComponentName(this, FooBroadcastReceiver.class);
PackageManager pm = this.getPackageManager();
pm.setComponentEnabledSetting(receiver, receiverState,
PackageManager.DONT_KILL_APP);
}
AndroidManifest.xml中
<receiver android:name="com.example.receiver.FooBroadcastReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
这是另一个对我有用的解决方案:
class FooActivity extends Activity {
private Intent mReceiverRegisteringIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
broadcastReceiver = new FooBroadcastReceiver();
intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
}
@Override
protected void onResume() {
super.onResume();
mReceiverRegisteringIntent = registerReceiver(connectivityReceiver, intentFilter);
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(connectivityReceiver);
}
private class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (connectivityAction(intent)) {
Log.d("footag", "onReceive");
//if mReceiverRegisteringIntent is not null, then this is the sticky
//broadcast received when registering the receiver for the first time
if (mReceiverRegisteringIntent != null) {
//set it to null for future broadcasts
mReceiverRegisteringIntent = null;
return; //do nothing
}
//logic for future broadcasts
...
}
}
private boolean connectivityAction(Intent intent) {
return ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction());
}
}
}
我假设MyBroadcastReceiver
是一个内部类FooActivity
以便它可以访问mReceiverRegisteringIntent
删除以下两行,它们不会在onPause和onResume中触发!
registerReceiver(connectivityReceiver, intentFilter);
unregisterReceiver(connectivityReceiver);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.