注册一个接收器正确的模式呢? [英] Correct pattern for registering a receiver?

查看:97
本文介绍了注册一个接收器正确的模式呢?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要注册一个接收器。我一直在使用以下模式:

  @覆盖
保护无效onResume(){
    super.onResume();
    registerReceiver(myReceiver,新的IntentFilter(...));
}@覆盖
保护无效的onPause(){
    super.onPause();
    unregisterReceiver(myReceiver);
}私人广播接收器myReceiver =新的广播接收器(){
    ...
});

我收到崩溃报告从市场上关于我的unregisterReceiver()调用:

  java.lang.IllegalArgumentException异常:接收未注册

我想这可能是不可能的,但似乎这是正确的,而不是模式:

 私人意图mIntent;@覆盖
保护无效onResume(){
    super.onResume();
    如果(mIntent == NULL){
        mIntent = registerReceiver(myReceiver,新的IntentFilter(...));
    }
}@覆盖
保护无效的onPause(){
    super.onPause();
    如果(mIntent!= NULL){
        unregisterReceiver(myReceiver);
        mIntent = NULL;
    }
}私人广播接收器myReceiver =新的广播接收器(){
    ...
});

就是上面的正确模式?我想这是可能的注册失败,我们必须保持从registerReceiver()的结果,使得调用注销之前检查它的onPause()()?

感谢


我立足了这个问题的变化:
<一href=\"http://stackoverflow.com/questions/5036451/problem-with-broadcastreceiver-receiver-not-registered-error\">Problem与广播接收器(接收器未注册错误)

我只看过上面的第一种模式,从来没有之一,你检查的意图的响应 - 任何澄清将是巨大的。


解决方案

  

就是上面的正确模式?


没有,这不一定是去上班。从文档的 registerReceiver(...) ...


  

返回第一粘意图发现匹配过滤器或空,如果有没有。


在换句话说,即使注册接收成功通话,它可能仍然返回null,如果有对于意图过滤器没有持久广播。

我的方法是简单地用一个布尔值和try / catch块...

 私人布尔isReceiverRegistered;@覆盖
保护无效onResume(){
    super.onResume();
    如果(!isReceiverRegistered){
        registerReceiver(myReceiver,新的IntentFilter(...));
        isReceiverRegistered = TRUE;
    }
}@覆盖
保护无效的onPause(){
    super.onPause();
    如果(isReceiverRegistered){
        尝试{
            unregisterReceiver(myReceiver);
        }赶上(抛出:IllegalArgumentException五){
            // 没做什么
        }
        isReceiverRegistered = FALSE;
    }
}

I need to register a receiver. I have been using the following pattern:

@Override
protected void onResume() {
    super.onResume();
    registerReceiver(myReceiver, new IntentFilter(...));
}

@Override 
protected void onPause() {
    super.onPause();
    unregisterReceiver(myReceiver);
}

private BroadcastReceiver myReceiver = new BroadcastReceiver() {
    ...
});

I'm getting crash reports from marketplace about my unregisterReceiver() call:

java.lang.IllegalArgumentException: Receiver not registered

I thought this could not be possible, but it seems this is the correct pattern instead:

private Intent mIntent;

@Override
protected void onResume() {
    super.onResume();
    if (mIntent == null) {
        mIntent = registerReceiver(myReceiver, new IntentFilter(...));
    }
}

@Override 
protected void onPause() {
    super.onPause();
    if (mIntent != null) {
        unregisterReceiver(myReceiver);
        mIntent = null;
    }
}

private BroadcastReceiver myReceiver = new BroadcastReceiver() {
    ...
});

Is the above the correct pattern? I guess it's possible for registration to fail, and we have to keep the result from registerReceiver(), and check it in onPause() before making the call to unregister()?

Thanks


I am basing the change off of this question: Problem with BroadcastReceiver (Receiver not registered error)

I've only ever seen the first pattern above, never one where you check the intent response - any clarification would be great.

解决方案

Is the above the correct pattern?

No, this isn't necessarily going to work. From the docs for registerReceiver(...)...

Returns The first sticky intent found that matches filter, or null if there are none.

In other words even if the call to register the receiver is successful, it may still return null if there are no sticky broadcasts for that intent filter.

My approach would be to simply use a boolean and a try/catch block...

private boolean isReceiverRegistered;

@Override
protected void onResume() {
    super.onResume();
    if (!isReceiverRegistered) {
        registerReceiver(myReceiver, new IntentFilter(...));
        isReceiverRegistered = true;
    }
}

@Override 
protected void onPause() {
    super.onPause();
    if (isReceiverRegistered) {
        try {
            unregisterReceiver(myReceiver);
        } catch (IllegalArgumentException e) {
            // Do nothing
        }
        isReceiverRegistered = false;
    }
}

这篇关于注册一个接收器正确的模式呢?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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