1

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

На самом деле, я хочу, фоновый процесс для запуска на бесконечное время, даже приложение удаляется из недавнего приложения я хочу взять GPS местоположение пользователя повторно через 15 мин

так первый я имел пытался со следующими

TRY 1 ****** Я создал приемник вещания, который будет вызывать мое обслуживание названия этого вещательного приемника LocationServiceRestarter Я инициирование тревоги ретранслятора, который будет вызывать LocationServiceRestarter при регулярном интервале 5 секунд

Intent intent = new Intent("com.lmf.overduereport.gpstimer.LocationServiceRestarter"); 
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 
     0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
AlarmManager am = 
     (AlarmManager)getSystemService(Activity.ALARM_SERVICE); 
alarm_manager.setRepeating(AlarmManager.RTC_WAKEUP,SystemClock.elapsedRealtime()+5*1000,5*1000,pendingIntent); 

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

TRY 2 ****** Я также пробовал услуги, которые могут работать бесконечно. но он также перестает работать после того, как приложение закрывается

TRY 3 ****** На этот раз я не буду называть повторяющуюся менеджер тревоги вместо того, что я сделал следующее

Intent intent = new Intent("com.lmf.overduereport.gpstimer.LocationServiceRestarter"); 
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 
     0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
AlarmManager am = 
     (AlarmManager)getSystemService(Activity.ALARM_SERVICE); 
//-- 
am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
     SystemClock.elapsedRealtime() + 5000, pendingIntent); 

выше будет вызывать широковещательный приемник и радиовещательный приемник я добавил менеджер сигнализации следующий

LocationServiceM.appendLog("Got Reciever******"); 
intent = new Intent("com.lmf.overduereport.gpstimer.LocationServiceRestarter"); 
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 
     12345, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
AlarmManager am = 
     (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE); 

am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
     SystemClock.elapsedRealtime() + 5000, pendingIntent); 

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

но грустно это тоже не работает. он отлично работает, если приложение не удаляется из последнего приложения.

Даже я пробовал то же самое выше, что и сервис и намерение службы, не повезло.

Заключение: диспетчер аварийных сигналов или широковещательный приемник не вызывается после того, как приложение удалено из последнего приложения.

но я видел много приложений, которые запускаются в фоновом режиме, даже приложение закрыто из последнего приложения.

+0

Какое устройство и/или какую версию Android вы тестирование на. –

+0

Samsung galaxy j5 Prime. android version 6.0.1 и Panasonic P81 android version 4.2.2 .. –

ответ

0

вы можете использовать START_STICKY, который сообщает ОС, чтобы воссоздать службу после того, как у нее достаточно памяти, и снова вызовите onStartCommand() с нулевым намерением. START_NOT_STICKY сообщает операционной системе, чтобы не беспокоиться о повторном воссоздании службы.

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

public class SensorService extends Service { 
public int counter=0; 
public SensorService(Context applicationContext) { 
    super(); 
    Log.i("HERE", "here I am!"); 
} 

public SensorService() { 
} 

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

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Log.i("EXIT", "ondestroy!"); 
    Intent broadcastIntent = new Intent("uk.ac.shef.oak.ActivityRecognition.RestartSensor"); 
    sendBroadcast(broadcastIntent); 
    stoptimertask(); 
} 

private Timer timer; 
private TimerTask timerTask; 
long oldTime=0; 
public void startTimer() { 
    //set a new Timer 
    timer = new Timer(); 

    //initialize the TimerTask's job 
    initializeTimerTask(); 

    //schedule the timer, to wake up every 1 second 
    timer.schedule(timerTask, 1000, 1000); // 
} 

/** 
* it sets the timer to print the counter every x seconds 
*/ 
public void initializeTimerTask() { 
    timerTask = new TimerTask() { 
     public void run() { 
      Log.i("in timer", "in timer ++++ "+ (counter++)); 
     } 
    }; 
} 

/** 
* not needed 
*/ 
public void stoptimertask() { 
    //stop the timer, if it's not already null 
    if (timer != null) { 
     timer.cancel(); 
     timer = null; 
    } 
} 

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

вы также должны BroadcastReceiver, который будет получать сигнал, когда кто-то или что-то убивает службу; его роль заключается в перезапуске службы.

public class SensorRestarterBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.i(SensorRestarterBroadcastReceiver.class.getSimpleName(), "Service Stops! Oooooooooooooppppssssss!!!!"); 

     context.startService(new Intent(context, SensorService.class));; 
    } 
} 

Для полной реализации этой ссылки http://fabcirablog.weebly.com/blog/creating-a-never-ending-background-service-in-android

+0

Фактически я также пробовал это раньше. но start_stcky не работает для большинства телефонов на основе AOSP. start sticky не воссоздает сервис. он закрывается, когда приложение удаляется из последнего приложения. а также приложение не приходит на уничтожение после удаления из последнего приложения. поэтому я также не могу назвать широковещательный приемник –