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

前端之家收集整理的这篇文章主要介绍了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;
    }
}
原文链接:https://www.f2er.com/android/314442.html

猜你在找的Android相关文章