0

すべてのアクティビティに電源の状態に関する知識を持たせたい:充電器が接続されていますか?ACTION_POWER_CONNECTED登録された受信者がまたはを受信するACTION_POWER_DISCONNECTEDと、アクティビティへのコールバックが行われ、登録されたアクティビティに通知されます。アプリケーションの一部であるすべてのアクティビティが必要であり、このコールバックメソッドを使用するため、アクティビティを強制的に実装するインターフェイスを作成しましたpowerDisconnected()powerConnected();

public interface BrightnessActivityInterface {
    void powerDisconnected();
    void powerConnected();
}

私のアクティビティはすべて同じタイプのコードを使用しているため(たとえば、接続されている場合は画面がオンで明るいロック、電源が切断されている場合は画面が暗くなる)、を拡張しclass Activityて実装しましたBrightnessActivityInterface

public class BrightnessActivity extends Activity implements BrightnessActivityInterface {

    private ChargingOffReceiver chargingOff;
    private ChargingOnReceiver chargingOn;

    public BrightnessActivity(){
        chargingOn = new ChargingOnReceiver(this);
        registerReceiver(chargingOn, new IntentFilter(Intent.ACTION_POWER_CONNECTED));


        chargingOff = new ChargingOffReceiver(this);
        registerReceiver(chargingOff, new IntentFilter(Intent.ACTION_POWER_DISCONNECTED));
    }


    @Override
    public void onResume() {
        super.onResume();
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    }

    @Override
    public void onPause() {
        super.onPause();
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }

    public void powerDisconnected() {
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }

    public void powerConnected() {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    }

私のすべてのアクティビティは、ActivityではなくこのBrightnessActivityを拡張します。これまでのところすべて良さそうですか?

問題は、私が開始する最初のアクティビティです。行の直後にnullpointerが表示されます。

 registerReceiver(chargingOn, new IntentFilter(Intent.ACTION_POWER_CONNECTED));

'this'には値があり(これは私の起動アクティビティです)、chargeingOnはChargingOnReceiverです。ソースをインストールしましたが、何を見ているのかわかりません。

私のクラスにはに登録する権利があり、Activityの代わりにACTION_POWER_CONNECTEDすべてのクラスを派生させるまでは正常に機能しました。BrightnessActivityご意見をお聞かせください。

4

2 に答える 2

1

デフォルトのActivityコンストラクターをオーバーライドしないでください。コードをオーバーライドされたonCreate()メソッドに移動します。

于 2012-12-06T09:38:27.690 に答える
0

レシーバーをonCreateに登録し、登録を解除する必要がありますonPause

API:onRegisterReceiver API

「このクラスのインスタンスをContext.registerReceiver()に動的に登録するか、AndroidManifest.xmlのタグを介して実装を静的に公開できます。注:Activity.onResume()実装にレシーバーを登録する場合は、登録を解除する必要があります。 Activity.onPause()で(一時停止したときにインテントを受信しないため、不要なシステムオーバーヘッドが削減されます)。Activity.onSaveInstanceState()で登録を解除しないでください。」

コンストラクターの後でアクティビティが「準備完了」状態にならない理由がわからない場合は、アクティビティライフサイクルを読む必要があります。

于 2012-12-06T09:36:56.497 に答える