7

の登録を解除する際に問題が発生していBroadcastReceiverます。最初に登録していますが、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);
        }
    }
}
4

4 に答える 4

7

初めに、

これを使用して、クラス Recieverのオブジェクトを操作します

すべてのrオブジェクトを削除し、拡張クラスでコンストラクターを呼び出さないでください。

それで:

定義

boolean isRegistered = false;

あなたの登録方法で:

c.registerReceiver(this);
isRegistered = true;

登録解除方法で:

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

次に、アクティビティでクラスReciverのインスタンスを使用します。

希望、役に立ちました!

于 2012-09-14T09:36:01.727 に答える
6

最善の解決策は、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を見て損はありません。

于 2015-07-07T18:08:50.933 に答える
4

ブロードキャスト レシーバーの新しいインスタンスを登録解除することはできません。登録されている BroadcastReciever の同じインスタンスを使用する必要があります。

だから使う

 c.registerReceiver(this, apps);

 c.unregisterReceiver(this);
于 2012-09-14T09:20:29.203 に答える
0

unregisterメソッドでは、新しいBroadcastReceiverインスタンスを作成し、それを登録解除します。代わりに、registerメソッドのインスタンスをグローバルにして呼び出します

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

登録解除方法で。

于 2012-09-14T09:23:35.443 に答える