0

CWACウェイクフル ライブラリのWakefileIntentService.javaでは、コードに次のものが含まれています。

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    PowerManager.WakeLock lock = getLock(this.getApplicationContext());
    if (!lock.isHeld() || (flags & START_FLAG_REDELIVERY) != 0) {
        lock.acquire();
    }
    super.onStartCommand(intent, flags, startId);
    return(START_REDELIVER_INTENT);
}

コードがチェックする理由START_FLAG_REDELIVERY- 次のシナリオを妨げるものは何ですか?

  1. onStartCommand()が呼び出され、ロックが取得されます。
  2. システムは完了する前にサービスを強制終了します。
  3. システムは でインテントを再配信し、すでに保持されているロックでSTART_FLAG_REDELIVERY別の呼び出しを引き起こします。acquire()
  4. サービスが完了し、release()1 回呼び出されます。
  5. 参照カウント ロックは、2 回取得されたが解放されたのは 1 回だけであるため、永久に保持されます。
4

3 に答える 3

1

サービスが強制終了された場合、その実行中のプロセスは終了し、後で再起動するとロックは保持されなくなります。このスニピットでは、ロックが静的変数に保持されていることがわかります。

synchronized private static PowerManager.WakeLock getLock(Context context) {
    if (lockStatic == null) {
      PowerManager mgr=
          (PowerManager)context.getSystemService(Context.POWER_SERVICE);

      lockStatic=mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, NAME);
      lockStatic.setReferenceCounted(true);
    }

    return(lockStatic);
  }

https://groups.google.com/forum/?fromgroups=#!topic/android-developers/w8BdsI1BVdA

于 2013-02-04T04:52:53.453 に答える
0

次のシナリオを妨げるものは何ですか?

あなたのシナリオは、Android がサービスを終了し、WakeLock未解決のままになることを意味します。これが発生するシナリオは認識していません。AndroidはサービスではなくプロセスWakeLockを終了します。その時点で取得したものを解放するのは OS の責任です。

START_FLAG_RETRY が処理されていないため、奇妙に思えます。そのために問題https://github.com/commonsguy/cwac-wakeful/issues/10を開きました。

その号で指摘したように、START_FLAG_REDELIVERYまともなドキュメントがありますが、そうでSTART_FLAG_RETRYはありません。いつ使われるかわかりません。WakeLockこれらの文書化されていない原因に基づいて、 の状態がどうなるかはわかりません。などなど。CPU の電源を無期限にオンにしておくよりも、偶発的な偶発的なスリープの危険を冒す方がはるかに優れています。

于 2013-02-07T00:36:16.427 に答える
0

プロセスが強制終了された後にロックを再取得することを目的としているようですが、別のインテントサービスがすでにロックを使用して実行されている場合、 sendWakefulWork() からの元のロック以降、再配信されたインテントの参照カウントを増やす必要があります。古いプロセスではもう存在しません。

START_FLAG_RETRY が処理されていないため、奇妙に思えます。そのために問題https://github.com/commonsguy/cwac-wakeful/issues/10を開きました。

于 2013-02-05T09:46:17.703 に答える