Android 8.0: java.lang.IllegalStateException: Hizmetin başlatılmasına izin verilmiyor


360

Uygulama başlatıldığında, uygulama bazı ağ görevlerini gerçekleştirmesi gereken hizmeti başlatır. API düzey 26'yı hedefledikten sonra, uygulamam arka planda Android 8.0 üzerinde hizmet başlatamıyor.

Nedeni: java.lang.IllegalStateException: Hizmetin başlatılmasına izin verilmiyor Amaç {cmp = my.app.tt / com.my.service}: uygulama arka planda uid UidRecord {90372b1 u0a136 CEM boş procs: 1 seq (0,0 , 0)}

anladığım kadarıyla: Arka plan yürütme sınırları

Android 8.0'ı hedefleyen bir uygulama, arka plan hizmetleri oluşturmasına izin verilmeyen bir durumda bu yöntemi kullanmaya çalışırsa, startService () yöntemi artık bir IllegalStateException kurar.

" izin verilmediği bir durumda " - ne anlama geliyor ?? Ve nasıl düzeltilir? Hizmetimi "ön plan" olarak ayarlamak istemiyorum


4
Bu, uygulamanız arka planda olduğunda bir hizmet başlatamayacağınız anlamına gelir
Tim

22
bunun çalışma zamanı izinleriyle ilgisi yoktur
Tim

11
Yerine startForegroundService()kullanın startService().
frogatto

2
TargetSdkVersion 25'i kullanmayı deneyebilir ancak compileSdkVersion 26 ile derleyebilirsiniz. Bu şekilde Android 8 ve en yeni destek kütüphanesinden yeni sınıflar kullanabilirsiniz, ancak uygulamanız Arka Plan Yürütme Sınırları ile sınırlı kalmayacaktır.
Kacper Dziubek

2
@KacperDziubek Çalışması gerekiyor, ancak 2018 sonbaharında SDK26'yı hedeflemesi gerekeceği için geçici bir çözüm.
RightHandedMonkey

Yanıtlar:


194

İzin verilen durumlar, arka plan hizmetinin Android O'dan önceki gibi davrandığı geçici bir beyaz listedir.

Belirli koşullar altında, geçici bir beyaz listeye birkaç dakika süreyle bir arka plan uygulaması yerleştirilir. Bir uygulama beyaz listedeyken, hizmetleri sınırlama olmadan başlatabilir ve arka plan hizmetlerinin çalışmasına izin verilir. Bir uygulama, kullanıcının görebildiği bir görevi işlediğinde beyaz listeye yerleştirilir, örneğin:

  • Yüksek öncelikli bir Firebase Bulut Mesajlaşma (FCM) mesajını işleme.
  • SMS / MMS mesajı gibi bir yayın alma.
  • Bildirimden bir PendingIntent yürütme.
  • VPN uygulaması kendini ön plana çıkarmadan önce bir VpnService başlatma.

Kaynak: https://developer.android.com/about/versions/oreo/background.html

Başka bir deyişle, arka plan hizmetiniz beyaz liste gereksinimlerini karşılamıyorsa, yeni JobScheduler'ı kullanmanız gerekir . Temelde bir arka plan hizmetiyle aynıdır, ancak arka planda sürekli olarak çalışmak yerine periyodik olarak çağrılır.

Bir IntentService kullanıyorsanız, bir JobIntentService olarak değiştirebilirsiniz. Aşağıdaki @ kosev'in cevabına bakınız .


Hizmete "yüksek" prio GCM mesajını aldıktan hemen sonra hizmete başlamak istediğimde bir kilitlenme yaşıyorum. Hala GCM kullanıyorum: "com.google.android.gms: play-services-gcm: 11.4.2", 'com.google.firebase: firebase-messaging: 11.4.2' değil. Önemli olsa da emin değilim ..
Alex Radzishevsky

"Temel olarak arka plan hizmetiyle aynıdır, ancak arka planda sürekli çalışmak yerine periyodik olarak çağrılır." - Android hizmetleri hiç sürekli yürütülmediği için bununla ne demek istediğinden emin değilim. Başlarlar, koşarlar, sonra kapanırlar.
Melllvar

2
FirebaseInstanceIdService onun ve onTokenRefreshyöntem yüksek öncelikli bir FCM mesajı?
Cord Rehn

@phnmnn hayır, GCMTaskService FCM'yi gerçekten takip etmiyor, bu yüzden çalışmıyorlar.
Abhinav Upadhyay

4
JobScheduler veya diğerleri yerine WorkManager'ı (burada: geliştirici.android.com/ topic/libraries/architecture/workmanager ) kullanmamalısınız? Bu demek: youtu.be/IrKoBFLwTN0
android geliştirici

258

Çözüm buldum. 8.0 öncesi cihazlar için, sadece kullanmanız gerekir startService(), ancak 7.0 sonrası cihazlar için kullanmanız gerekir startForgroundService(). Hizmetin başlatılması için kod örneği.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        context.startForegroundService(new Intent(context, ServedService.class));
    } else {
        context.startService(new Intent(context, ServedService.class));
    }

Hizmet sınıfında lütfen bildirim için aşağıdaki kodu ekleyin:

@Override
public void onCreate() {
    super.onCreate();
    startForeground(1,new Notification());
}

O, Android sürüm 26'dır.


9
Bir ön plan hizmeti, kullanıcının farkında olacağı ve bildirim gerektiren bir şeydir. Ayrıca çok uzun süre çalışırsa ANR olacaktır. Uygulama zaten arka planda çalışıyorsa, bu gerçekten uygun bir cevap değildir.
SimonH

80
ContextCompat.startForegroundService(...)Bunun yerine kullanılabilecek bir destek lib var.
jayeffkay

37
Bu bir çözüm değil.
JacksOnF1re

17
Bunun bir çözüm olmadığını da kabul ediyorum. Bu bir geçici çözümdür ve yardımcı olur, ancak Oreo'daki arka plan sınırları bir nedenden dolayı ortaya konmuştur. Bu sınırların bu şekilde aşılması kesinlikle doğru bir yaklaşım değildir (çalışmasına rağmen). En iyi yol JobScheduler kullanmaktır (kabul edilen cevaba bakınız).
Vratislav Jindra

6
Boş bir ön plan bildirimi göstermeniz gerekiyorsa iyi bir kullanıcı deneyimi olacağını sanmıyorum. Olması gerektiği gerçeğini göz önünde bulundurarak. - Android 8.0, ön planda yeni bir hizmet başlatmak için yeni startForegroundService () yöntemini sunar. Sistem hizmeti oluşturduktan sonra, uygulamanın, yeni hizmetin kullanıcı tarafından görülebilir bildirimini göstermek için hizmetin startForeground () yöntemini çağırması için beş saniye vardır. Uygulama, zaman sınırı içinde startForeground () öğesini çağırmazsa, sistem hizmeti durdurur ve uygulamayı ANR olarak bildirir.
heeleeaz

85

En iyi yol, Oreo için yeni JobScheduler veya mevcut değilse eski hizmetleri kullanan JobIntentService'i kullanmaktır .

Manifestinizde beyan edin:

<service android:name=".YourService"
         android:permission="android.permission.BIND_JOB_SERVICE"/>

Ve hizmetinizde onHandleIntent'i onHandleWork ile değiştirmeniz gerekir:

public class YourService extends JobIntentService {

    public static final int JOB_ID = 1;

    public static void enqueueWork(Context context, Intent work) {
        enqueueWork(context, YourService.class, JOB_ID, work);
    }

    @Override
    protected void onHandleWork(@NonNull Intent intent) {
        // your code
    }

}

Ardından hizmetinize şu şekilde başlarsınız:

YourService.enqueueWork(context, new Intent());


Statik bir yöntem içinde statik olmayan bir yöntemi nasıl çağırabilirsiniz? Açıklayabilir misin?
Maddy

@Maddy enqueueWork(...)de statik bir yöntemdir.
hgoebl

2
Nereye YourService.enqueueWork (bağlam, yeni Niyet ()); ? Yayın alıcısından mı?
TheLearner

Bunun en kolay çözüm olduğuna inanmıyorum. WorkManager hakkında aşağıdaki yorumuma bakın. Uygun olduğunda JobIntentService kullanır, ancak çok daha az kazan plakası vardır.
MASA

36

Servis uzatarak bir arka plan iplik çalışıyorsa IntentService, o kadar değiştirebileceğiniz IntentServiceile JobIntentServicehangi Android Destek Kütüphanesi parçası olarak sağlanır

Kullanmanın avantajı, O-öncesi cihazlarda ve O ve üstü JobIntentServiceolarak davranması IntentService, bir iş olarak göndermesidir.

JobSchedulerperiyodik / isteğe bağlı işler için de kullanılabilir. Ancak, JobSchedulerAPI yalnızca API 21'de bulunduğundan geriye dönük uyumluluğu ele aldığınızdan emin olun


1
JobIntentService ile ilgili sorun, Android'in çalışmanızı keyfi olarak planlayabilmesidir ve IntentService'in aksine, etrafta dolaşmadan dolaylı olarak başlatılamaz. Bkz. Stackoverflow.com/questions/52479262/…
kilokahn

15

In Oreo Android tanımlanan arka plan hizmetlerine sınırlarını .

Kullanıcı deneyimini iyileştirmek için Android 8.0 (API düzey 26), uygulamaların arka planda çalışırken yapabilecekleri konusunda sınırlamalar getirir.

Yine de her zaman hizmete ihtiyacınız varsa, ön plan servisini kullanabilirsiniz.

Arka Plan Hizmet Sınırlamaları: Bir uygulama boştayken arka plan hizmetlerini kullanmanın sınırlamaları vardır. Bu, kullanıcı için daha belirgin olan ön plan hizmetleri için geçerli değildir.

Böylece ön plan servis yapabilirsiniz . Hizmetiniz çalışırken kullanıcıya bir bildirim göstermeniz gerekir . Bu cevabı görün (Başkaları da var)

Bir çözüm -

hizmetiniz için bir bildirim istemiyor musunuz?

Periyodik görev yapabilirsiniz, 1. hizmetinizi başlatır, 2. hizmet işini yapar ve 3. kendini durdurur. Bu sayede uygulamanız pil boşaltma olarak kabul edilmeyecektir.

Alarm Yöneticisi , İş Zamanlayıcı , Evernote-Jobs veya Work Manager ile periyodik görevleri kullanabilirsiniz .

Work-Manager ile sonsuza kadar hizmet çalıştırmayı test ettim.


WorkManager, işin hemen yürütülmesi gerekmediğini varsayarak, gitmek için en iyi yol gibi görünüyor. API 23+ olan cihazlarda JobScheduler ve API 14-22 olan cihazlarda BroadcastReceiver + AlarmManager kombinasyonu kullanılarak API 14 ile geriye dönük uyumludur
James Allen

WorkManager hakkında önemli şeydir WorkManager ertelenebilir yani hemen çalıştırmak için gerekli değildir vardır görevler için tasarlanmıştır
touhid udoy

13

Evet, çünkü API 26'da artık hizmetleri arka planda başlatamazsınız. Böylece API 26'nın üstünde ForegroundService'i başlatabilirsiniz.

Kullanmanız gerekecek

ContextCompat.startForegroundService(...)

ve sızıntıyı işlerken bir bildirim gönderin.


1
OP özellikle ön plan olmasını istemediğini söyledi. Bu bir yorum olarak veya daha eksiksiz bir cevabın parçası olarak konulmalıdır.
Ricardo

7

@Kosev söylediği gibi onun cevabını siz JobIntentService kullanabilirsiniz. Ancak alternatif bir çözüm kullanıyorum - IllegalStateException yazılımını yakaladım ve hizmeti ön plan olarak başlattım. Örneğin, bu işlev hizmetimi başlatır:

@JvmStatic
protected fun startService(intentAction: String, serviceType: Class<*>, intentExtraSetup: (Intent) -> Unit) {
    val context = App.context
    val intent = Intent(context, serviceType)
    intent.action = intentAction
    intentExtraSetup(intent)
    intent.putExtra(NEED_FOREGROUND_KEY, false)

    try {
        context.startService(intent)
    }
    catch (ex: IllegalStateException) {
        intent.putExtra(NEED_FOREGROUND_KEY, true)
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            context.startForegroundService(intent)
        }
        else {
            context.startService(intent)
        }
    }
}

ve niyetimi işlediğimde böyle bir şey yaparım:

override fun onHandleIntent(intent: Intent?) {
    val needToMoveToForeground = intent?.getBooleanExtra(NEED_FOREGROUND_KEY, false) ?: false
    if(needToMoveToForeground) {
        val notification = notificationService.createSyncServiceNotification()
        startForeground(notification.second, notification.first)

        isInForeground = true
    }

    intent?.let {
        getTask(it)?.process()
    }
}

Deneme yakalama çözümünü beğendim. Bazen çünkü Benim için bu bir çözümdür context.startServicebazen - - Arka planda çalışan tek iyi yol gibi bu görünüm, aksi takdirde ana sınıfında daha fazla kod uygulamak zorunda extending Applicationve implementing ActivityLifecycleCallbacksve uygulama ön planda veya arka planda olup olmadığı takip ve niyet başlamak buna göre.
Pierre

Bu istisna yakalanabilir mi?
thecr0w

5

Gönderen Firebase sürüm notları , onlar (ı en son sürümünü kullanarak öneriyoruz rağmen) Android O için desteğin ilk 10.2.1 yılında yayımlanmıştır belirtmektedirler.

android O için yeni firebase mesajlaşma bağımlılıkları ekleyin

compile 'com.google.firebase:firebase-messaging:11.6.2'

gerekirse google play hizmetlerini ve google havuzlarını yükseltin.


Bu soruya cevap vermez ve sorunun firebase ile ilgisi yoktur. Yorum olarak konulmalıdır.
Ricardo

5

Uygulama arka planda olduğunda herhangi bir niyet daha önce iyi çalışıyorsa, Android 8 ve üstü sürümlerde artık böyle olmayacak. Yalnızca uygulama arka planda olduğunda işlem yapmak zorunda olan niyeti ifade eder.

Aşağıdaki adımlar takip edilmelidir:

  1. Yukarıda belirtilen niyet JobIntentServiceyerine kullanmalıdır IntentService.
  2. Genişleyen sınıf JobIntentService- onHandleWork(@NonNull Intent intent)yöntemini uygulamalı ve yöntemi çağıran yöntemin altında olmalıdır onHandleWork:

    public static void enqueueWork(Context context, Intent work) {
        enqueueWork(context, xyz.class, 123, work);
    }
  3. enqueueWork(Context, intent)Niyetinizin tanımlandığı sınıftan arayın .

    Basit kod:

    Public class A {
    ...
    ...
        Intent intent = new Intent(Context, B.class);
        //startService(intent); 
        B.enqueueWork(Context, intent);
    }

Aşağıdaki sınıf önceden Service sınıfını genişletiyordu

Public Class B extends JobIntentService{
...

    public static void enqueueWork(Context context, Intent work) {
        enqueueWork(context, B.class, JobId, work);
    }

    protected void onHandleWork(@NonNull Intent intent) {
        ...
        ...
    }
}
  1. com.android.support:support-compatiçin gerekli JobIntentService- kullanıyorum 26.1.0 V.

  2. En önemlisi Firebase kitaplıkları sürümünün en azından açık olduğundan emin olmaktır 10.2.1, sorunum vardı 10.2.0- eğer varsa!

  3. Manifestinizde Service sınıfı için aşağıdaki izin bulunmalıdır:

    service android:name=".B"
    android:exported="false"
    android:permission="android.permission.BIND_JOB_SERVICE"

Bu yardımcı olur umarım.


4

Sadece ForegroundService kullanmanızı tavsiye eden birçok yanıt görüyorum. Bir ForegroundService kullanmak için, onunla ilişkili bir bildirim olması gerekir. Kullanıcılar bu bildirimi görecek. Duruma bağlı olarak, uygulamanızdan rahatsız olabilir ve yüklemeyi kaldırabilirler.

En kolay çözüm WorkManager adlı yeni Mimari Bileşeni kullanmaktır. Belgeleri buradan kontrol edebilirsiniz: https://developer.android.com/topic/libraries/architecture/workmanager/

Siz sadece İşçiyi genişleten işçi sınıfınızı tanımlarsınız.

public class CompressWorker extends Worker {

    public CompressWorker(
        @NonNull Context context,
        @NonNull WorkerParameters params) {
        super(context, params);
    }

    @Override
    public Worker.Result doWork() {

        // Do the work here--in this case, compress the stored images.
        // In this example no parameters are passed; the task is
        // assumed to be "compress the whole library."
        myCompress();

        // Indicate success or failure with your return value:
        return Result.SUCCESS;

        // (Returning RETRY tells WorkManager to try this task again
        // later; FAILURE says not to try again.)
    }
}

Sonra ne zaman çalıştırmak istediğinizi planlayın.

    OneTimeWorkRequest compressionWork = 
        new OneTimeWorkRequest.Builder(CompressWorker.class)
            .build();
    WorkManager.getInstance().enqueue(compressionWork);

Kolay! İşçileri yapılandırmanın birçok yolu vardır. Yinelenen işleri destekler ve ihtiyacınız varsa zincirleme gibi karmaşık şeyler bile yapabilirsiniz. Bu yardımcı olur umarım.


3
Şu anda WorkManager hala alfa.
pzulw

3
05 Mart 2019 - WorkManager 1.0.0 kararlı sürümü.
phnmnn

interservice veya JobIntentService yerine WorkManager kullanmalısınız
sivaBE35

1
WorkManager is intended for tasks that are deferrable—that is, not required to run immediately... bunun en kolay yolu olabilir, ancak uygulamamın kullanıcıların isteklerini hemen yerine getiren bir arka plan hizmetine ihtiyacı var!
Birisi bir yerde

Görevin hemen tamamlanmasını istiyorsanız, bir ön plan hizmeti kullanmalısınız. Kullanıcı bir bildirim görür ve iş yaptığınızı bilir. Ne kullanacağınıza karar vermek için yardıma ihtiyacınız varsa dokümanlara göz atın. Arka plan işleme için oldukça iyi bir rehber var. developer.android.com/guide/background
TALE,

4

JobScheduler kullanarak alternatif çözüm, düzenli aralıklarla arka planda hizmet başlatabilir.

Öncelikle Util.java adında bir sınıf yapın

import android.app.job.JobInfo;
import android.app.job.JobScheduler;
import android.content.ComponentName;
import android.content.Context;

public class Util {
// schedule the start of the service every 10 - 30 seconds
public static void schedulerJob(Context context) {
    ComponentName serviceComponent = new ComponentName(context,TestJobService.class);
    JobInfo.Builder builder = new JobInfo.Builder(0,serviceComponent);
    builder.setMinimumLatency(1*1000);    // wait at least
    builder.setOverrideDeadline(3*1000);  //delay time
    builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);  // require unmetered network
    builder.setRequiresCharging(false);  // we don't care if the device is charging or not
    builder.setRequiresDeviceIdle(true); // device should be idle
    System.out.println("(scheduler Job");

    JobScheduler jobScheduler = null;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        jobScheduler = context.getSystemService(JobScheduler.class);
    }
    jobScheduler.schedule(builder.build());
   }
  }

Ardından, TestJobService.java adında JobService sınıfı yapın

import android.app.job.JobParameters;
import android.app.job.JobService;
import android.widget.Toast;

  /**
   * JobService to be scheduled by the JobScheduler.
   * start another service
   */ 
public class TestJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
    Util.schedulerJob(getApplicationContext()); // reschedule the job
    Toast.makeText(this, "Bg Service", Toast.LENGTH_SHORT).show();
    return true;
}

@Override
public boolean onStopJob(JobParameters params) {
    return true;
  }
 }

Bundan sonra ServiceReceiver.java adlı BroadCast Receiver sınıfı

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

 public class ServiceReceiver extends BroadcastReceiver {
 @Override
public void onReceive(Context context, Intent intent) {
    Util.schedulerJob(context);
 }
}

Bildirim dosyasını hizmet ve alıcı sınıfı koduyla güncelleme

<receiver android:name=".ServiceReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    <service
        android:name=".TestJobService"
        android:label="Word service"
        android:permission="android.permission.BIND_JOB_SERVICE" >

    </service>

Main_intent başlatıcısını varsayılan olarak oluşturulan mainActivity.java dosyasına bıraktı ve MainActivity.java dosyasındaki değişiklikler

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Util.schedulerJob(getApplicationContext());
  }
 }

WOOAAH !! Arka Plan Hizmeti Ön Plan hizmeti olmadan başlar


2

Kodunuzu 8.0 üzerinde çalıştırıyorsanız, uygulama çökecektir. Bu yüzden hizmeti ön planda başlatın. 8.0'ın altındaysa bunu kullanın:

Intent serviceIntent = new Intent(context, RingtonePlayingService.class);
context.startService(serviceIntent);

Yukarıdaki veya 8.0 ise bunu kullanın:

Intent serviceIntent = new Intent(context, RingtonePlayingService.class);
ContextCompat.startForegroundService(context, serviceIntent );

Foreground hizmetlerini yalnızca kullanıcının bir hizmetin çalıştığının farkında olması gereken durumlarda kullanmanız önerilir. Tipik bir örnek, arka planda müzik çalmak içindir. Mantıklı olan başka durumlar da vardır, ancak tüm hizmetlerinizi Ön Plan hizmetlerine dönüştürmemelisiniz. Arka planda biraz iş yapmanız ve çalışacağından emin olmanız gerektiğinde, hizmetlerinizi Google'ın Mimari bileşenlerinden WorkManager'ı kullanacak şekilde dönüştürmeyi düşünün.
TALE

startForegroundService izin gerektirir, aksi takdirde java.lang.SecurityException: Permission Denial: startForeground from pid=13708, uid=10087 requires android.permission.FOREGROUND_SERVICE. Stackoverflow.com/a/52382711/550471
Birisi

1

Firebase mesajlaşma push bildirimini entegre ettiyseniz,

Arkaplan Yürütme Sınırları nedeniyle android O (Android 8.0) için yeni / güncelleme firebase mesajlaşma bağımlılıkları ekleyin .

compile 'com.google.firebase:firebase-messaging:11.4.0'

gerekirse google play hizmetlerini ve google havuzlarını yükseltin.

Güncelleme:

 compile 'com.google.firebase:firebase-messaging:11.4.2'

0

startForegroundService()Bunun yerine kullanın startService() ve startForeground(1,new Notification());hizmete başladıktan sonra 5 saniye içinde hizmetinizde oluşturmayı unutmayın .


2
Görünüşe göre yeni Notificaction () Android 8.1'den çalışmıyor; Bildirim için kanalı oluşturmanız gerekir: stackoverflow.com/a/47533338/1048087
Prizoff

0

Bu cevaba ilişkin tartışmalı oylardan dolayı (bu düzenlemeden itibaren + 4 / -4), LÜTFEN İLK DİĞER CEVAPLARA BAKIN ve SADECE SON SONU OLARAK KULLANIN . Bunu sadece bir kez root olarak çalışan bir ağ uygulaması için kullandım ve bu çözümün normal koşullar altında kullanılmaması gerektiğine dair genel görüşe katılıyorum.

Aşağıdaki orijinal cevap:

Diğer cevapların hepsi doğrudur, ancak bunu aşmanın başka bir yolunun, uygulamanız için pil optimizasyonlarını devre dışı bırakmasını istemek olduğunu belirtmek isterim (uygulamanız sistemle ilgili olmadığı sürece bu genellikle iyi bir fikir değildir). Uygulamanızın Google Play'de yasaklanmasına gerek kalmadan pil optimizasyonlarının kapsamı dışında kalmayı nasıl talep edeceğinizi öğrenmek için bu yanıta bakın .

Ayrıca, kilitlenmeleri önlemek için alıcınızdaki pil optimizasyonlarının kapalı olup olmadığını da kontrol etmelisiniz:

if (Build.VERSION.SDK_INT < 26 || getSystemService<PowerManager>()
        ?.isIgnoringBatteryOptimizations(packageName) != false) {
    startService(Intent(context, MyService::class.java))
} // else calling startService will result in crash

1
Kullanıcılarınızdan mümkün olduğunca fazla pil kullanarak ücretsiz geçiş izni vermelerini istemek iyi bir çözüm değildir. Kodunuzu daha pil dostu bir çözüme dönüştürmeyi düşünün. Kullanıcılarınız size teşekkür edecek.
TALE

5
@TALE Her arka plan hizmeti, pil kullanarak JobSchedulerve benzeri şeyler ile yapılamaz . Bazı uygulamaların tipik senkronizasyon uygulamalarından daha düşük bir seviyede çalışması gerekir. Bu işe yaramadığında alternatif bir çözümdür.
Mygod

-17

onStartCommand'da kullanmayın:

return START_NOT_STICKY

sadece şu şekilde değiştirin:

return START_STICKY

ve işe yarayacak

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.