5

こんにちは私はアプリケーションを実行しているときに画面を永久に残すことができるようにサービスを使用してウォークロックを制御しようとしています。私はwakelockを作成し、onCreate()でそれを有効にしてonDestroy()で解放しますが、 "wlは解決できません"というエラーが表示されます。誰かがこれを乗り越える方法を説明することはできますか?以下のコード:サービスでのウォークロックの使用Android 1.5

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(); 
    } 
} 

答えて

5

あなたはonDestroyでライン

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

を()欠落していませんか?これはonCreate()のローカル変数ですが、onDestroy()では宣言されていません。

または、おそらく、ローカル変数ではなくWakeLockServiceクラスのフィールドにすることができます。

9

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

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

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

また、サービスを使用する場合、完全なスリープ解除ロックは、あなたが望むものではない可能性が高いですが、部分的なスリープ解除ロックがあります。あなたは、画面を維持する必要はありませんか?

申し訳ありませんが、私は上記の問題が原因で、ウェイクロックは実際には使用するのが複雑です。これは間違いなく高度なトピックであり、簡単に締め付けることができます。もしそうすれば、あなたのアプリは非常に醜いコメントを得るでしょう。長すぎるとバッテリーを消耗するので、長すぎることは大きな犯罪です。 これは間違った方法で行ってはいけませんが、ここに投稿した問題の性質(構文/コンパイラのエラー)を考慮して、サービスとウェイクロックのないソリューションを探すことを強くお勧めします。

+0

コメントありがとうございます。私が働いているアプリケーションでは、100%ウェイクモードになるために電話が必要なので、なぜ私はフルウェイクロックを使用したのですか? – Tom

+0

部分的なワockロックは、CPUの電源を入れてネットワークを使用するのに十分な大きさでなければなりません。 – Eno

+0

私からもありがとう。あなたの説明は簡潔であり、質問と回答を合わせたものよりも役に立ちます:) – Melllvar

関連する問題