简体   繁体   English

注册时触发BroadcastReceiver onReceive

[英]BroadcastReceiver onReceive triggered when registered

I have a broadcast receiver which is being triggered the moment it's registered (and subsequently retriggered with onPause / onResume), surely this is the wrong behaviour? 我有一个广播接收器,它在注册时被触发(随后用onPause / onResume重新触发),这肯定是错误的行为? Have I missed something here? 我错过了什么吗?

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());
    }

}

The CONNECTIVITY_ACTION broadcast seems to be sticky on some devices (even though the documentation implies that it is not). CONNECTIVITY_ACTION广播似乎在某些设备上很粘(即使文档暗示它不是)。 This means that when you register the receiver it will immediately call onReceive() with the most recently sent broadcast. 这意味着当您注册接收器时,它将立即使用最近发送的广播呼叫onReceive() Since you are registering and unregistering in onPause() and onResume() you will get a lot of calls to onReceive() . 由于您在onPause()onResume()中注册和取消注册,因此您将获得对onReceive()的大量调用。 You might want to do this in a different way. 您可能希望以不同的方式执行此操作。

Thanks for the answers! 谢谢你的回答! My solution was a result of them all, by switching to a manifest declared receiver and enabling/disabling the receiver component in onResume/onPause stopped the sticky nature of the receiver. 我的解决方案是他们所有的结果,通过切换到清单声明的接收器并在onResume / onPause中启用/禁用接收器组件停止了接收器的粘性。 And by enabling/disabling the component I can have piece of mind that I'm a second class citizen. 通过启用/禁用组件,我可以放心,我是二等公民。

@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 AndroidManifest.xml中

<receiver android:name="com.example.receiver.FooBroadcastReceiver">
  <intent-filter>
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
  </intent-filter>
</receiver>

Here's another solution that worked for me: 这是另一个对我有用的解决方案:

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());
        }
    }

}

I'm assuming that MyBroadcastReceiver is an inner class for FooActivity so it can access mReceiverRegisteringIntent 我假设MyBroadcastReceiver是一个内部类FooActivity以便它可以访问mReceiverRegisteringIntent

remove the following two lines they won't be triggered in onPause and onResume! 删除以下两行,它们不会在onPause和onResume中触发!

registerReceiver(connectivityReceiver, intentFilter);
unregisterReceiver(connectivityReceiver);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 BroadcastReceiver onReceive()在动态注册时不调用 - BroadcastReceiver onReceive() not Called when registered dynamically Android BroadcastReceiver onReceive()未触发 - Android BroadcastReceiver onReceive() not triggered 使用LocalBroadcastManager注册BroadcastReceiver时,不会调用onReceive - onReceive not being called when BroadcastReceiver is registered using LocalBroadcastManager Android:未触发BroadcastReceiver onReceive回调 - Android: BroadcastReceiver onReceive Callback not Triggered 注册BroadcastReceiver后,OnReceive不会被调用 - OnReceive is not called even after BroadcastReceiver is registered 成功注册了一个BroadcastReceiver到requestActivityTransitionUpdates,但是onReceive从来没有调用过 - Successfully registered a BroadcastReceiver to requestActivityTransitionUpdates, but onReceive never called 当为BroadcastReceiver调用onReceive时发生NullPointerException - NullPointerException when onReceive is callled for BroadcastReceiver 在动态注册广播接收器的onReceive方法时,它总是被调用吗? - Is a BroadcastReceiver's onReceive method always called the moment it gets registered dynamically? 当应用启动时,在BroadcastReceiver中触发onReceive - onReceive in BroadcastReceiver triggers when app starts 何时确切地从BroadcastReceiver调用onReceive? - When exactly onReceive from BroadcastReceiver is called?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM