7

そこで、ロック画面の代わりとして機能するアプリを作成しました。私は放送受信機とサービスを使用して、後に活動を開始しIntent.ACTION_SCREEN_OFFます。そのため、ユーザーが画面をロックするたびにアクティビティが開始され、ユーザーがロック解除ボタンを押すと、アクティビティはすでにロック画面上で実行されています。ただし、これは、ユーザーが短時間後に電話をスリープ解除/ロック解除しようとした場合にのみ機能します。彼らがあまりにも長く待つならば、活動は消えました。なぜこれが起こっているのか、ユーザーが電話のロックを解除しようとするのをどれだけ待っても、そこでアクティビティを維持するために何ができるのかわかりません。

考えて聞いてみましIntent.ACTION_SCREEN_ONたが、ユーザーがスマートフォンの電源ボタンを押してスリープ解除してから、アプリが読み込まれて画面に表示されるまでに時間がかかります。このギャップの間、ユーザーはAndroidOSを見ることができます

4

2 に答える 2

4

ウェイクロックを使用するとどうなりますか。例えば:

@Override
public void onCreate(Bundle savedInstanceState) { 
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
    wl.acquire();
    // do your things, even when screen is off
}


@Override
protected void onDestroy() {
    wl.release();
}

wakelock権限も必要ですAndroidManifest.xml

uses-permission android:name="android.permission.WAKE_LOCK"
于 2012-07-18T16:35:55.027 に答える
1

試してみたい方法の1つは、アプリがスリープしないようにすることです。短い睡眠では、それは実行され続けます。長い睡眠では、アプリ自体が眠っています。PowerManager.Wakelockを使用して、これを自分で回避することができました。唯一の問題は、アプリがCPUサイクルを使用している場合、これによりバッテリーの消耗が増えることです。

/** wake lock on the app so it continues to run in background if phone tries to sleep.*/
PowerManager.WakeLock wakeLock;

@Override
public void onCreate(Bundle savedInstanceState) {
    ...

    // keep the program running even if phone screen and keyboard go to sleep
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);

    ...
}

// use this when screen sleeps
wakeLock.acquire();

// use this once when phone stops sleeping
wakeLock.release();
于 2012-07-18T16:38:51.657 に答える