page.title=Optimalisasi Latar Belakang page.metaDescription=Pembatasan baru pada siaran implisit. page.keywords="android N", "implicit broadcasts", "job scheduler" page.image=images/cards/card-nyc_2x.jpg @jd:body
Proses latar belakang bisa menguras memori dan baterai. Misalnya, sebuah siaran implisit dapat memulai banyak proses latar belakang yang telah didaftarkan untuk mendengarkannya, sekalipun proses-proses itu mungkin tidak melakukan banyak pekerjaan. Hal ini bisa berdampak besar pada kinerja perangkat dan pengalaman pengguna.
Untuk meringankan masalah ini, Android N menerapkan pembatasan berikut:
Jika aplikasi Anda menggunakan intent ini, Anda harus membuang dependensi padanya secepat mungkin agar Anda bisa menargetkan perangkat Android N dengan benar. Kerangka kerja Android menyediakan beberapa solusi untuk mengurangi kebutuhan akan siaran implisit ini. Misalnya, {@link android.app.job.JobScheduler} dan {@code GcmNetworkManager} menyediakan mekanisme yang tangguh untuk menjadwalkan operasi jaringan bila kondisi yang ditetapkan, seperti koneksi ke jaringan berbiaya tetap, terpenuhi. Anda sekarang juga bisa menggunakan {@link android.app.job.JobScheduler} untuk bereaksi terhadap perubahan penyedia materi. Objek {@link android.app.job.JobInfo} membungkus parameter yang digunakan {@link android.app.job.JobScheduler} untuk menjadwalkan pekerjaan Anda. Bila syarat-syarat pekerjaan sudah terpenuhi, sistem akan mengeksekusi pekerjaan ini pada {@link android.app.job.JobService} aplikasi Anda.
Dalam dokumen ini, kita akan mempelajari cara menggunakan metode alternatif, seperti {@link android.app.job.JobScheduler}, untuk menyesuaikan aplikasi Anda dengan pembatasan yang baru.
Aplikasi yang menargetkan Android N tidak menerima siaran {@link android.net.ConnectivityManager#CONNECTIVITY_ACTION} jika mereka mendaftar untuk menerimanya dalam manifes mereka, dan proses yang bergantung pada siaran ini tidak akan dimulai. Hal ini bisa menimbulkan masalah bagi aplikasi yang ingin memantau perubahan jaringan atau melakukan aktivitas jaringan dalam jumlah besar bila perangkat menghubungkan ke jaringan berbiaya tetap. Beberapa solusi untuk menyiasati pembatasan ini sudah ada dalam kerangka kerja Android, namun pemilihan solusi yang tepat bergantung pada apa yang ingin dicapai oleh aplikasi Anda.
Catatan: Sebuah {@link android.content.BroadcastReceiver} yang mendaftar pada {@link android.content.Context#registerReceiver Context.registerReceiver()} akan terus menerima siaran ini saat aplikasi berjalan.
Saat menggunakan kelas {@link android.app.job.JobInfo.Builder JobInfo.Builder} untuk membangun objek {@link android.app.job.JobInfo} Anda, terapkan metode {@link android.app.job.JobInfo.Builder#setRequiredNetworkType setRequiredNetworkType()} dan teruskan {@link android.app.job.JobInfo JobInfo.NETWORK_TYPE_UNMETERED} sebagai parameter pekerjaan. Contoh kode berikut menjadwalkan layanan yang akan dijalankan ketika perangkat terhubung ke jaringan berbiaya tetap dan dikenai biaya:
public static final int MY_BACKGROUND_JOB = 0; ... public static void scheduleJob(Context context) { JobScheduler js = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); JobInfo job = new JobInfo.Builder( MY_BACKGROUND_JOB, new ComponentName(context, MyJobService.class)) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) .setRequiresCharging(true) .build(); js.schedule(job); }
Bila syarat untuk pekerjaan Anda terpenuhi, aplikasi Anda akan menerima callback untuk menjalankan metode {@link android.app.job.JobService#onStartJob onStartJob()} dalam {@code JobService.class} yang ditetapkan. Untuk melihat contoh selengkapnya mengenai implementasi {@link android.app.job.JobScheduler}, lihat aplikasi contoh JobScheduler.
Aplikasi yang menggunakan layanan GMSCore, dan menargetkan Android 5.0 (API level 21) atau yang lebih rendah, bisa menggunakan {@code GcmNetworkManager} dan menetapkan {@code Task.NETWORK_STATE_UNMETERED}.
Aplikasi yang berjalan tetap bisa memantau {@code CONNECTIVITY_CHANGE} dengan {@link android.content.BroadcastReceiver} yang telah didaftarkan. Akan tetapi, {@link android.net.ConnectivityManager} API menyediakan metode yang lebih tangguh untuk meminta callback hanya bila persyaratan jaringan yang ditetapkan terpenuhi.
Objek {@link android.net.NetworkRequest} mendefinisikan parameter callback jaringan dari segi {@link android.net.NetworkCapabilities}. Anda membuat objek {@link android.net.NetworkRequest} dengan kelas {@link android.net.NetworkRequest.Builder NetworkRequest.Builder}. {@link android.net.ConnectivityManager#registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback) registerNetworkCallback()} kemudian meneruskan objek {@link android.net.NetworkRequest} ke sistem. Bila syarat jaringan terpenuhi, aplikasi akan menerima callback untuk mengeksekusi metode {@link android.net.ConnectivityManager.NetworkCallback#onAvailable onAvailable()} yang didefinisikan dalam kelas {@link android.net.ConnectivityManager.NetworkCallback}.
Aplikasi akan terus menerima callback hingga aplikasi keluar atau memanggil {@link android.net.ConnectivityManager#unregisterNetworkCallback unregisterNetworkCallback()}.
Di Android N, aplikasi tidak bisa mengirim atau menerima siaran {@link android.hardware.Camera#ACTION_NEW_PICTURE} atau {@link android.hardware.Camera#ACTION_NEW_VIDEO}. Pembatasan ini membantu meringankan dampak terhadap kinerja dan pengalaman pengguna bila beberapa aplikasi harus aktif untuk memproses gambar atau video baru. Android N memperluas {@link android.app.job.JobInfo} dan {@link android.app.job.JobParameters} untuk menyediakan solusi alternatif.
Untuk memicu pekerjaan saat perubahan URI materi, Android N memperluas {@link android.app.job.JobInfo} API dengan metode berikut:
Catatan: {@code TriggerContentUri()} tidak bisa digunakan bersama-sama dengan {@link android.app.job.JobInfo.Builder#setPeriodic setPeriodic()} atau {@link android.app.job.JobInfo.Builder#setPersisted setPersisted()}. Untuk terus memantau perubahan materi, jadwalkan {@link android.app.job.JobInfo} baru sebelum {@link android.app.job.JobService} aplikasi selesai menangani callback terbaru.
Kode contoh berikut menjadwalkan pekerjaan yang akan dipicu bila sistem melaporkan perubahan ke URI materi, {@code MEDIA_URI}:
public static final int MY_BACKGROUND_JOB = 0; ... public static void scheduleJob(Context context) { JobScheduler js = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); JobInfo.Builder builder = new JobInfo.Builder( MY_BACKGROUND_JOB, new ComponentName(context, MediaContentJob.class)); builder.addTriggerContentUri( new JobInfo.TriggerContentUri(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS)); js.schedule(builder.build()); }
Bila sistem melaporkan perubahan dalam URI materi yang ditetapkan, aplikasi Anda akan menerima callback dan objek {@link android.app.job.JobParameters} akan diteruskan ke metode {@link android.app.job.JobService#onStartJob onStartJob()} dalam {@code MediaContentJob.class}.
Android N juga memperluas {@link android.app.job.JobParameters} untuk memungkinkan aplikasi Anda menerima informasi yang berguna tentang otoritas materi dan URI yang memicu pekerjaan:
Kode contoh berikut mengganti metode {@link android.app.job.JobService#onStartJob JobService.onStartJob()} dan mencatat otoritas materi serta URI yang telah memicu pekerjaan:
@Override public boolean onStartJob(JobParameters params) { StringBuilder sb = new StringBuilder(); sb.append("Media content has changed:\n"); if (params.getTriggeredContentAuthorities() != null) { sb.append("Authorities: "); boolean first = true; for (String auth : params.getTriggeredContentAuthorities()) { if (first) { first = false; } else { sb.append(", "); } sb.append(auth); } if (params.getTriggeredContentUris() != null) { for (Uri uri : params.getTriggeredContentUris()) { sb.append("\n"); sb.append(uri); } } } else { sb.append("(No content)"); } Log.i(TAG, sb.toString()); return true; }
Mengoptimalkan aplikasi Anda untuk berjalan pada perangkat yang mempunyai memori rendah, atau dalam kondisi memori rendah, dapat meningkatkan kinerja dan pengalaman pengguna. Membuang dependensi pada layanan latar belakang dan penerima siaran implisit yang terdaftar secara statis bisa membantu aplikasi Anda berjalan lebih baik pada perangkat demikian. Meskipun Android N telah mengambil langkah-langkah untuk mengurangi sebagian masalah ini, Anda disarankan agar mengoptimalkan aplikasi untuk berjalan tanpa menggunakan proses latar belakang ini sama sekali.
Android N memperkenalkan beberapa tambahan perintah Android Debug Bridge (ADB) yang bisa Anda gunakan untuk menguji perilaku aplikasi dengan proses latar belakang dinonaktifkan:
{@code $ adb shell cmd appops set <package> RUN_IN_BACKGROUND ignore}
{@code $ adb shell cmd appops set <package> RUN_IN_BACKGROUND allow}