アクティビティをフォアグラウンド(スタックの一番上)にする方法は?


90

Androidでは、アクティビティExampleActivityを定義しました。

アプリケーションを起動したときに、このA-Activityのインスタンスが作成されましたA。ユーザーがのボタンをクリックするとA、B-Activityの別のインスタンスであるBが作成されました。これで、タスクスタックはBAになり、Bが一番上になります。次に、ユーザーがCアクティビティの別のインスタンスであるBのボタンをクリックすると、Cが作成されました。これで、タスクスタックはCBAになり、Cが一番上になります。

ここで、ユーザーがCのボタンをクリックしたときに、アプリケーションでAをフォアグラウンドに移動させます。つまり、AをタスクスタックACBの最上位にします。

それを実現するコードをどのように記述できますか?

回答:


108

あなたはこれを試すことができますFLAG_ACTIVITY_REORDER_TO_FRONT(ドキュメントはあなたが何をしたいかを正確に説明しています)


3
FLAG_ACTIVITY_SINGLE_TOPにする必要があると思います。

26
@ user942821 FLAG_ACTIVITY_SINGLE_TOPはここでは役に立ちません。ActivityCがスタックの一番上にあり、startActivity()ActivityAを起動するように呼び出している場合、たとえ設定しFLAG_ACTIVITY_SINGLE_TOPても、ActivityAの新しいインスタンスが作成されますすでにスタックの一番上にあるアクティビティを起動しようとしている場合にFLAG_ACTIVITY_SINGLE_TOPのみ、新しいインスタンスの作成を防止します。この場合、ActivityAはスタックの最上位にないため、Androidは新しいインスタンスを作成します。
David Wasser 2013年

6
驚くばかり!(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)指定された後の履歴をクリアするために使用されActivityます。
shkschneider 2015年

10
FLAG_ACTIVITY_CLEAR_TOPも指定すると、FLAG_ACTIVITY_REORDER_TO_FRONTは無視されます。ドキュメントを確認してください。
クリススブラマニアン2015

3
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP); すでにバックスタックの上にあるが、前面ではない場合に、ユーザーセッションでアクティビティを前面に表示したい場合、これは正常に機能します。
Hassan Jamil 2016年

64

私がこれを行うために見つけた最良の方法は、Androidのホーム画面が使用するのと同じインテント、つまりアプリランチャーを使用することでした。

例えば:

Intent i = new Intent(this, MyMainActivity.class);
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);

このようにして、私のパッケージでユーザーが最後に使用したアクティビティはすべて再び前面に表示されます。これは、サービスのPendingIntentを使用してユーザーをアプリに戻すのに役立ちます。


2
そのコードの一部をたくさんありがとう。私はそれを適切に機能させるために何時間も無駄にしました。
PakitoV

3
またはコンポーネント名とsetComponentのない、しかし新しいテント(これ、MyMainActivity.class)と
TIMA

3
これが私のために働いた唯一のものだったので奇妙です。フラグの設定は機能せず、常にアクティビティを再作成しました。
Steven Huang

5
この回答とコメントを読んだとき、誤解があることは明らかです。元の質問はActivity、タスクスタック内でを再配置する方法について尋ねています。OP ActivityAは、スタックの一番下から一番上に移動したいことを明確に示しています(つまり、彼はActivityAをタスクスタックの前並べ替えたいと考えています)。この答えはそれをしません。この回答は、「アプリケーション(タスクスタック)をバックグラウンドからフォアグラウンドに移動するにはどうすればよいですか?」これは、OPの元の質問とは完全に異なる質問です。
David Wasser 2016年

3
また、「この回答は役立っています」ではなく、「この回答は役立っています」という賛成投票ボタンが表示されます。この状況では、彼/彼女はすでに「受諾マーク」を持っています。明らかに、私はopに何が役立つかわかりません、そして私がopに何が役立つかを推測することに基づく私見の反対投票は正しくありません。
ボリストロイホフ2016年

28

これを行う方法のコード例を次に示します。

Intent intent = getIntent(getApplicationContext(), A.class)

これにより、スタックにアクティビティのインスタンスが1つだけあることが確認されます。

private static Intent getIntent(Context context, Class<?> cls) {
    Intent intent = new Intent(context, cls);
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    return intent;
}

11

FLAG_ACTIVITY_REORDER_TO_FRONT:Context.startActivity()に渡されたインテントに設定されている場合、このフラグは、すでに実行されている場合、起動されたアクティビティをタスクの履歴スタックの前面に移動させます。

Intent i = new Intent(context, AActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(i);

4

Intentフラグの組み合わせでうまくいくと思います。特に、Intent.FLAG_ACTIVITY_CLEAR_TOPそしてIntent.FLAG_ACTIVITY_NEW_TASK

を呼び出す前に、これらのフラグをインテントに追加してくださいstartActvity


2

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

あなたのhomeactivityのlaunchmodeはsingle_taskでなければなりません


1

一般に、このアクティビティ管理方法はお勧めしません。スタックで2ステップ下のアクティビティを再アクティブ化する際の問題は、このアクティビティが強制終了された可能性があることです。あなたの活動の状態を記憶し、それらを起動するための私のアドバイスstartActivity ()

あなたはこのページを見たことがあると思いますが、あなたの便宜のためにこのリンク


0

通知をクリックしたときにアクティビティをスタックの一番上に移動したい場合は、FLAG_ACTIVITY_REORDER_TO_FRONTを機能させるために次の操作が必要になる場合があります。

これに対する私の解決策は、通知がトリガーするブロードキャストアクションをリッスンするブロードキャストレシーバーを作成することでした。だから基本的に:

  1. 通知は、起動するアクティビティの名前を追加してブロードキャストアクションをトリガーします。

  2. ブロードキャストレシーバーは、通知がクリックされたときにこれをキャッチし、FLAG_ACTIVITY_REORDER_TO_FRONTフラグを使用してそのアクティビティを起動するインテントを作成します

  3. アクティビティはアクティビティスタックの一番上に移動し、重複はありません。


-2

「Google Cloud Message」を使用して「PendingIntent」クラスでプッシュ通知を受信して​​いる場合、次のコードはアクションバーにのみ通知を表示します。

通知をクリックしてもアクティビティは作成されません。最後のアクティブなアクティビティが復元され、問題なく現在の状態が保持されます。

Intent notificationIntent = new Intent(this, ActBase.class); **notificationIntent.setAction(Intent.ACTION_MAIN); notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);** PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle("Localtaxi") .setVibrate(vibrate) .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) .setAutoCancel(true) .setOnlyAlertOnce(true) .setContentText(msg);

mBuilder.setContentIntent(contentIntent);

NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());

チャオ!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.