android – 注册接收器的正确模式?

我需要注册一个接收器.我一直在使用以下模式:
@Override
protected void onResume() {
    super.onResume();
    registerReceiver(myReceiver,new IntentFilter(...));
}

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

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

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

java.lang.IllegalArgumentException: Receiver not registered

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

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

以上是正确的模式吗?我想注册失败是可能的,我们必须保留registerReceiver()的结果,并在调用unregister()之前在onPause()中检查它?

谢谢

我基于这个问题的改变:
Problem with BroadcastReceiver (Receiver not registered error)

我只见过上面的第一个模式,从来没有看到你检查意图反应的地方 – 任何澄清都会很棒.

解决方法

Is the above the correct pattern?

不,这不一定能奏效.来自registerReceiver(…)的文档……

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

换句话说,即使注册接收器的调用成功,如果该意图过滤器没有粘性广播,它仍然可以返回null.

我的方法是简单地使用布尔值和try / catch块…

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

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...