6

こんにちは私は、アプリケーションの実行中に画面を永続的にオンのままにできるように、サービスを使用してウェイクロックを制御しようとしています。ウェイクロックを作成し、onCreate()でアクティブにして、onDestroy()で解放しますが、「wlcannotresolved」というエラーが発生します。誰かが私がこれを乗り越える方法を説明できますか?以下のコード:

public class WakeLockService extends Service {

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }  
    @Override
    public void onCreate() {
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag");
        wl.acquire();
    }
    @Override
    public void onDestroy() {
        wl.release();
    }
}
4

2 に答える 2

9

ええと、インスタンス変数を使用する場合でも、これはそれを行う方法ではないと思います。誰に電話するのdestroy()?私はあなたではないことを願っています、そうするのはOSの仕事です。destroy()ただし、ウェイクロックを保持している場合、OSが最初に他のアクティビティ/サービスを破棄するため、メソッドが呼び出される可能性はほとんどありません。

その上、メソッドでウェイクロックを取得するには遅すぎますonCreate()。に到達する前onCreate()に、アラームからサービスをトリガーしたときとバックグラウンドでのアクティビティからサービスをトリガーしたときは、電話がすでにスリープ状態になっている可能性があります。

あなたは多くの文脈を与えないので、あなたが異なって何を作るべきかを言うのは難しいです。イベントの通常のコースはこれです。ABroadcastReceiverが呼び出されonReceive()、ウェイクロックを取得してサービスの静的変数に入れます。サービスが完了すると、を呼び出しstopSelf()、ウェイクロックを解放してから、ロックへの参照を保持する静的変数をnullにする必要があります。

また、サービスを使用する場合、完全なウェイクロックは希望どおりではない可能性が非常に高くなりますが、部分的なウェイクロックは必要です。画面を表示したままにする必要はありませんよね?

申し訳ありませんが、上記の問題が原因で、ウェイクロックの使用は非常に複雑です。それは間違いなく高度なトピックであり、簡単に台無しになります。そうした場合、バッテリーを消耗するため、長時間保持することは重大な違反となるため、アプリは非常に醜いコメントを受け取ります。これを間違った方法で行わないでください。ただし、ここに投稿した問題の性質(構文/コンパイラエラー)を考慮すると、サービスとウェイクロックのない解決策を探すことを強くお勧めします。

于 2009-06-15T11:36:10.047 に答える
6

あなたはラインを逃していませんか

    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag");

onDestroy()で?これはonCreate()のローカル変数ですが、onDestroy()ではまったく宣言されていません。

または、より可能性が高いのは、ローカル変数ではなく、クラスWakeLockServiceのフィールドにすることです。

于 2009-06-14T10:03:50.813 に答える