ResumeActivity がスタックの一番下にある (したがって、スタック内の唯一のアクティビティである) かどうかを検出できるため、提案された回避策よりも優れた「returnFromNotify」アクティビティを作成するという最初のアイデアが気に入っています。
方法は次のとおりです。
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年以上前にこの質問をしたことは知っていますが、他の誰かがこの特定の状況に遭遇した場合に備えて、この回答を提供しています(私がしたように)。当初目指していたソリューションで正しい軌道に乗っていたと思います。