2016-08-19 5 views
0

Я попытался реализовать некоторые решения, найденные в «Stack», но ничего, что нашел, не помогло мне. В этом проблема: У меня есть планшет Asus Memopad 8 с 1 ГБ ОЗУ. Он запускает «KitKat». В основном он постоянно имеет около 200 МБ свободной оперативной памяти. Для этого планшета я пытаюсь создать службу, которая будет контролировать текущее запущенное приложение foreground, и в случае, если это конкретное приложение, которое я выбираю, выполните определенные действия. В сущности службы (распространяется IntentService) делает это каждые 2 секунды:Android продолжает убивать мое обслуживание

ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); 
    List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); 
    ComponentName componentInfo = taskInfo.get(0).topActivity; 
    return componentInfo.getPackageName(); 

Проблема заключается в том, что моя служба получает убит Android в то время как моя таблетка спит. Итак, я начинаю свою службу, она работает нормально. Когда я заканчиваю использовать мой планшет, я его убираю. Через несколько часов я снова использую планшет - сервис ушел. Если я использую свой планшет через несколько минут после того, как его убирают, все еще работает.

Я попытался это:

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

Я также попытался с "START_STICKY" без удачи.

Что я должен делать, чтобы запретить Android отключать мой сервис? Я не хочу запускать его как «foregroundService», поскольку это служебная служба, которая должна работать все время, и я не хочу, чтобы моя строка состояния заполнялась постоянным уведомлением. У меня уже есть уведомление, когда служба обнаруживает работу правого переднего плана.

+0

Попробуйте использовать wakelock – Ayaanp

ответ

0

Таким образом, решение от Prokash Саркара было хорошо, улучшение вещи, но не является окончательным решением.

Окончательное решение, которое гарантировало, что мой сервис будет активным, даже если есть нехватка ОЗУ (помните, что на моем устройстве всего 1 ГБ!) Можно найти here.

В основном я реализовал описанный «Тревога», который будет проверять, что моя служба перезапускается не более чем через 2 секунды после выключения. Я также добавил некоторые «дополнительные» намерения, чтобы иметь возможность распознавать намерения, отправленные из «службы оповещения». Поскольку услуги на Android - это одиночные игры, в случае, если один из них уже запущен, «Тревога» не запускается другим.

1

Вы можете создать BroadcastReceiver, который запустит сервис сразу же после убийства по телефону.

На вашем OnDestroy() метод в классе обслуживания, запустить пользовательский BroadcastReceiver,

@Override 
public void onDestroy() { 
Intent in = new Intent(); 
    in.setAction("immortal_service"); 
    sendBroadcast(in); 
} 

Теперь зарегистрировать BroadcastReceiver в файле манифеста,

<receiver android:name=".ServiceDestroyReceiver" > 
     <intent-filter> 
      <action android:name="immortal_service" > 
      </action> 
     </intent-filter> 
    </receiver> 

ServiceDestroyReceiver класс начнет ваш сервис после получения ки заполнен,

@Override 
public void onReceive(Context context, Intent intent) { 
    // start the service again here 
} 
+0

Да, хорошая идея! Я попробую. – guest86

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