0

画面がオンになると機内モードもオンになるように、放送受信機を登録しようとしています。登録したアクティビティにとどまっている限り機能しますが、アクティビティを離れるとすぐに機能しなくなります。Android マニフェストは静的なので使用できません。また、Android マニフェスト メソッドでは SCREEN_ON を使用できません。これは、Android が画面が起動したときに多くのことを実行することを望んでいないためです。 registerReceiver AFAIKを使用しています。

私の活動:-

public class WakeActivity extends Activity {

IntentFilter screenon = new IntentFilter("android.intent.action.SCREEN_ON");

//Skipped a bunch of code here to keep it relevant. Remember, the broadcast receiver
//does in fact work while I'm in the activity, so the problem isn't with
//the missing code here. Still, let me know if I'm missing something.

//The following method is called within onCreate()

protected void airplane(int i) {
    Screen_On screenon_airplane = new Screen_On();
    if (i == 0) {
        screenon_airplane.airplanei = 0;
        registerReceiver(screenon_airplane, screenon);
    } else if (i == 1) {
        screenon_airplane.airplanei = 1;
        registerReceiver(screenon_airplane, screenon);
    } else if (i == -1) {
        unregisterReceiver(screenon_airplane);
    }
}
}

私の放送受信機:-

public class Screen_On extends BroadcastReceiver {

public int airplanei;

@Override
public void onReceive(final Context context, Intent intent) {
    boolean isEnabled = Settings.System.getInt(
            context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON,
            0) == 1;
    if (airplanei == 0) {
        if (isEnabled != false) {
            Settings.System.putInt(context.getContentResolver(),
                    Settings.System.AIRPLANE_MODE_ON, 0);
            Intent turnplaneoff = new Intent(
                    Intent.ACTION_AIRPLANE_MODE_CHANGED);
            turnplaneoff.putExtra("state", 0);
            context.sendBroadcast(turnplaneoff);
        }
    } else if (airplanei == 1) {
        if (isEnabled == false) {
            Settings.System.putInt(context.getContentResolver(),
                    Settings.System.AIRPLANE_MODE_ON, 1);
            Intent turnplaneon = new Intent(
                    Intent.ACTION_AIRPLANE_MODE_CHANGED);
            turnplaneon.putExtra("state", 1);
            context.sendBroadcast(turnplaneon);
        }
    }
}
}

LogCat エラー:-

05-17 23:44:24.886: E/ActivityThread(2435): Activity com.dragonheart.autodroid.ActionActivities.WakeActivity has leaked IntentReceiver com.dragonheart.autodroid.BroadCastRecievers.Screen_On@414271b0 that was originally registered here. Are you missing a call to unregisterReceiver()?

このエラーは、Broadcast Receiver に onPause() または onDestroy() で何をすべきかを伝えていないことに関係している可能性がありますか?...一度登録すると、アクティビティに関係なく、登録を解除するまで機能すると思いました...

4

1 に答える 1

0

アクティビティが停止すると、ブロードキャストレシーバーがマニフェストを介して静的にではなくプログラムで登録されているため、ブロードキャストレシーバーが機能するかどうかはわかりません(Androidではそうできないため)。

コードが何をするのかを理解しようとしてあなたのコードを見てきましたが、それはほんの数行からでは簡単ではありません...

とにかく、リスナーを画面状態に登録するサービスを作成してみませんか? このようにして、アクティビティが停止した後でも、サービスは実行を停止しません。

また、サービスが画面のオン/オフを通知するたびに、メインアクティビティにメッセージを送信できます (ドキュメントを確認してください)。

LocalBroadcastReceiver の使用方法の例とともに、この前の質問を参照してください: LINK

于 2012-05-24T10:48:33.647 に答える