web-dev-qa-db-ja.com

アクティビティがアプリケーションのアクティビティスタックの最後のアクティビティであるかどうかを確認する方法

ユーザーが現在のアクティビティを終了した場合にホーム画面に戻るかどうかを知りたいです。

112
virsir

更新(2015年7月):

getRunningTasks() 廃止予定なので、API 21からraukodrauganswer またはEd Burnetteone (2番目の方が望ましい)。


ActivityManager を使用して、現在のタスクとそのスタックをチェックする可能性があります。

したがって、アクティビティが最後のアクティビティかどうかを判断するには:

  • マニフェストでAndroid.permission.GET_TASKS権限をリクエストします。
  • 次のコードを使用します。

    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");
    }
    

上記のコードは、タスクが1つしかない場合にのみ有効であることに注意してください。アプリケーションにタスクの数が存在する可能性がある場合-他のtaskList要素を確認する必要があります。タスクの詳細を読む タスクとバックスタック


104
sandrstar

@ H9kDroid のコメントを、同様の質問がある人のためのベストアンサーとしてここに投稿します。

isTaskRoot() を使用して、アクティビティがタスクのルートであるかどうかを知ることができます。

これが役立つことを願っています

146
raukodraug

これに対する最も簡単な解決策があります。アクティビティで isTaskRoot() を使用できます。

15

これが新しい初心者に役立つことを願っています、私にとってうまくいく上記の答えに基づいて、私はコードスニペットも共有しているので、実装が簡単になります。

解決策: iを使用しましたisTaskRoot()を返しますtrue if 現在のアクティビティはスタック内のアクティビティのみおよびi以外のケースも処理しますiがスタックに何らかのアクティビティを持っている場合、新規を開くのではなく、スタックの最後のアクティビティに移動しますカスタムアクティビティ。

アクティビティ内

   @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();
        }

    }
5
Abhishek Garg

これを達成する方法があるかもしれませんが(他の回答を参照)、あなたはそうすべきではないことをお勧めします。通常のAndroidアプリケーションは、ホーム画面が表示されようとしているかどうかを知る必要はありません。

データを保存しようとしている場合は、onPause()メソッドにデータ保存コードを配置します。ユーザーにアプリケーションの既存について気を変える方法を提供しようとしている場合は、BackキーとonBackPressed()メソッドのキーアップ/ダウンをインターセプトして、「Are you sure?」を表示できます。促す。

5
Ed Burnette

これを追跡する1つの方法は、新しいアクティビティを開始するときにマーカーを含め、マーカーが存在するかどうかを確認することです。

新しいアクティビティを開始するたびに、マーカーを挿入します。

newIntent=new Intent(this, NextOne.class);
newIntent.putExtra(this.getPackageName()+"myself", 0);
startActivity(newIntent);

そして、次のようにして確認できます。

boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself")
4
H9kDroid

ActivityManagerを使用したsandrstarのソリューションの問題は、この方法でタスクを取得するには許可が必要です。私はより良い方法を見つけました:

getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)

スタックの下部にあるActivityは、デフォルトで常にこのカテゴリを取得する必要がありますが、他のアクティビティは取得しないでください。
ただし、一部のデバイスでこれが失敗した場合でも、Activityの起動時に設定できます。

Intent intent = new Intent(startingActivity, SomeActivityClass.class);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
activity.startActivity(intent);
3
A. Binzxxxxxx

すべてのアクティビティの基本クラスを作成し、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 が使用される可能性があります。

2
Per Löwgren

ここで見逃したことの1つは、「ホームキー」クリックです。アクティブにすると、アクティビティからこれを検出できません。そのため、「戻るキー」を押して必要なアクティビティに移動してプログラムでアクティビティスタックを制御する方が良いでしょう必要な手順を実行するだけです。

さらに、「最近のアクティビティ」リストからアクティビティを開始することは、アクティビティを開く目的で追加のデータを事前設定することで検出できることを確認できません。

0
ACM64

AndroidはActivityスタックを実装しています。これについて読むことをお勧めします here 。あなたがしたいのは、呼び出しアクティビティを取得することだけです: getCallingActivity() 。現在のアクティビティがアプリケーションの最初のアクティビティであり、アプリケーションがホーム画面から起動された場合、nullを返す(と仮定する)必要があります。

0