summaryrefslogtreecommitdiff
path: root/docs/html-intl/intl/in/preview/features/background-optimization.jd
blob: ae8d973bdeee003a4e54721c1d81198529cc48a5 (plain)
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>
&#64;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>