Android Wear - долго работающее приложение теряет состояние

У меня есть приложение Android Wear (WearOS), которое после работы в течение очень длительного периода времени (скажем, 1 час плюс) иногда теряет свое состояние.

Под потерей своего состояния я подразумеваю, что после долгой работы приложение возобновляет работу в «состоянии A» из своего уведомления.

  • Состояние A: Остановлен - простаивает.
  • Состояние B: Бег - сбор данных GPS.

Однако, если приложение работает, скажем, 20 минут, оно правильно возобновляет работу в «состоянии B» из своего уведомления.


Мой класс обслуживания:

public int onStartCommand(Intent intent, int flags, int startId) {
  Notification notification = this.createNotification();
  super.startForeground(PID, notification);
  return START_STICKY;
}

private Notification createNotification(){
  Log.i("MyService", "createNotification");
  Intent mainIntent = new Intent(this, MyActivity.class);
  mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
  PendingIntent pendingIntent = PendingIntent.getActivity(this,0, mainIntent,0);
  // shortened for breviety ... creates notification ...
  return notification;
}

Мой класс активности:

private void startWatching() {
  if(this.intentService != null){
    this.stopGpsAndCloseDb();
  }
  this.intentService = new Intent(this, MyService.class);
  this.intentService.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
  super.startService(intentService);
}

Может ли кто-нибудь пролить свет на эту проблему, что мне не хватает? Спасибо!


person Gui Keller    schedule 22.07.2018    source источник
comment
Где хранится состояние? И что вы получите от logcat в каждой из этих ситуаций?   -  person String    schedule 22.07.2018
comment
Приложение нигде не сохраняет свое состояние, нужно ли? Я думал, что Android автоматически управляет состоянием приложения. Кроме того, трудно сказать, что происходит даже при использовании logcat, потому что, как я уже упоминал, проблема возникает только иногда, и ее действительно трудно воспроизвести. Спасибо!   -  person Gui Keller    schedule 23.07.2018
comment
Если у вашего приложения есть состояние, на которое оно полагается, оно отвечает за его хранение / загрузку - ОС этого не делает. Перечитывая свой вопрос ... вы говорите, что иногда, когда ОС убивает ваш процесс, она не перезапускает вашу службу?   -  person String    schedule 23.07.2018
comment
Дополнение: для начала я бы добавил методы-заглушки с ведением журнала для всех Service событий жизненного цикла, чтобы понять, что происходит, когда это происходит.   -  person String    schedule 23.07.2018
comment
Привет @String, я думаю, ты справился! Я считаю, что Activity убивают, но Сервис продолжает работать. Это означает, что когда я нажимаю на уведомление, чтобы восстановить Activity, оно восстанавливает его в исходном состоянии. Не могли бы вы привести пример того, как я сохраню состояние приложения в Сервисе, чтобы действие вернулось в правильное состояние? Большое спасибо!   -  person Gui Keller    schedule 25.07.2018
comment
После дальнейшего расследования все, что мне нужно было сделать, это установить для всех моих Intents значение SingleTop и добавить singleTop в main Activity в AndroidManifest.xml. Кроме того, необходимо установить правильные Intent Action и Category для Service - есть ли что-нибудь еще? Я собираюсь попробовать. Источник: stackoverflow.com/questions/ 5502427 / - [Некоторые исследования по launchModes: stackoverflow.com/questions/25773928/]   -  person Gui Keller    schedule 26.07.2018


Ответы (1)


В моем случае, следующее ниже помогло (протестировано / уже в производстве).

Активность - SINGLE_TOP:

this.intentService = new Intent(this, MyService.class);
this.intentService.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

Сервис - START_STICKY & SINGLE_TOP & Action & Category:

Intent mainIntent = new Intent(this, MyActivity.class);
mainIntent.setAction(Intent.ACTION_MAIN);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
mainIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, mainIntent, 0);

AndroidManifest.xml - launchMode = "singleTop":

<activity
        android:name=".MyActivity"
        android:label="@string/app_name"
        android:launchMode="singleTop">

Я хотел бы поблагодарить @String за то, что указал мне в правильном направлении.

person Gui Keller    schedule 27.07.2018