6

私のアプリでは、メインアクティビティのonCreate()メソッドで、ウェイクロックを作成しています。これにより、電話がスタンバイ状態になった場合や画面がオフになった場合でもCPUが実行され続けます。

また、onCreateメソッドでは、加速度計を使用するサービスを作成するつもりです。このサービスは、アプリが開いていて加速度計の値を監視している間、継続的に実行する必要があります(これはバッテリーには適していないことはわかっていますが、それを行うために必要です)。これが現時点での私のコードで、サービスは正常に開始されます。

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);  

        PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Howaya");
        wl.acquire();

        if (appStart == true)  
        { 
            Intent AccelService = new Intent(this, Accelerometer.class);
            AccelService.putExtra("unreg", false);
            startService(AccelService);
        }
        appStart = false;
  }

マニフェストに次の権限が設定されています-

<uses-permission android:name="android.permission.WAKE_LOCK" />

私はさまざまなロックでこれを試しました-薄暗い画面と完全な明るさも役に立ちません。logcatの私の出力はここにあります-

F/PowerManager(15628): android.util.Log$TerribleFailure: WakeLock finalized while still held: Howaya
F/PowerManager(15628):  at android.util.Log.wtf(Log.java:260)
F/PowerManager(15628):  at android.util.Log.wtf(Log.java:239)
F/PowerManager(15628):  at android.os.PowerManager$WakeLock.finalize(PowerManager.java:329)
F/PowerManager(15628):  at dalvik.system.NativeStart.run(Native Method)

このリンクのグーグルスタンバイエラーページのように、部分的なウェイクロックが期待どおりに機能しないと言う人を見たことがありますが、これは昨年リリースされて閉じられたので、その場合はわかりませんが、誰かがここで助けてくれますか?その最後の点に関してもHTCの欲求があります、ありがとう。

4

3 に答える 3

9

WakeLockオブジェクトがOnCreateメソッド内のローカルスコープ変数であるため、問題が発生します。メソッドが実行された後(WakeLockオブジェクトは参照されなくなります)、ガベージコレクションの対象になります。Dalvik GCが発生した場合(オブジェクトはファイナライズの準備ができています)、ファイナライザーの内部コードは、WakeLockがまだ保持されておりアクティブであると警告しますが、GCされます。新しいWakeLockオブジェクトを取得し、アクティビティ派生クラスのクラスタイプWakeLockのフィールドに割り当てる必要があります。オブジェクト指向プログラミングとガベージコレクターについて読む-あなたは問題を理解するでしょう。

于 2011-03-29T20:03:23.983 に答える
2

私のアプリでは、メインアクティビティのonCreate()メソッドで、ウェイクロックを作成しています。これにより、電話がスタンバイ状態になった場合や画面がオフになった場合でもCPUが実行され続けます。

android:keepScreenOn代わりに、レイアウト内のウィジェットの1つで使用してください。これは、を手動で処理するよりもはるかに安全ですWakeLockWAKE_LOCKさらに、IIRCの許可は必要ありません。

logcatの私の出力はここにあります

このエラーは、を解放しないためですWakeLock。漏れないでくださいWakeLocks

さて、あなたはなんとかこの散文のすべてを書き、これらのリストのすべてを含めることができました、そしてあなたは一つの小さなことを忘れました:あなたの質問が何であるかを実際に私たちに伝えます。これは、StackOverflowのような質疑応答サイトにとってかなり重要なアイテムです。そして、いや、「誰かがここで助けてくれませんか?」受けようとしている「ヘルプ」を定義しない場合は、質問としてカウントされません。

于 2011-02-19T17:33:26.520 に答える
0

@Michal Pが言ったように、onCreateメソッドでウェイクロックを取得しますが、それを解放することはありません。

このゼロ参照オブジェクトをGCスキャンするときは、デフォルトのfinalizeメソッドを呼び出しますが、実際にはアクティブです。

  @Override
    protected void finalize() throws Throwable {
        synchronized (mToken) {
            if (mHeld) {
                Log.wtf(TAG, "WakeLock finalized while still held: " + mTag);
                Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, mTraceName, 0);
                try {
                    mService.releaseWakeLock(mToken, 0);
                } catch (RemoteException e) {
                }
            }
        }
    }
于 2017-04-06T07:34:27.313 に答える