Bir Android cihazın programlı olarak uyku moduna geçmesini nasıl önleyebilirim?


155

Bir Android cihazın programlı olarak uyku moduna geçmesini nasıl önleyebilirim?

Yanıtlar:


133

Bir seçenek bir uyandırma kilidi kullanmaktır . Dokümanlardan örnek:

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

Ayrıca bu sayfada bir tablo var farklı türdeki uyanıklıkları tanımlayan .

Uyandırma kilitleri kullanılırken dikkatli olunması gerektiğini unutmayın. Her zamanrelease() bittiğinde (ya da ön planda olmadığında) kilidin bulunduğundan . Aksi takdirde, uygulamanız ciddi pil boşalmasına ve CPU kullanımına neden olabilir.

Dokümantasyon ayrıca bir cihazı uyanık tutmaya yönelik farklı yaklaşımları ve ne zaman birini kullanmayı seçebileceğinizi açıklayan kullanışlı bir sayfa içerir . "Cihazın uyku moduna geçmesini önle" seçeneği yalnızca ekrana atıfta bulunuyorsa (ve CPU'yu aktif tutmuyorsanız), bir uyandırma kilidi muhtemelen ihtiyacınız olandan daha fazladır.

Ayrıca, bu yöntemi kullanabilmek için manifestinizde WAKE_LOCK iznine sahip olduğunuzdan emin olmanız gerekir .


21
Bu yöntem artık kullanımdan kaldırıldığı için bunu artık kullanmamalısınız. Diğer cevaplardan birine bir göz atın.
DuKes0mE

4
Cihaz belirli bir uygulamaya adanmışsa ve simge durumuna küçültüldüğünde bile çalışması gerekiyorsa, wakelocks kullanmanın hala bazı nedenleri vardır.
Muz

2
PowerManager.PARTIAL_WAKE_LOCK kullanımdan kaldırılmadı ve bence en etkili yöntem. Kullanıcının güç düğmesine basmasına izin verir, ancak kullanıcı çağrısı serbest bırakılıncaya kadar CPU yine de açılır ();
Mansour Fahad

Resmi Dokümantasyonda "Cihaz uyku moduna geçmeden önce bazı işleri tamamlamak için CPU'yu çalışır durumda tutmanız gerekiyorsa, uyandırma kilitleri adı verilen bir PowerManager sistem hizmeti özelliğini kullanabilirsiniz."
Joaquin Iurchuk

Bu harika bir yol, ancak kullanımdan kaldırıldı. lütfen bu yanıtı kontrol edin: stackoverflow.com/a/22447615/5327912
Parth Anjaria

240

Sadece belirli bir modda uyku modunu önlemek istiyorsanız , bunu Viewarayın veya özelliği olarak ayarlayın . Bu, ekrandayken ekranın kapanmasını önleyecektir . Bunun için özel bir izin gerekmez.setKeepScreenOn(true)ViewkeepScreenOntrueView


18
Ayrıca bu, uygulamanın kullanım ömrü dışında uyanık kalması için telefonu zorlamaz. WakeLock ile bu sorunla karşılaşabilirsiniz.
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

2
Evet, çoğu durumda, bu daha iyi bir yaklaşımdır.
Edward Falk

8
Bu seçilen cevap olmalıdır. Basit, temiz ve Android amaçlandığı gibi. Teşekkür ederim.
Lior Iluz

2
"Android: keepScreenOn =" true ", FLAG_KEEP_SCREEN_ON kullanmaya eşdeğerdir. Uygulamanız için en uygun yaklaşımı kullanabilirsiniz. Etkinliğinizde bayrağı programlı olarak ayarlamanın avantajı, bayrağı daha sonra programlı olarak silme seçeneği sunmasıdır. böylece ekranın kapanmasına izin verir "- developer.android.com/training/scheduling/wakelock.html
Antonino

setKeepScreenOn(true)Yalnızca Viewgörünür olduğunda etkili olacağını unutmayın .
Jeff T.

121

Başka bir çalışma çözümü buldum: onCreate etkinliği altında uygulamanıza aşağıdaki satırı ekleyin.

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

Örnek Cordova projem şöyle görünüyor:

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

Bundan sonra, uygulamam açıkken uykuya geçmezdi. Cevap için teşekkürler xSus.


Bu bence en iyi
seçimdi

Bu, Witek yanıtıyla aynı şeyi yapar, tek fark, bunu bir ".xml" yerine bir ".java" dosyasına
koymanızdır

İzin nasıl? İzin gerekli mi?
Mehdi Khademloo

@Mehdi Khademloo'nun izne ihtiyacı yok.
Wessam El Mahdy


17

Etkinlik Penceresinde bayrakları aşağıdaki gibi ayarlayın

@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

Kök kabuğundan (örneğin adb kabuğu) aşağıdakilerle kilitleyebilirsiniz:

echo mylockname >/sys/power/wake_lock    

Bundan sonra, cihaz siz uyanana kadar uyanık kalacaktır:

echo mylockname >/sys/power/wake_unlock    

'Mylockname' için aynı dize ile.

Bunun ekranın kararmasını engellemeyeceğini, ancak CPU'nun uyumasını engelleyeceğini unutmayın.

/ Sys / power / wake_lock öğesinin kullanıcı radyosu (1001) ve grup sistemi (1000) ve elbette kök için okuma-yazma olduğunu unutmayın.

Bir referans burada: http://lwn.net/Articles/479841/


3

@eldarerathis'in söylediği her yönüyle doğrudur, uyandırma kilidi, cihazın uykuya geçmesini önlemenin doğru yoludur.

Uygulamanın ne yapması gerektiğini bilmiyorum ama uygulamanızı nasıl tasarladığınızı düşünmeniz gerçekten önemli , böylece telefonu ihtiyacınız olandan daha fazla uyanık kalmaya zorlamıyorsunuz, yoksa pil ömrü çok fazla acı çekiyor.

Size, olayları tetiklemek ve telefonunuzu ve (uygulamanızı) yapmanız gerekenleri gerçekleştirmek ve sonra tekrar uykuya dalmak için nasıl kullanacağınıza dair iyi bir örneğe işaret ederim AlarmManager: Alarm Manager (kaynak: commonsware.com)


Bataryayı boşaltmak için özel olarak ve amaçlı olarak tasarlanmış yardımcı uygulamalar vardır. Bir kereye ihtiyacım vardı. Temelde wakelocks kazanır, deli gibi titreşir, el fenerini açar, parlaklığı arttırır, vb. Evet, bunu kullanan uygulamalar var. Ama bu konu dışı beni çok affet
TheRealChx101 16:19

0

Bir Xamarin kullanıcısıysanız, çözüm budur:

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

        this.Window.AddFlags(WindowManagerFlags.KeepScreenOn);

        LoadApplication(new App());
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.