2015-06-26 1 views
-1

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

Случай 1:

1.ЗАГРУЗКА до расписания и отправка время менеджер сигнализации и держать приложение работает.

2.Alarm manager вызывает услугу по достижении времени.

3.service начать работать

4.when я закрыть мое приложение прибудете служба остановлена ​​

Случай 2:

1.ЗАГРУЗКА до расписания и отправка время для диспетчера аварийных сигналов и закрытия приложения app.now в фоновом режиме.

2.Alarm manager вызывает услугу по достижении времени.

3.service начать работать

4.Relaunching в app.service продолжающуюся работает/работает отлично.

5. Теперь закрытие приложения и результат обслуживания мертвы.

Я должен вызвать службу только Alarm Manager, а не каждый раз, когда приложение запускает для этой цели в сервисе onStartCommand методе я вернулся START_NOT_STICKY и я не хочу использовать START_STICKY .if я иду к START_STICKY он выиграл 't рассмотреть запланированное время. И дело в том, что я не хочу снова проверять время, так как это хорошо работает Alarm Manager.

Когда приложение работает на низкой памяти, службы становятся уничтоженными. Это решение использует startForeground вместо startService?

Как я могу сделать свою службу стабильной, не беспокоясь о состоянии открытия/закрытия приложения?

график Установка

public void setAction(View v) { 
     Calendar calendar = Calendar.getInstance(); 
     int hour = Integer.parseInt(HH.getText().toString()); 
     int minute = Integer.parseInt(MM.getText().toString()); 
     int second = Integer.parseInt(SS.getText().toString()); 
     String peried = PP.getText().toString(); 
     calendar.set(Calendar.HOUR_OF_DAY, hour); 
     calendar.set(Calendar.MINUTE, minute); 
     calendar.set(Calendar.SECOND, second); 
     calendar.set(Calendar.AM_PM, peried.equalsIgnoreCase("AM") ? Calendar.AM : Calendar.PM); 
     Intent myIntent = new Intent(MainActivity.this, MyReceiver.class); 
     myIntent.putExtra(ACTION, 
       ACTION_SC_1); 
     pendingIntent = PendingIntent.getBroadcast(MainActivity.this, REQUEST_CODE_SC_1, myIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent); 
    } 

Класс обслуживания

public class MyService extends Service { 


    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     // TODO Auto-generated method stub 
     super.onCreate(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     try { 
      final String action = intent.getStringExtra(ACTION); 
      final Handler handler = new Handler(); 
      final Timer timer = new Timer(); 
      final TimerTask doAsynchronousTask = new TimerTask() { 
       @Override 
       public void run() { 
        handler.post(new Runnable() { 
         public void run() { 
          try { 
           Toast.makeText(MyAlarmService.this, "Running....", Toast.LENGTH_LONG).show(); 

          } catch (Exception e) { 
           // TODO Auto-generated catch block 
          } 
         } 
        }); 
       } 
      }; 
      timer.schedule(doAsynchronousTask, 1000, 5000); //execute in every 5000 msdo 

      // this.stopSelf(); 
     } catch (Exception e) { 
      //TODO 
     } 

     return START_NOT_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
     // TODO Auto-generated method stub 
     super.onDestroy(); 
     Toast.makeText(this, "Killed", Toast.LENGTH_LONG).show(); 
    } 
+0

В любом месте в вашей деятельности вы вызываете stopService() mthod? – Chandrakanth

+0

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

+0

START_STICKY перезапустит службу, немедленно остановленную ОС, и START_REDELIVER_INTENT замедлит перезагрузку :) –

ответ

1

Есть много способов, чтобы избежать убийства службы ... но мы Ĉ это не гарантирует. В ситуациях с низкой памятью служба будет убита os.В этой ситуации, если вы вернетесь START_STICKY, это запустит службу с нулевым намерением. Если вы хотите, чтобы цель была не нулевой, возврат START_REDELIVER_INTENT См. Андроидные документы here

+0

Поскольку это создаст новую копию нашего приложения. Это эффективный способ ? –

+0

Услуга будет работать в отдельном процессе ... Я рекомендую использовать этот способ, чтобы избежать убийства службы. – Chandrakanth

+0

Как насчет использования памяти? –

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