ユーザーが現在のアクティビティを終了した場合にホーム画面に戻るかどうかを知りたい。
ユーザーが現在のアクティビティを終了した場合にホーム画面に戻るかどうかを知りたい。
回答:
更新(2015年7月):
以来getRunningTasks() API 21からそれが続く方が良いでしょう、非推奨の取得raukodraugの 答えやエド・バーネット 1を(私は二番目を好むだろう)。
ActivityManager
を使用して、現在のタスクとそのスタックをチェックする可能性があります。
したがって、アクティビティが最後のものかどうかを判断するには、次のようにします。
次のコードを使用します。
ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);
if(taskList.get(0).numActivities == 1 &&
taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())) {
Log.i(TAG, "This is last activity in the stack");
}
上記のコードは、単一のタスクがある場合にのみ有効であることに注意してください。アプリケーションにタスクの数が存在する可能性がある場合-他のtaskList要素を確認する必要があります。タスクについてもっと読むタスクとバックスタック
isTaskRoot()
メソッドを使用して正しい方法で行う必要があります。
@ H9kDroidのコメントを、同様の質問をする人のための最良の回答として投稿します。
isTaskRoot()を使用して、アクティビティがタスクのルートであるかどうかを確認できます。
これが役に立てば幸い
if (isTaskRoot()) { // do something }
これが新しい初心者に役立つことを願っています。上でうまくいく答えに基づいて、私はコードスニペットも共有しているので、簡単に実装できます。
解決策:私は使用isTaskRoot()
返された、真の場合、現在の活動は、あなたのスタック内の活動であれば、私はまた、内ケースを扱うよりも、他の私が代わりに新しい開くスタックに最後の活動にスタック行く中に、いくつかの活性を有するカスタム1を。
あなたの活動で
@Override
public void onBackPressed() {
if(isTaskRoot()){
startActivity(new Intent(currentActivityName.this,ActivityNameYouWantToOpen.class));
// using finish() is optional, use it if you do not want to keep currentActivity in stack
finish();
}else{
super.onBackPressed();
}
}
これに対する最も簡単な解決策があります、あなたは あなたの活動でisTaskRoot()を使うことができます
これを達成する方法があるかもしれませんが(他の回答を参照)、私はあなたがそれを行うべきではないことをお勧めします。通常のAndroidアプリケーションは、ホーム画面が表示されるかどうかを知る必要はありません。
データを保存しようとしている場合は、データ保存コードをonPause()メソッドに配置します。ユーザーに既存のアプリケーションについての考えを変える方法を提供しようとしている場合は、Backキーのキーのアップ/ダウンとonBackPressed()メソッドをインターセプトして、「Are you sure?」促す。
これを追跡する1つの方法は、新しいアクティビティを開始するときにマーカーを含め、マーカーが存在するかどうかを確認することです。
新しいアクティビティを開始するたびに、マーカーを挿入します。
newIntent=new Intent(this, NextOne.class);
newIntent.putExtra(this.getPackageName()+"myself", 0);
startActivity(newIntent);
そして、あなたはこのようにそれをチェックすることができます:
boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself")
を使用したsandrstarのソリューションの問題ActivityManager
は、この方法でタスクを取得するための権限が必要です。私はより良い方法を見つけました:
getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
Activity
スタックの底に他の活動はそれを得るべきではないながら、オールウェイズは、デフォルトでは、このカテゴリを取得する必要があります。
ただし、一部のデバイスでこれが失敗した場合でも、起動時に設定できますActivity
。
Intent intent = new Intent(startingActivity, SomeActivityClass.class);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
activity.startActivity(intent);
AppCompatActivityを拡張して、すべてのアクティビティの基本クラスを作成しました。これには静的カウンターがあります。
public abstract class BasicActivity extends AppCompatActivity {
private static int activityCounter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
++activityCounter;
...
}
@Override
public void onDestroy() {
super.onDestroy();
--activityCounter;
if(activityCounter==0) {
// Last instance code...
}
}
public boolean isLastInstance() { return (activityCounter==1); }
}
これまでのところ、これで十分に機能しています。APIのバージョンに関係なく。もちろん、すべてのアクティビティーがこの基本クラスを拡張する必要があります-私の場合、それらを拡張します。
編集:アプリが完全に終了する前にカウンターがゼロに下がった1つのインスタンスに気づきました。これは、向きが変更され、1つのアクティビティのみが開いている場合です。向きが変わると、アクティビティが閉じて別のアクティビティが作成さonDestroyed
れるため、最後のアクティビティに対して呼び出され、onCreate
向きが変更された同じアクティビティが作成されたときに呼び出されます。この動作を考慮する必要があります。OrientationEventListenerが使用される可能性があります。
Androidはアクティビティスタックを実装しています。ここでそれを読むことをお勧めします。あなたがやりたいことは、呼び出しアクティビティを取得することだけのようです:getCallingActivity()
。現在のアクティビティがアプリケーションの最初のアクティビティであり、アプリケーションがホーム画面から起動された場合、(私は)リターンするはずnull
です。