1

Вот что у меня есть:AlarmManager не запускается активность (если она существует)

Intent intent = new Intent(); 
intent.setClass(context,SomeActivity.class); 
PendingIntent pending = PendingIntent.getActivity(context,requestCode,intent,PendingIntent.FLAG_UPDATE_CURRENT); 

AlarmManager alarm = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE); 
alarm.setRepeating(AlarmManager.RTC_WAKEUP, someDistantMillis, someIntervalInMillis,pending); 

Он работает нормально, то есть активность запускается на someDistantMillis и неоднократно запущен после someIntervalInMillis

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

Вот вкратце то, что я хочу добиться:

  1. Strart, AlarmManager называется
  2. если экземпляр SomeActivity уже запущен, то Гото 4) еще Гото 3)
  3. Launch SomeActivity, конец
  4. ничего не делать, конец

Любые идеи о том, как это сделать, o r какие флаги должны включать Intent (FLAG_ACTIVITY_SINGLE_TOP не работает)?

+0

попробуйте добавить 'android: launchMode =" singleInstance "' в тег активности в манифесте. –

+0

Является ли SomeActivity основной деятельностью (с ACTION = MAIN и CATEGORY = LAUNCHER) вашего приложения? –

+0

@PankajKumar, пожалуйста, не предлагайте 'launchMode =" singleInstance "', не получая при этом много других данных. Использование этого режима запуска может решить эту конкретную проблему, но, скорее всего, создаст массу других проблем для пользователя. В общем, режим запуска SingleInstance должен использоваться только в особых обстоятельствах (например, замена HOME-screen). ИМХО это плохой совет. –

ответ

2

Создание статического поля boolean члена в вашем Activity:

public static boolean running = false; 

В onStart() метод установки running в true и в onStop() к false. Затем в месте, где вы хотите, чтобы определить, если ваш Activity работает, просто сделать это if заявление:

if(SomeActivity.running) { 
    // go to step 4 
} else { 
    // go to step 3 
} 

static ключевое слово здесь важно, так как это означает, что running поле будет общим для всех экземпляров SomeActivity класса, поэтому вам не нужен доступ к определенному объекту SomeActivity.

+0

Хорошая идея, угадайте, если ничего лучше не пойдет по ней, это будет путь. Есть ли более «подход Android», чтобы справиться с этим? Мне не нравится идея быть зависимой от некоторой статической переменной. – aldorain

+0

Обратите внимание, что при переключении между приложениями и повторном запуске определенного приложения система знает, следует ли возобновить действие из фона или запустить новый, поэтому для обработки этого из SDK должна быть некоторая логика нижнего уровня – aldorain

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