プログラムでAndroidデバイスがスリープ状態にならないようにするにはどうすればよいですか?


155

プログラムでAndroidデバイスがスリープ状態にならないようにするにはどうすればよいですか?

回答:


133

1つのオプションは、ウェイクロックを使用することです。ドキュメントの例:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
wl.acquire();

// screen and CPU will stay awake during this section

wl.release();

このページには、さまざまな種類のウェイクロックを説明する表もあります。

スリープ解除ロックを使用する場合は注意が必要です。release()それが終わったら(またはフォアグラウンドではなく)常にロックするようにしてください。そうしないと、アプリがバッテリーの消耗やCPUの使用に重大な影響を及ぼす可能性があります。

ドキュメントにはデバイスを起動状態に保つためのさまざまなアプローチと、いつ使用するかを説明する便利なページも含まれています。「デバイスがスリープ状態にならないようにする」が画面のみを指している(CPUをアクティブにしていない)場合、ウェイクロックはおそらく必要以上のものです。

このメソッドを使用するには、マニフェストにWAKE_LOCK権限が設定されていることも確認する必要があります。


21
このメソッドは現在非推奨であるため、これを使用することはできません。他の答えの1つを見てください。
DuKes0mE 2013

4
ウェイクロックを使用する理由はいくつかあります。たとえば、デバイスが特定のアプリ専用であり、最小化されていても実行する必要がある場合などです。
Muz

2
PowerManager.PARTIAL_WAKE_LOCKは廃止予定ではなく、最も効率的な方法だと思います。ユーザーは電源ボタンを押すことができますが、ユーザーがrelease()を呼び出すまでCPUは​​オンのままです。
Mansour Fahad 2014年

公式ドキュメントには、「デバイスがスリープ状態になる前に一部の作業を完了するためにCPUを実行し続ける必要がある場合は、ウェイクロックと呼ばれるPowerManagerシステムサービス機能を使用できます。」
Joaquin Iurchuk 2016

これは素晴らしい方法ですが、非推奨です。この回答を確認してください:stackoverflow.com/a/22447615/5327912
Parth Anjaria '

240

あなただけの特定のスリープモードを防ぎたい場合はView、単に呼び出すsetKeepScreenOn(true)ことでView設定するかkeepScreenOnにプロパティをtrue。これにより、が画面View上にあるときに画面が消えることを防ぎます。これには特別な許可は必要ありません。


18
また、これにより、アプリケーションの寿命が尽きるまで、電話機が強制的に起動状態にとどまることはありません。あなたはWakeLockでその問題に遭遇することができます。
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

2
はい、ほとんどの場合、これはより良いアプローチです。
エドワードフォーク

8
これが選択された答えです。シンプルでクリーンで、Androidが意図したとおりです。ありがとうございました。
Lior Iluz、2014年

2
「android:keepScreenOn = "true"を使用することは、FLAG_KEEP_SCREEN_ONを使用することと同じです。アクティビティにプログラムでフラグを設定する利点は、後でフラグをプログラムでクリアするオプションがあり、これにより、画面がオフになります。」- developer.android.com/training/scheduling/wakelock.html
Antonino

が表示されているsetKeepScreenOn(true)場合にのみ有効になることに注意してくださいView
ジェフT.

121

別の有効な解決策が見つかりました。次の行をアプリのonCreateイベントの下に追加します。

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

私のサンプルCordovaプロジェクトは次のようになります。

package com.apps.demo;
import android.os.Bundle;
import android.view.WindowManager;
import org.apache.cordova.*;

public class ScanManActivity extends DroidGap {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        super.loadUrl("http://stackoverflow.com");
    }
}

その後、私のアプリは開いている間はスリープ状態になりませんでした。回答がxSusに行くのをありがとう。


これは私の意見では最良の選択肢でした... +1
Amit

これはWitekの回答と同じです。唯一の違いは、これを「.xml」ファイルではなく「.java」ファイルに入れることです;-)
tiktak

許可はどうですか?許可が必要ですか?
Mehdi Khademloo

@Mehdi Khademlooそれは許可を必要としません。
Wessam El Mahdy、


17

以下のようにアクティビティのウィンドウにフラグを設定します

@Override public void onResume() {
 super.onResume();
 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

@Override public void onPause() {
 super.onPause();
 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

6

ルートシェル(adbシェルなど)から、次のようにロックできます。

echo mylockname >/sys/power/wake_lock    

その後、あなたがそうするまで、デバイスは起きたままになります:

echo mylockname >/sys/power/wake_unlock    

'mylockname'と同じ文字列を使用します。

これによって画面が黒くなるのを防ぐことはできませんが、CPUがスリープするのを防ぐことができます。

/ sys / power / wake_lockは、ユーザー無線(1001)とグループシステム(1000)、およびもちろんルートに対して読み取り/書き込みであることに注意してください。

参照はここにあります:http : //lwn.net/Articles/479841/


3

@eldarerathisが言ったことはすべての点で正しいです。ウェイクロックは、デバイスがスリープ状態にならないようにする正しい方法です。

私はあなたがする必要性をAPP WAHT知らないが、本当に重要であるあなたが必要なことを多くのため目を覚まし滞在する電話を強制していない、またはバッテリの寿命が非常に苦しむことになるように、あなたはどのように建築家にアプリ上で考えること。

イベントを起動して電話と(アプリ)をウェイクアップし、必要な操作を実行してから再びスリープ状態にする方法について、この本当に良い例紹介AlarmManagerします:アラームマネージャー(ソース:commonsware.com)


バッテリーを消耗させるためのユーティリティアプリがあります。一度は必要でした。基本的には、ウェイクロックを取得したり、狂ったように振動したり、懐中電灯をオンにしたり、明るさを上げたりすることになります。そのため、これを利用するアプリがあります。しかし、これはトピック外だったので、許してください
TheRealChx101

0

Xamarinユーザーの場合、これが解決策です。

   protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle); //always call superclass first

        this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);

        LoadApplication(new App());
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.