Мне нравится ваша первоначальная идея создания действия "returnFromNotify" лучше, чем предложенный вами обходной путь, поскольку позволяет определить, находится ли ResumeActivity в нижней части стека (и, следовательно, единственное действие встек).
Вот как это можно сделать:
Добавьте свой ResumeActivity в манифест и укажите атрибут noHistory :
<activity android:name=".ResumeActivity" android:noHistory="true" />
Если вы укажете noHistory, это действие не останется в стеке, как только закончится.Таким образом, вы знаете, что в стеке будет отображаться только текущий запущенный экземпляр ResumeActivity.
Чтобы проверить стек приложения, вам также потребуется запросить разрешение GET_TASKS:
<uses-permission android:name="android.permission.GET_TASKS" />
Теперь вы можете использовать ActivityManager :: getRunningTasks () , чтобы определить, является ли ResumeActivity единственным действием в стеке:
public class ResumeActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(isOnlyActivityInStack()) { //check the application stack
//This activity is the only activity in the application stack, so we need to launch the main activity
Intent main = new Intent(this, MainActivity.class);
main.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(main);
} else {
//Return the user to the last activity they had open
this.finish();
}
}
/**
* Checks the currently running tasks. If this activity is the base activity, we know it's the only activity in the stack
*
* @return boolean This activity is the only activity in the stack?
**/
private boolean isOnlyActivityInStack() {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
boolean onlyActivityInStack = false;
for(RunningTaskInfo tasks : manager.getRunningTasks(Integer.MAX_VALUE)) {
if(tasks.baseActivity.getPackageName().equals(this.getPackageName())) { //find this package's application stack
if(tasks.baseActivity.getClassName().equals(this.getClass().getName())) {
//If the ResumeActivity is the base activity, we know that it is the only activity in the stack
onlyActivityInStack = true;
break;
}
}
}
return onlyActivityInStack;
}
}
Я знаю, что вы задавали этот вопрос более 2лет назад, но я даю этот ответ на случай, если кто-то еще столкнется с этой конкретной ситуацией (как я сделал).Я думаю, что вы были на правильном пути с решением, над которым вы изначально работали.