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

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

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

  • Состояние 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);
}

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

Где хранится состояние? И что вы получите от logcat в каждой из этих ситуаций?

String 22.07.2018 18:58

Приложение нигде не сохраняет свое состояние, нужно ли? Я думал, что Android автоматически управляет состоянием приложения. Кроме того, трудно сказать, что происходит даже при использовании logcat, потому что, как я уже упоминал, проблема возникает только с иногда, и ее действительно трудно воспроизвести. Спасибо!

Gui Keller 23.07.2018 03:43

Если у вашего приложения есть состояние, на которое оно полагается, оно отвечает за его хранение / загрузку - ОС этого не делает. Перечитывая свой вопрос ... вы говорите, что иногда, когда ОС убивает ваш процесс, она не перезапускает вашу службу?

String 23.07.2018 15:55

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

String 23.07.2018 15:57

Привет @String, я думаю, ты справился! Я считаю, что «Активность» убивают, а «Служба» продолжает работать. Это означает, что когда я нажимаю на уведомление, чтобы восстановить «Активность», оно восстанавливает его в исходное состояние. Не могли бы вы привести пример того, как я «сохраню» состояние приложения в «Службе», чтобы «Действие» вернулось в правильное состояние? Большое спасибо!

Gui Keller 25.07.2018 08:57

После дальнейшего расследования, очевидно, все, что мне нужно было сделать, это установить для всех моих Намерения значение SingleTop и добавить singleTop к основнойМероприятия в AndroidManifest.xml. Кроме того, необходимо установить правильные НамерениеДействие и Категория на Услуга - есть ли что-нибудь еще? Я собираюсь попробовать. Источник: stackoverflow.com/questions/5502427/… - [Некоторые исследования launchModes: stackoverflow.com/questions/25773928/…]

Gui Keller 26.07.2018 00:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
6
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 за то, что указал мне в правильном направлении.

Другие вопросы по теме