1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
|
page.title=Optimisasi Latar Belakang
page.metaDescription=Pembatasan baru untuk siaran implisit.
page.keywords="android N", "implicit broadcasts", "job scheduler"
page.image=images/cards/card-nyc_2x.jpg
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>
Dalam dokumen ini
</h2>
<ol>
<li>
<a href="#connectivity-action">Pembatasan pada CONNECTIVITY_ACTION</a>
</li>
<li>
<a href="#sched-jobs">Menjadwalkan Pekerjaan Jaringan pada Koneksi
Berbiaya Tetap</a>
</li>
<li>
<a href="#monitor-conn">Memantau Konektivitas Jaringan Saat Aplikasi
Dijalankan</a>
</li>
<li>
<a href="#media-broadcasts">Pembatasan pada NEW_PICTURE dan
NEW_VIDEO</a>
</li>
<li>
<a href="#new-jobinfo">Metode JobInfo Baru</a>
</li>
<li>
<a href="#new-jobparam">Metode JobParameter Baru</a>
</li>
<li>
<a href="#further-optimization">Mengoptimalkan Aplikasi Anda Lebih Jauh</a>
</li>
</ol>
</div>
</div>
<p>
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. Ini bisa
berdampak besar pada kinerja perangkat dan pengalaman pengguna.
</p>
<p>
Untuk meminimalkan masalah ini, N Developer Preview menerapkan pembatasan
berikut:
</p>
<ul>
<li>Aplikasi yang menargetkan Preview tidak menerima siaran {@link
android.net.ConnectivityManager#CONNECTIVITY_ACTION} jika mereka
mendaftar untuk menerimanya dalam manifes mereka. Aplikasi yang berjalan di latar depan
tetap bisa mendengarkan {@code CONNECTIVITY_CHANGE} pada thread utama mereka dengan
mendaftarkan {@link android.content.BroadcastReceiver} pada {@link
android.content.Context#registerReceiver Context.registerReceiver()}.
</li>
<li>Aplikasi tidak bisa mengirim atau menerima siaran {@link
android.hardware.Camera#ACTION_NEW_PICTURE} atau {@link
android.hardware.Camera#ACTION_NEW_VIDEO}. Optimisasi ini
memengaruhi semua aplikasi, bukan hanya aplikasi yang menargetkan Preview.
</li>
</ul>
<p>
Kerangka kerja Android menyediakan beberapa solusi untuk mengurangi kebutuhan akan
siaran implisit ini. Misalnya, {@link android.app.job.JobScheduler}
dan<a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
{@code GcmNetworkManager}</a> 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 konten. 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.
</p>
<p>
Dalam dokumen ini, kita akan mempelajari cara menggunakan metode alternatif, seperti
{@link android.app.job.JobScheduler}, untuk menyesuaikan aplikasi Anda dengan pembatasan
yang baru.
</p>
<h2 id="connectivity-action">
Pembatasan pada CONNECTIVITY_ACTION
</h2>
<p>
Aplikasi yang menargetkan N Developer Preview 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
mendengarkan 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.
</p>
<p class="note">
<strong>Catatan:</strong> Sebuah {@link android.content.BroadcastReceiver} yang didaftarkan dengan
{@link android.content.Context#registerReceiver Context.registerReceiver()}
akan terus menerima siaran ini saat aplikasi berada di latar depan.
</p>
<h3 id="sched-jobs">
Menjadwalkan Pekerjaan Jaringan pada Koneksi Berbiaya Tetap
</h3>
<p>
Saat menggunakan kelas {@link android.app.job.JobInfo.Builder JobInfo.Builder}
untuk membuat 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 bila perangkat menghubungkan ke jaringan
berbiaya tetap dan saat mengisi baterai:
</p>
<pre>
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);
}
</pre>
<p>
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 <a href="{@docRoot}samples/JobScheduler/index.html">aplikasi contoh JobScheduler</a>.
</p>
<p>
Aplikasi yang menggunakan layanan GMSCore, dan menargetkan Android 5.0 (API tingkat 21)
atau lebih rendah, bisa menggunakan <a href="https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager">
{@code GcmNetworkManager}</a> dan menetapkan {@code Task.NETWORK_STATE_UNMETERED}.
</p>
<h3 id="monitor-conn">
Memantau Konektivitas Jaringan Saat Aplikasi Dijalankan
</h3>
<p>
Aplikasi yang berjalan di latar depan tetap bisa mendengarkan {@code
CONNECTIVITY_CHANGE} dengan {@link
android.content.BroadcastReceiver} yang didaftarkan. Akan tetapi, {@link
android.net.ConnectivityManager} API menyediakan metode yang lebih tangguh untuk meminta
callback hanya bila syarat jaringan yang ditetapkan terpenuhi.
</p>
<p>
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}.
</p>
<p>
Aplikasi akan terus menerima callback hingga aplikasi keluar atau memanggil
{@link android.net.ConnectivityManager#unregisterNetworkCallback
unregisterNetworkCallback()}.
</p>
<h2 id="media-broadcasts">
Pembatasan pada NEW_PICTURE dan NEW_VIDEO
</h2>
<p>
Di N Developer Preview, aplikasi tidak dapat mengirim atau menerima siaran {@link
android.hardware.Camera#ACTION_NEW_PICTURE} atau {@link
android.hardware.Camera#ACTION_NEW_VIDEO}. Pembatasan ini membantu
meminimalkan dampak negatif terhadap kinerja dan pengalaman pengguna bila beberapa aplikasi harus
aktif untuk memproses gambar atau video baru. N Developer Preview
menambahkan {@link android.app.job.JobInfo} dan {@link
android.app.job.JobParameters} untuk memberikan solusi alternatif.
</p>
<h3 id="new-jobinfo">
Metode JobInfo baru
</h3>
<p>
Untuk memicu pekerjaan saat perubahan URI konten, N Developer Preview menambahkan
{@link android.app.job.JobInfo} API dengan metode berikut:
</p>
<dl>
<dt>
{@code JobInfo.TriggerContentUri()}
</dt>
<dd>
Membungkus parameter yang diperlukan untuk memicu pekerjaan saat perubahan URI konten.
</dd>
<dt>
{@code JobInfo.Builder.addTriggerContentUri()}
</dt>
<dd>
Meneruskan objek {@code TriggerContentUri} ke {@link
android.app.job.JobInfo}. Sebuah {@link android.database.ContentObserver}
akan memantau URI konten yang dibungkus. Jika ada beberapa objek {@code
TriggerContentUri} yang dikaitkan dengan pekerjaan, sistem akan memberikan sebuah
callback sekalipun itu melaporkan perubahan di salah satu URI konten saja.
</dd>
<dd>
Tambahkan flag {@code TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS} untuk
memicu pekerjaan jika ada turunan dari perubahan URI yang diberikan. Flag ini
berkaitan dengan parameter {@code notifyForDescendants} yang diteruskan ke {@link
android.content.ContentResolver#registerContentObserver
registerContentObserver()}.
</dd>
</dl>
<p class="note">
<strong>Catatan:</strong> {@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 konten, jadwalkan
{@link android.app.job.JobInfo} baru sebelum {@link
android.app.job.JobService} aplikasi selesai menangani callback terbaru.
</p>
<p>
Kode contoh berikut menjadwalkan pekerjaan yang akan dipicu bila sistem melaporkan
perubahan ke URI konten, {@code MEDIA_URI}:
</p>
<pre>
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(MEDIA_URI,
JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS));
js.schedule(builder.build());
}
</pre>
<p>
Bila sistem melaporkan perubahan dalam URI konten 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}.
</p>
<h3 id="new-jobparam">
Metode JobParameter Baru
</h3>
<p>
N Developer Preview juga menambahkan {@link android.app.job.JobParameters} untuk
memungkinkan aplikasi Anda menerima informasi yang berguna tentang otoritas konten
dan URI yang memicu pekerjaan:
</p>
<dl>
<dt>
{@code Uri[] getTriggeredContentUris()}
</dt>
<dd>
Mengembalikan larik URL yang telah memicu pekerjaan. Ini akan berupa {@code
null} jika tidak ada URI yang memicu pekerjaan (misalnya, pekerjaan
dipicu karena batas waktu atau alasan lainnya), atau jumlah
URI yang berubah lebih dari 50.
</dd>
<dt>
{@code String[] getTriggeredContentAuthorities()}
</dt>
<dd>
Mengembalikan larik string otoritas konten yang telah memicu pekerjaan.
Jika larik yang dikembalikan bukan {@code null}, gunakan {@code getTriggeredContentUris()}
untuk mengambil detail URI yang telah berubah.
</dd>
</dl>
<p>
Kode contoh berikut mengesampingkan metode {@link
android.app.job.JobService#onStartJob JobService.onStartJob()} dan
mencatat otoritas konten serta URI yang telah memicu pekerjaan:
</p>
<pre>
@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;
}
</pre>
<h2 id="further-optimization">
Mengoptimalkan Aplikasi Anda Lebih Jauh
</h2>
<p>
Mengoptimalkan aplikasi Anda untuk berjalan pada perangkat minim memori, atau dalam kondisi
minim memori, bisa meningkatkan kinerja dan pengalaman pengguna. Menghilangkan
dependensi pada layanan latar belakang dan penerima siaran
implisit yang terdaftar secara statis bisa membantu aplikasi Anda berjalan lebih baik pada perangkat demikian. Meskipun
N Developer Preview telah mengambil langkah-langkah untuk mengurangi sebagian masalah ini, Anda disarankan
agar mengoptimalkan aplikasi untuk berjalan tanpa menggunakan
proses latar belakang ini seluruhnya.
</p>
<p>
N Developer Preview memperkenalkan beberapa tambahan perintah <a href="{@docRoot}tools/help/adb.html">Android Debug Bridge (ADB)</a> yang
bisa Anda gunakan untuk menguji perilaku aplikasi dengan proses latar belakang dinonaktifkan:
</p>
<ul>
<li>Untuk mensimulasikan kondisi saat siaran implisit dan layanan latar belakang
tidak tersedia, masukkan perintah berikut:
</li>
<li style="list-style: none; display: inline">
<pre class="no-pretty-print">
{@code $ adb shell cmd appops set RUN_IN_BACKGROUND ignore}
</pre>
</li>
<li>Untuk mengaktifkan kembali siaran implisit dan layanan latar belakang, masukkan
perintah berikut:
</li>
<li style="list-style: none; display: inline">
<pre class="no-pretty-print">
{@code $ adb shell cmd appops set RUN_IN_BACKGROUND allow}
</pre>
</li>
</ul>
|