Arka plan işlemleri bellek ve pili fazla kullanabilir. Örneğin, örtülü yayın, kaydettirilmiş bir dizi arka plan işlemini başlatabilir. bu süreçlerin pek işe yaramasa bile onları dinlemesi gerekir. Bu, hem cihaz performansını hem de kullanıcı deneyimini önemli ölçüde etkiler.
Android 7.0 (API düzeyi 24) bu sorunu gidermek için aşağıdaki adımları uygular kısıtlamalar:
- Android 7.0 (API düzeyi 24) ve sonraki sürümleri hedefleyen uygulamalar
CONNECTIVITY_ACTION
, şu koşulda yayın yapar: yayın alıcısını manifest dosyasında bildirmesi gerekir. Uygulamalarda kaydolurlarsaCONNECTIVITY_ACTION
yayınları alContext.registerReceiver()
ileBroadcastReceiver
ve bu bağlam hâlâ geçerlidir. - Uygulamalar
ACTION_NEW_PICTURE
veyaACTION_NEW_VIDEO
yayınları gönderemez ya da alamaz. Bu optimizasyon Yalnızca Android 7.0'ı (API düzeyi 24) hedefleyen uygulamaları değil, tüm uygulamaları etkiler.
Uygulamanız bu amaçlardan herhangi birini kullanıyorsa bunlara olan bağımlılıkları kaldırmalısınız
Android 7.0 çalıştıran cihazları düzgün bir şekilde hedefleyebilmek için mümkün olan en kısa zamanda.
veya daha yüksek olabilir. Android çerçevesi, bu sorunun çözümü için
gereklilikler vardır. Örneğin, JobScheduler
ve
Yeni WorkManager ağ planlaması için sağlam mekanizmalar sağlar
belirli koşullar olduğunda yapılan işlemler (ör. sayaçsız bir ağa bağlantı)
karşılanıyor. Artık JobScheduler
uygulamasını da kullanabilirsiniz
yanıt verebilmek için iyi bir fırsattır. JobInfo
.
nesneler, JobScheduler
kullanabileceğiniz araçlardır. İşin koşulları karşılandığında sistem,
bu işi uygulamanızın JobService
üzerinde yürütür.
Bu sayfada, Arkadaş Bitkiler gibi alternatif yöntemleri
JobScheduler
, uygulamanızı bu yeni özelliklere uyarlama
kısıtlamalar.
Kullanıcı tarafından başlatılan kısıtlamalar
Sistemdeki Pil kullanımı sayfasında ayarlar varsa kullanıcı seçeneklerden birini belirleyin:
- Kısıtlanmamış: Daha fazla pil tüketebilecek tüm arka planda çalışmalara izin verilir.
- Optimize edilmiş (varsayılan): Bir uygulamanın arka planda çalışma becerisini optimize eder. Kullanıcının uygulama ile nasıl etkileşime geçtiğine bağlıdır.
- Kısıtlanmış: Bir uygulamanın arka planda çalışmasını tamamen engeller. Uygulamalar beklendiği gibi çalışmayabilir.
Bir uygulama, Android hayati önem taşır ise, sistem kullanıcıdan veri erişimi kısıtlanmasını uygulamanın sistem kaynaklarına erişmesini sağlar.
Bir uygulamanın çok fazla kaynak kullandığını fark eden sisteme bu durumu bildirir: kullanıcıya uygulama işlemlerini kısıtlama seçeneği sunar. Bildirimi tetikleyebilecek davranışlar şunlardır:
- Aşırı sayıda uyanık kalma kilidi: Ekran kapalıyken 1 saat boyunca 1 kısmi uyanık kalma kilidi beklemede
- Aşırı arka plan hizmeti: Uygulama, 26'dan düşük API düzeylerini hedefliyorsa ve aşırı miktarda arka plan hizmeti
Uygulanan kesin kısıtlamalar cihaz üreticisi tarafından belirlenir. Örneğin, örneğin, Android 9 (API düzeyi 28) veya sonraki sürümleri çalıştıran AOSP derlemelerinde "kısıtlanmış" durumda olan arka planda çalışan eyaletler aşağıdakilere sahiptir: sınırlamalar:
- Ön plan hizmetleri başlatılamıyor
- Mevcut ön plan hizmetleri ön plandan kaldırılır
- Alarmlar tetiklenmez
- İşler yürütülmüyor
Ayrıca, bir uygulama Android 13 (API düzeyi 33) veya sonraki bir sürümü hedefliyorsa ve
"kısıtlı" durumlarda sistem, BOOT_COMPLETED
yayınını teslim etmez.
diğer uygulama için uygulama başlatılana kadar LOCKED_BOOT_COMPLETED
yayını
neden.
Söz konusu kısıtlamalar şurada listelenmiştir: Güç yönetimi kısıtlamaları.
Ağ etkinliği yayınlarını almayla ilgili kısıtlamalar
Android 7.0 (API düzeyi 24) sürümünü hedefleyen uygulamalar, CONNECTIVITY_ACTION
bunları manifest dosyalarında almak için kaydolun ve buna bağlı olan süreçler
yayın başlamaz. Bu durum, mobil uygulamamızı isteyen uygulamalar için bir sorun
ağ değişikliklerini dinleme veya
sınırsız bir ağa bağlandığından emin olun. Bu sorunu gidermek için çeşitli çözümler
kısıtlama mevcut olsa da doğru seçeneği
birincisi uygulamanızın ne yapmasını istediğinize bağlıdır.
Not: Bir BroadcastReceiver
Context.registerReceiver()
Uygulama çalışırken bu yayınları almaya devam eder.
Sayaçsız bağlantılarda ağ işlerini planlayın
JobInfo.Builder
sınıfını kullanırken
JobInfo
nesnenizi oluşturmak için setRequiredNetworkType()
yöntemini uygulayın ve JobInfo.NETWORK_TYPE_UNMETERED
iş parametresi olarak iletin. Aşağıdaki kod örneği
Cihaz sayaçsız bir ağa bağlandığında çalışması için bir hizmet planlar
ağ ve şarj oluyor:
Kotlin
const val MY_BACKGROUND_JOB = 0 ... fun scheduleJob(context: Context) { val jobScheduler = context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler val job = JobInfo.Builder( MY_BACKGROUND_JOB, ComponentName(context, MyJobService::class.java) ) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) .setRequiresCharging(true) .build() jobScheduler.schedule(job) }
Java
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); }
İşinizin koşulları karşılandığında uygulamanız, çalıştırılması için bir geri çağırma alır
onStartJob()
yöntemini kullanarak
JobService.class
belirtilmiş. JobScheduler
uygulamasıyla ilgili daha fazla örnek görmek için JobScheduler örnek uygulamasına göz atın.
JobScheduler'ın yerine yeni bir alternatif olan WorkManager, zaman planlaması yapmanıza olanak tanıyan bir API'dir. tamamlanması gereken arka plan görevlerinin uygulama sürecinin tamamlanıp tamamlanmadığından bağımsız olarak, garanti edilen tamamlanma. İş Yöneticisi çalışması için uygun yöntemi seçer (doğrudan uygulama işleminizdeki bir iş parçacığında veya JobScheduler, Firebase JobDispatcher veya AlarmManager'ı kullanabilirsiniz). cihaz API düzeyi. Ayrıca, WorkManager, Play Hizmetleri'ni gerektirmez ve görevleri zincirleme veya görevin durumunu kontrol etme gibi bazı gelişmiş özellikleri içerir. Öğrenmek için Daha fazla bilgi için WorkManager konusuna bakın.
Uygulama çalışırken ağ bağlantısını izleme
Çalışmakta olan uygulamalar, CONNECTIVITY_CHANGE
dinlemek için şuna sahip olabilir:
kayıtlı: BroadcastReceiver
. Ancak ConnectivityManager
API, istekte bulunmak için daha sağlam bir yöntem sunar.
yalnızca belirtilen ağ koşulları karşılandığında geri arama.
NetworkRequest
nesneleri,
NetworkCapabilities
kapsamında ağ geri çağırması. Siz
NetworkRequest.Builder
sınıfıyla NetworkRequest
nesne oluştur. registerNetworkCallback()
.
ardından NetworkRequest
nesnesini sisteme iletir. Zaman
Ağ koşulları karşılandığında, uygulama
onAvailable()
yöntemi, ConnectivityManager.NetworkCallback
sınıfında tanımlandı.
Uygulama, çıkış yapana veya çağrı yapana kadar geri çağırma almaya devam eder
unregisterNetworkCallback()
Resim ve video yayınları almaya ilişkin kısıtlamalar
Android 7.0'da (API düzeyi 24) uygulamalar, ACTION_NEW_PICTURE
veya ACTION_NEW_VIDEO
yayınlarını gönderip alamaz. Bu kısıtlama
birkaç uygulamanın zorunlu kılınması gerektiği durumlarda performans ve kullanıcı deneyimi üzerindeki etkileri
yeni bir görüntü veya video işlemek için uyanık kalmalıdır. Android 7.0 (API düzeyi 24)
JobInfo
ve JobParameters
kapsamını genişleterek alternatif bir çözüm sunar.
İçerik URI'si değişikliklerinde işleri tetikleyin
Android 7.0 (API düzeyi 24), içerik URI'si değişiklikleriyle ilgili işleri tetiklemek için
JobInfo
API'yi aşağıdaki yöntemlerle kullanabilirsiniz:
-
JobInfo.TriggerContentUri()
- . İçerik URI'si değişikliklerinde bir işi tetiklemek için gereken parametreleri içerir.
-
JobInfo.Builder.addTriggerContentUri()
- .
JobInfo
adlı cihazaTriggerContentUri
nesnesi iletir.ContentObserver
kapsüllenmiş içerik URI'sini izler. Bir işle ilişkili birden fazlaTriggerContentUri
nesnesi varsa sistem bir geri çağırması için de kullanılır. ziyaret edin.
-
Şuna
TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS
işaretini ekle: belirtilen URI'nin alt öğeleri değişirse işi tetikler. Bu işaretregisterContentObserver()
işlevine iletilennotifyForDescendants
parametresine karşılık gelir.
Not: TriggerContentUri()
kullanılamaz
setPeriodic()
veya setPersisted()
ile kombinasyonu. İçerik değişikliklerini sürekli olarak izlemek için,
Uygulamanın JobService
cihazı son geri aramayı tamamlamadan JobInfo
önce.
Aşağıdaki örnek kod, sistem şunu bildirdiğinde bir işin tetikleneceğini planlar:
içerik URI'sinde bir değişiklik, MEDIA_URI
:
Kotlin
const val MY_BACKGROUND_JOB = 0 ... fun scheduleJob(context: Context) { val jobScheduler = context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler val job = JobInfo.Builder( MY_BACKGROUND_JOB, ComponentName(context, MediaContentJob::class.java) ) .addTriggerContentUri( JobInfo.TriggerContentUri( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS ) ) .build() jobScheduler.schedule(job) }
Java
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()); }
Sistem, belirtilen içerik URI'lerinde bir değişiklik bildirdiğinde, uygulamanız
bir geri çağırma alır ve bir JobParameters
nesnesi
onStartJob()
yöntemini MediaContentJob.class
içinde değiştirebilirsiniz.
Hangi içerik yetkililerinin bir işi tetiklediğini belirleme
Android 7.0 (API düzeyi 24) JobParameters
sürümünden itibaren
uygulamanızın, hangi içerik yetkililerinin bulunduğuna dair faydalı bilgiler almasına olanak tanır.
ve URI'lar işi tetikledi:
-
Uri[] getTriggeredContentUris()
- .
İşi tetikleyen URI dizisini döndürür. Hiçbir URI işi tetiklemediyse (örneğin iş,
null
bir son teslim tarihi veya başka bir nedenden dolayı tetiklenmiş olması) veya URI'lar 50'den büyük. -
String[] getTriggeredContentAuthorities()
- .
İşi tetikleyen içerik yetkililerinin dize dizisini döndürür.
Döndürülen dizi
null
değilsegetTriggeredContentUris()
değerini kullanın öğesini kullanın.
Aşağıdaki örnek kod, JobService.onStartJob()
yöntemini geçersiz kılar ve
işi tetikleyen içerik yetkililerini ve URI'ları kaydeder:
Kotlin
override fun onStartJob(params: JobParameters): Boolean { StringBuilder().apply { append("Media content has changed:\n") params.triggeredContentAuthorities?.also { authorities -> append("Authorities: ${authorities.joinToString(", ")}\n") append(params.triggeredContentUris?.joinToString("\n")) } ?: append("(No content)") Log.i(TAG, toString()) } return true }
Java
@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; }
Uygulamanızı daha da optimize edin
Uygulamalarınızı düşük bellekli cihazlarda veya düşük bellekte çalışacak şekilde optimize etme performansı ve kullanıcı deneyimini iyileştirebilir. Kaldırılıyor arka plan hizmetlerine olan bağımlılıklar ve manifest-kayıtlı örtülü yayın alıcıları, uygulamanızın bu tür cihazlarda daha iyi çalışmasına yardımcı olabilir. Her ne kadar Android 7.0 (API düzeyi 24) bu sorunlardan bazılarını azaltmak için adımlar atmaktadır. uygulamanızı bu uygulamaları kullanmadan çalışacak şekilde optimize etmenizi arka plandaki işlemlerin tamamını kapsar.
Aşağıdaki Android Debug Bridge (ADB) komutları, arka plan işlemleri devre dışıyken uygulama davranışını test etmenize yardımcı olabilir:
- Örtülü yayınların ve arka plan hizmetlerinin bulunduğu koşulları simüle etmek için aşağıdaki komutu girin:
-
$ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND ignore
- Örtülü yayınları ve arka plan hizmetlerini yeniden etkinleştirmek için şu komutu kullanın:
-
$ adb shell cmd appops set <package_name> RUN_IN_BACKGROUND allow
- Uygulamanızı "kısıtlanmış" bölümüne yerleştiren kullanıcıyı simüle edebilirsiniz eyalet arka planda pil kullanımı. Bu ayar, uygulamanızın çalışmasını engeller arka planda çalışır. Bunu yapmak için bir terminal penceresinde aşağıdaki komutu çalıştırın:
-
$ adb shell cmd appops set <PACKAGE_NAME> RUN_ANY_IN_BACKGROUND deny