2015-11-09 4 views
1

Я искал много, но я до сих пор не могу понять решение этойнужен андроид служба для запуска всегда

У меня есть сервис с обратным Start_Sticky в onStartCommand, и она начнет себя в методе OnDestroy обслуживания. Я, хотя этого было бы достаточно, потому что моя служба была бы остановлена ​​от пользователя, поэтому будет вызван метод onDestroy. или остановлен андроидом, а затем из-за Start_Sticky, андроид воссоздает его после его убийства, но андроид не запускает мой сервис после его убийства.

поэтому я использовал класс AlarmManager для регистрации широковещательного приемника, а затем начал свою службу в методе onReceive, но, похоже, после того, как телефон перейдет в спящий режим, метод onReceive снова не будет вызван. Я даже попытался использовать wakeLock

в любом случае вопрос, как сделать запуск службы всегда или воссоздать себя после очистных, как телеграмм или Instagram услуг

это моя служба:

public final class MyService extends Service { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     //some stuff 

     AlarmManager am = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
     Intent ii = new Intent(getApplicationContext(), MyReceiver.class); 
     PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 12345, ii, 0); 
     if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.KITKAT) 
      am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1 * 60 * 1000, pi); 
     else 
      am.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1*60*1000, pi); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onStartCommand(intent, flags, startId); 
     return START_STICKY; 
    } 

    @Override 
    public synchronized void onDestroy() { 
     startService(new Intent(ACTION_MAIN).setClass(context, MyService.class)); 
     super.onDestroy(); 
    } 
} 

и вот мой приемник:

public class MyReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(final Context context, Intent intent) { 
     //WakeLocker.acquire(context); 

     context.startService(new Intent(ACTION_MAIN).setClass(context, MyService.class)); 

     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { 
      AlarmManager am2 =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
      Intent i = new Intent(context, MyReceiver.class); 
      PendingIntent pi = PendingIntent.getBroadcast(context, 12345, i, 0); 
      am2.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1*60*1000, pi); 
     } 
     else 
     { 
      AlarmManager am2 =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
      Intent i = new Intent(context, MyReceiver.class); 
      PendingIntent pi = PendingIntent.getBroadcast(context, 12345, i, 0); 
      am2.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1*60*1000, pi); 
     } 
    } 
} 

Edit: хорошо я получил более простой вопрос почему этот простой служ ce не воссоздается после того, как андроид убил его? Я запускаю службу, используя startService в действии, но примерно через 20 минут моя служба исчезает в запущенных задачах ... почему?

public class NotificationsService extends Service { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     return START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    public void onDestroy() { 
     super.onDestroy(); 
    } 
} 
+0

Я смущен тем, что вы пытаетесь сделать здесь. У вас должен быть класс, который не указан в списке, который настраивает alarmManager и запускает будильник, класс MyReciever выберет это и запустит службу. Я не понимаю, почему класс MyReciever и Service Class имеют в них AlarmManager? Вы также не должны использовать один и тот же идентификатор для двух разных PendingIntents - я бы вообще удалил AlarmManager из MyService, если только я не упустил что-то в вашем вопросе – EnduroDave

+0

да, вы что-то упустили ... с тех пор, как набор андроид-kitkatRepeating метод alarmmanager неточен поэтому я обрабатываю его, установив еще один сигнал тревоги в методе onReceive для имитации setRepeating. и, как вы видите, есть, если так, у меня нет двух ожидающих намерений с аналогичными идентификаторами. –

+0

@CommonsWare Я искал много, и я не получил никакого ответа, хотя, возможно, у меня может помочь, спасибо –

ответ

0

Служба поддержки не работает неограниченно (PERSISTENT) для системных служб.

Вы можете только вернуть сервис START_STICKY. Захват блокировки от пробуждения - это не очень хорошая идея, потому что он разрядит пользователей.

Даже если служба будет убита, она будет перезапущена системой.

Вы можете реализовать приемник BOOT_COMPLETED, чтобы запустить службу при загрузке устройства.

+0

спасибо за ваш ответ. сервис не перезагружается системой, я упомянул об этом в своем вопросе –

+0

Это странно ... но для меня система всегда перезапускает сервис ... может убрать старт-сервис от уничтожения и попробовать –

+0

да, я попытаюсь это сделать, но что мне делать, если пользователь убил мою службу? –

Смежные вопросы