Menjaga perangkat tetap aktif

Agar baterai tidak habis, perangkat Android yang tidak ada aktivitas dalam waktu singkat akan tidur. Namun, ada kalanya aplikasi perlu mengaktifkan layar atau CPU dan menjaganya tetap aktif guna menyelesaikan beberapa tugas.

Pendekatan yang Anda ambil bergantung pada kebutuhan aplikasi. Namun, aturan praktis umumnya adalah Anda harus menggunakan pendekatan yang paling ringan untuk aplikasi Anda, untuk meminimalkan dampak aplikasi terhadap resource sistem. Bagian berikut menjelaskan cara menangani kasus saat perilaku tidur default perangkat tidak kompatibel dengan persyaratan aplikasi Anda.

Cara alternatif untuk menggunakan fitur penguncian layar saat aktif

Sebelum menambahkan dukungan penguncian layar saat aktif ke aplikasi, pertimbangkan apakah kasus penggunaan aplikasi mendukung salah satu solusi alternatif berikut:

  • Jika aplikasi Anda melakukan download HTTP yang berjalan lama, sebaiknya gunakan DownloadManager.

  • Jika aplikasi Anda menyinkronkan data dari server eksternal, pertimbangkan untuk membuat adaptor sinkronisasi.

  • Jika aplikasi Anda mengandalkan layanan latar belakang, pertimbangkan untuk menggunakan JobScheduler atau Firebase Cloud Messaging untuk memicu layanan ini pada interval tertentu.

  • Jika Anda ingin aplikasi pendamping tetap berjalan setiap kali perangkat pendamping berada dalam jangkauan, gunakan Pengelola Perangkat Pendamping.

Menjaga layar agar tetap aktif

Aplikasi tertentu harus menjaga layar agar tetap aktif, seperti aplikasi film atau game. Cara terbaik untuk melakukannya adalah dengan menggunakan FLAG_KEEP_SCREEN_ON dalam aktivitas Anda (dan hanya dalam aktivitas, tidak pernah dalam layanan atau komponen aplikasi lainnya). Contoh:

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

Keuntungan dari pendekatan ini adalah tidak seperti penguncian layar saat aktif (dibahas dalam Menjaga CPU Aktif), pendekatan ini tidak memerlukan izin khusus, dan platform mengelola perpindahan pengguna antar-aplikasi dengan benar, tanpa aplikasi Anda perlu mengkhawatirkan melepaskan resource yang tidak digunakan.

Cara lain untuk menerapkannya adalah dalam file XML tata letak aplikasi Anda, dengan menggunakan atribut android:keepScreenOn:

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

Menggunakan android:keepScreenOn="true" sama dengan menggunakan FLAG_KEEP_SCREEN_ON. Anda dapat menggunakan pendekatan mana pun yang terbaik untuk aplikasi Anda. Keuntungan menyetel flag secara terprogram dalam aktivitas adalah Anda akan memiliki opsi untuk menghapus flag secara terprogram nanti sehingga memungkinkan layar nonaktif.

Mode Standby untuk TV

Di TV, FLAG_KEEP_SCREEN_ON harus digunakan untuk mencegah perangkat masuk ke Mode Standby selama pemutaran video aktif. Jika FLAG_KEEP_SCREEN_ON tidak ditetapkan oleh aktivitas latar depan, perangkat akan otomatis memasuki Mode Standby setelah periode tidak aktif.

Menjaga CPU agar tetap aktif

Jika perlu menjaga CPU tetap berjalan untuk menyelesaikan beberapa tugas sebelum perangkat beralih ke mode tidur, Anda dapat menggunakan fitur layanan sistem PowerManager yang disebut penguncian layar saat aktif. Penguncian layar saat aktif memungkinkan aplikasi mengontrol status daya perangkat host.

Membuat dan menyimpan penguncian layar saat aktif dapat memiliki dampak yang besar terhadap masa pakai baterai perangkat host. Oleh karena itu, sebaiknya gunakan penguncian layar saat aktif hanya jika benar-benar diperlukan dan pegang kunci layar ini dalam waktu sesingkat mungkin. Misalnya, Anda tidak perlu menggunakan penguncian layar saat aktif dalam aktivitas. Seperti yang dijelaskan di atas, jika Anda ingin agar layar tetap aktif dalam aktivitas Anda, gunakan FLAG_KEEP_SCREEN_ON.

Salah satu kasus yang sah untuk menggunakan penguncian layar saat aktif mungkin adalah layanan latar belakang yang perlu mengambil penguncian layar saat aktif agar CPU tetap berjalan agar dapat melakukan pekerjaan saat layar nonaktif. Sekali lagi, praktik ini harus diminimalkan karena dampaknya terhadap masa pakai baterai.

Untuk menggunakan penguncian layar saat aktif, langkah pertama adalah menambahkan izin WAKE_LOCK ke file manifes aplikasi:

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

Jika aplikasi Anda menyertakan penerima siaran yang menggunakan layanan untuk melakukan beberapa pekerjaan, berikut cara menyetel penguncian layar saat aktif secara langsung:

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

Untuk melepaskan penguncian layar saat aktif, panggil wakelock.release(). Tindakan ini akan melepaskan klaim Anda terhadap CPU. Penting untuk melepaskan penguncian layar saat aktif segera setelah aplikasi selesai menggunakannya agar baterai tidak habis.