Burada yayınlanan çözümlerin çoğunda önemli bir parça eksik: bunu uyanık kalma kilidi olmadan yapmak, Hizmetinizin işlenmesi bitmeden ölme riskini taşır. Bu çözümü başka bir başlıkta gördüm, burada da cevapladı.
Yana WakefulBroadcastReceiver api 26 önerilmiyor önerilir 26 altında API Düzeyleri için
Bir uyandırma kilidi almanız gerekir. Neyse ki, Destek kitaplığı bize bunu yapmamız için bir sınıf veriyor :
public class SimpleWakefulReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// This is the Intent to deliver to our service.
Intent service = new Intent(context, SimpleWakefulService.class);
// Start the service, keeping the device awake while it is launching.
Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime());
startWakefulService(context, service);
}
}
ardından, Hizmetinizde uyandırma kilidini açtığınızdan emin olun:
@Override
protected void onHandleIntent(Intent intent) {
// At this point SimpleWakefulReceiver is still holding a wake lock
// for us. We can do whatever we need to here and then tell it that
// it can release the wakelock.
...
Log.i("SimpleWakefulReceiver", "Completed service @ " + SystemClock.elapsedRealtime());
SimpleWakefulReceiver.completeWakefulIntent(intent);
}
WAKE_LOCK iznini eklemeyi ve alıcınızı bildirime kaydetmeyi unutmayın:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
...
<service android:name=".SimpleWakefulReceiver">
<intent-filter>
<action android:name="com.example.SimpleWakefulReceiver"/>
</intent-filter>
</service>
startForeground()
hizmetinizde kullanın . Aksi takdirde, Android ve kullanıcıları hizmetinizi bir alan israfı olarak öldürecek ve Android Market'te bazı hoş olmayan yorumlar alacaksınız. Bir hizmetin önyükleme zamanında başlamasını istediğinizi düşündüğünüz çoğu durumdaAlarmManager
, hizmetinizin sürekli yerine periyodik olarak çalışabilmesi için daha iyi hizmet alırsınız .