Cihazı uyanık tutma

Boşta bırakılmış bir Android cihaz, pilin boşalmasını önlemek için hızlı bir şekilde uykuya geçer. Bununla birlikte, bir uygulamanın bazı işleri tamamlamak için ekranı veya CPU'yu uyanık tutması gerektiği durumlar da vardır.

İzleyeceğiniz yaklaşım, uygulamanızın ihtiyaçlarına bağlıdır. Ancak genel kural olarak uygulamanızın sistem kaynakları üzerindeki etkisini en aza indirmek için uygulamanız için mümkün olan en hafif yaklaşımı kullanmanız gerekir. Aşağıdaki bölümlerde, cihazın varsayılan uyku davranışının uygulamanızın gereksinimleriyle uyumsuz olduğu durumların nasıl ele alınacağı açıklanmaktadır.

Uyanık kalma kilitlerini kullanmaya alternatifler

Uygulamanıza uyanık kalma kilidi desteği eklemeden önce, uygulamanızın kullanım alanlarının aşağıdaki alternatif çözümlerden birini destekleyip desteklemediğini düşünün:

  • Uygulamanız uzun süreli HTTP indirmeleri gerçekleştiriyorsa DownloadManager kullanmayı düşünün.

  • Uygulamanız harici bir sunucudaki verileri senkronize ediyorsa bir senkronizasyon bağdaştırıcısı oluşturmayı deneyin.

  • Uygulamanız arka plan hizmetlerinden yararlanıyorsa bu hizmetleri belirli aralıklarla tetiklemek için JobScheduler veya Firebase Cloud Messaging'i kullanabilirsiniz.

  • Tamamlayıcı cihaz aralık dahilinde olduğunda tamamlayıcı uygulamanızın çalışmaya devam etmesi gerekiyorsa Companion Device Manager'ı kullanın.

Ekranı açık tutun

Oyun veya film uygulamaları gibi bazı uygulamaların ekranı açık tutması gerekir. Bunu yapmanın en iyi yolu, FLAG_KEEP_SCREEN_ON öğesini etkinliğinizde kullanmaktır (yalnızca bir etkinlikte, hiçbir zaman hizmette veya başka bir uygulama bileşeninde kullanmayın). Örneğin:

Kotlin

class MainActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
    }
}

Java

public class MainActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  }
}

Bu yaklaşımın avantajı, uyanık kalma kilitlerinden farklı olarak (CPU'yu Açık Tut bölümünde anlatılmıştır), özel bir izin gerektirmemesidir ve platformun, kullanılmayan kaynakları serbest bırakma konusunda uygulamanızın endişelenmesine gerek kalmadan, uygulamalar arasında hareket eden kullanıcıları doğru şekilde yönetmesi gerekir.

Bunu uygulamanın diğer bir yolu, android:keepScreenOn özelliğini kullanarak uygulamanızın düzen XML dosyasına eklemektir:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true">
    ...
</RelativeLayout>

android:keepScreenOn="true" kullanımı, FLAG_KEEP_SCREEN_ON kullanımına eş değerdir. Uygulamanız için en iyi yaklaşımı kullanabilirsiniz. Etkinliğinizde işareti programatik olarak ayarlamanın avantajı, size daha sonra bayrağı programlı bir şekilde silme ve böylece ekranın kapanmasına olanak tanıma seçeneği sunmasıdır.

TV için Ambiyans Modu

TV'de, aktif video oynatma sırasında cihazın Ambiyans Modu'na geçmesini önlemek için FLAG_KEEP_SCREEN_ON kullanılmalıdır. FLAG_KEEP_SCREEN_ON, ön plan etkinliği tarafından ayarlanmazsa cihaz, bir süre işlem yapılmadığında otomatik olarak Ambiyans Modu'na girer.

CPU'yu açık tutun

Cihaz uyku moduna geçmeden önce bazı işleri tamamlamak için CPU'yu çalışır durumda tutmanız gerekiyorsa uyanık kalma kilitleri adlı bir PowerManager sistem hizmeti özelliğini kullanabilirsiniz. Uyanık kalma kilitleri, uygulamanızın ana makine cihazının güç durumunu kontrol etmesine olanak tanır.

Uyanık kalma kilitleri oluşturup basılı tutmak, ana cihazın pil ömrünü önemli ölçüde etkileyebilir. Bu nedenle, uyanık kalma kilitlerini yalnızca kesinlikle gerekli olduğunda kullanmalı ve mümkün olduğunca kısa bir süre tutmalısınız. Örneğin, bir etkinlikte hiçbir zaman uyanık kalma kilidi kullanmanız gerekmemelidir. Yukarıda açıklandığı gibi, etkinliğinizde ekranı açık tutmak istiyorsanız FLAG_KEEP_SCREEN_ON özelliğini kullanın.

Uyanık kalma kilidi kullanmanın geçerli bir örneği, ekran kapalıyken CPU'nun çalışmak için çalışmaya devam etmesi için uyanık kalma kilidini tutması gereken bir arka plan hizmeti olabilir. Yine de bu uygulama, pil ömrü üzerindeki etkisinden dolayı en aza indirilmelidir.

Uyanık kalma kilidi kullanmak için ilk adım, uygulamanızın manifest dosyasına WAKE_LOCK iznini eklemektir:

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

Uygulamanızda bazı işler için bir hizmetten yararlanan yayın alıcısı varsa doğrudan uyanık kalma kilidini şu şekilde ayarlayabilirsiniz:

Kotlin

val wakeLock: PowerManager.WakeLock =
        (getSystemService(Context.POWER_SERVICE) as PowerManager).run {
            newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag").apply {
                acquire()
            }
        }

Java

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
        "MyApp::MyWakelockTag");
wakeLock.acquire();

Uyanık kalma kilidini açmak için wakelock.release() numarasını arayın. Bu, CPU'daki hak talebinizi serbest bırakır. Pilin boşalmasını önlemek için uygulamanız tarafından biter bitmez bir uyanık kalma kilidini serbest bırakmanız önemlidir.