注册时的BroadcastReceiver的onReceive触发 [英] BroadcastReceiver onReceive triggered when registered

查看:250
本文介绍了注册时的BroadcastReceiver的onReceive触发的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有被触发它的注册(并随后重新触发的onPause / onResume)的那一刻起广播接收器,想必这是错误的行为吗?我错过了一些东西呢?

 类FooActivity延伸活动{

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.main);
        BroadcastReceiver的=新FooBroadcastReceiver();
        IntentFilter的=新的IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
    }

    @覆盖
    保护无效onResume(){
        super.onResume();
        registerReceiver(connectivityReceiver,IntentFilter的);
    }

    @覆盖
    保护无效的onPause(){
        super.onPause();
        unregisterReceiver(connectivityReceiver);
    }


类MyBroadcastReceiver扩展的BroadcastReceiver {

    @覆盖
    公共无效的onReceive(上下文的背景下,意图意图){
        如果(connectivityAction(意向)){
            Log.d(footag,的onReceive);
        }
    }

    私人布尔connectivityAction(意向意图){
        返回ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction());
    }

}
 

解决方案

谢谢你的答案!我的解决办法是所有这些的结果是,通过切换到一个清单中声明接收机和启用/禁用在onResume /的onPause所述接收器组件停止接收机的粘性性质。而通过启用/禁用的组件,我可以有一片心,我是二等公民。

  @覆盖
保护无效onResume(){
    super.onResume();
    setReceiverState(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
}

@覆盖
保护无效的onPause(){
    super.onPause();
    setReceiverState(PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
}


私人无效setReceiverState(INT receiverState){
    组件名接收器=新的组件名(本,FooBroadcastReceiver.class);
    PackageManager下午= this.getPackageManager();
    pm.setComponentEnabledSetting(接收器,receiverState,
    PackageManager.DONT_KILL_APP);
}
 

AndroidManifest.xml中

 <接收器的Andr​​oid版本:NAME =com.example.receiver.FooBroadcastReceiver>
  <意向滤光器>
    <作用机器人:名称=android.net.conn.CONNECTIVITY_CHANGE/>
  &所述; /意图滤光器>
< /接收器>
 

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

}

解决方案

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. 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

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

这篇关于注册时的BroadcastReceiver的onReceive触发的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆