繁体   English   中英

Android - BroadcastReceiver unregisterReceiver问题(未注册)

[英]Android - BroadcastReceiver unregisterReceiver issue (not registered)

我在取消注册BroadcastReceiver遇到了一些问题。 我首先注册它,但是当我想通过使用unregisterReceiver();取消注册它时unregisterReceiver(); 命令给了我很多错误。 错误说我没有注册我的BroadcastReceiver

码:

public class Receiver extends BroadcastReceiver implements Variables {

    CheckConexion cc;

    @Override
    public void onReceive(Context contxt, Intent intent) {

        // Cuando hay un evento, lo diferenciamos y hacemos una acción.

        if (intent.getAction().equals(SMS_RECEIVED)) {
            Sms sms = new Sms(null, contxt);
            sms.uploadNewSms(intent);
        } else if (intent.getAction().equals(Intent.ACTION_BATTERY_LOW)) {
            // st.batterylow(contxt);
        } else if (intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)) {
            // st.power(1, contxt);
        } else if (intent.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)) {
            // st.power(0, contxt);
        } else if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)
                || intent.getAction().equals(Intent.ACTION_PACKAGE_CHANGED)
                || intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)) {
            Database db = new Database(contxt);
            if (db.open().Preferences(4)) {
                Uri data = intent.getData();
                new ListApps(contxt).import_app(intent, contxt, data,
                        intent.getAction());
            }
            db.close();
        } else if (intent.getAction().equals(
                ConnectivityManager.CONNECTIVITY_ACTION)) {
            cc = new CheckConexion(contxt);
            if (cc.isOnline()) {

                /*Database db = new Database(contxt);
                db.open();
                if (db.move() == 1) {
                    new UploadOffline(contxt);
                }
                db.close();*/

            }
        }

    }

    public void register(Context c) {
        Receiver r = new Receiver();
        IntentFilter i = new IntentFilter();
        i.addAction(SMS_RECEIVED);
        i.addAction(Intent.ACTION_BATTERY_LOW);
        i.addAction(Intent.ACTION_POWER_CONNECTED);
        i.addAction(Intent.ACTION_POWER_DISCONNECTED);
        i.addAction(Intent.ACTION_CALL_BUTTON);
        i.addAction(Intent.ACTION_CAMERA_BUTTON);
        i.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        c.registerReceiver(r, i);
        IntentFilter apps = new IntentFilter();
        apps.addAction(Intent.ACTION_PACKAGE_ADDED);
        apps.addAction(Intent.ACTION_PACKAGE_CHANGED);
        apps.addAction(Intent.ACTION_PACKAGE_REMOVED);
        apps.addDataScheme("package");
        c.registerReceiver(r, apps);
    }

    public void unregister(Context c) {
        BroadcastReceiver r = new Receiver();
        if (r != null) {
            c.unregisterReceiver(r);
        }
    }
}

首先,

使用来处理类Reciever的对象

删除所有r对象,不要在扩展类中调用构造函数。

然后:

限定

boolean isRegistered = false;

在您的注册方法中:

c.registerReceiver(this);
isRegistered = true;

在取消注册方法中:

if (isRegistered) {
    c.unregisterReceiver(this);
    isRegistered = false;
}

然后在您的活动中使用Reciver的 实例

希望,这很有帮助!

最好的解决方案是将unregisterReceiver方法放入try catch块。

try {
    this.unregisterReceiver(myReceiver);
}
catch (final Exception exception) {
    // The receiver was not registered.
    // There is nothing to do in that case.
    // Everything is fine.
}

不幸的是,当unregisterReceiver失败时,没有抛出特定的异常,所以你必须使用Exception 此外,遗憾的是没有像isReceiverRegistered(BroadcastReceiver receiver)这样的方法,在我看来这将是对Android API的增强。

此外,看看ReceiverLifecycle也不会有什么坏处

您无法取消注册广播Receiver的新实例。 您将需要使用已注册的BroadcastReciever的相同实例。

所以使用

 c.registerReceiver(this, apps);

 c.unregisterReceiver(this);

在取消注册方法中,您正在创建新的BroadcastReceiver实例并取消注册该实例。 而是使register方法中的实例全局并调用

if (r != null) {
        c.unregisterReceiver(r);
        r = null;
 }

在取消注册方法中。

暂无
暂无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM