注册时触发BroadcastReceiver onReceive

Ada*_*own 15 android broadcastreceiver

我有一个广播接收器,它在注册时被触发(随后用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());
    }

}
Run Code Online (Sandbox Code Playgroud)

Dav*_*ser 16

CONNECTIVITY_ACTION广播似乎在某些设备上粘(即使文档意味着它不是).这意味着当您注册接收器时,它将立即onReceive()使用最近发送的广播进行呼叫.由于您正在注册和取消注册,onPause()因此onResume()您将收到很多电话onReceive().您可能希望以不同的方式执行此操作.

  • 很难找到这个.对于阅读此内容的任何人,要排除粘性的一个检查isInitialStickyBroadcast() (6认同)

Ada*_*own 11

谢谢你的回答!我的解决方案是他们所有的结果,通过切换到清单声明的接收器并在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);
}
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xml中

<receiver android:name="com.example.receiver.FooBroadcastReceiver">
  <intent-filter>
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
  </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

  • 定位API级别23或更高级别时,不再触发此类BroadcastReceivers。您必须在onResume()/ onPause()中注册/注销它们。 (2认同)