활동을 전경 (스택 맨 위)으로 가져 오는 방법은 무엇입니까?


91

Android에서는 ExampleActivity 활동을 정의했습니다.

내 응용 프로그램이 시작되었을 때이 A-Activity의 인스턴스가 생성되었습니다 A. 사용자가에서 버튼을 클릭하면 AB-Activity의 또 다른 인스턴스 인 B가 생성되었습니다. 이제 작업 스택은 BA이고 맨 위에 B가 있습니다. 그런 다음 사용자가 B의 버튼을 클릭하면 C-Activity의 또 다른 인스턴스가 생성됩니다. 이제 작업 스택은 CBA이며 맨 위에 C가 있습니다.

이제 사용자가 C의 버튼을 클릭하면 애플리케이션이 A를 포 그라운드로 가져 오길 원합니다. 즉, A가 작업 스택 인 ACB의 맨 위에 있도록합니다.

코드를 작성하면 어떻게됩니까?

답변:


109

이것을 시도해 볼 수 있습니다 FLAG_ACTIVITY_REORDER_TO_FRONT(문서는 당신이 원하는 것을 정확하게 설명합니다)


3
FLAG_ACTIVITY_SINGLE_TOP 이어야한다고 생각합니다 .

26
@ user942821 FLAG_ACTIVITY_SINGLE_TOP은 여기서 도움이되지 않습니다. ActivityC가 스택의 맨 위에 있고 startActivity()ActivityA를 시작 하도록 호출 하면 설정하더라도 ActivityA FLAG_ACTIVITY_SINGLE_TOP새 인스턴스 가 생성됩니다 . 이미 스택의 맨 위에있는 활동을 시작하려는 경우에만FLAG_ACTIVITY_SINGLE_TOP 새 인스턴스 생성을 방지합니다 . 이 경우 ActivityA가 스택의 맨 위에 있지 않으므로 Android는 새 인스턴스를 만듭니다.
David Wasser 2013 년

6
대박! (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)주어진 후 모든 기록을 지우는 데 사용 됩니다 Activity.
shkschneider 2015-06-09

10
FLAG_ACTIVITY_CLEAR_TOP도 지정하면 FLAG_ACTIVITY_REORDER_TO_FRONT가 무시됩니다. 문서를 확인하십시오.
Kris Subramanian 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
또는 ComponentName 및 setComponent없이, 그러나 new Intent (this, MyMainActivity.class)
Tima

3
이것이 나를 위해 일한 유일한 것이기 때문에 이상합니다. 플래그 설정이 작동하지 않았고 항상 활동을 다시 만들었습니다.
Steven Huang

5
이 답변과 의견을 읽으면 오해가 있음이 분명합니다. 원래 질문은 Activity작업 스택 내에서 를 재배 열하는 방법에 대해 묻는 것 입니다. OP는 그가 ActivityA스택의 맨 아래에서 맨 위로 이동하기를 원한다고 명확하게 명시합니다 (예 : 그는 ActivityA를 작업 스택의 맨 앞으로 다시 정렬 하려고합니다 ). 이 대답은 그렇게하지 않습니다. 이 답변은 "어떻게 내 애플리케이션 (작업 스택)을 백그라운드에서 포 그라운드로 가져올 수 있습니까?"라는 질문에 대한 답변입니다. 이것은 OP의 원래 질문과는 완전히 다른 질문입니다.
David Wasser

3
또한 찬성 버튼에는 "이 답변이 작업에 도움이됩니다"가 아니라 "이 답변이 도움이됩니다"라고 표시되어 있습니다. 사용자는 이미이 상황에 대해 "수락 표시"를 가지고 있습니다. 분명히 나는 ​​작전에 도움이되는 것이 무엇인지 모르고, 작전에 도움이되는 것이 무엇인지 내 추측에 근거한 IMHO 반대 투표는 잘못된 것입니다.
Boris Treukhov

28

다음은이를 수행하는 방법에 대한 코드 예제입니다.

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

이렇게하면 스택에 활동의 인스턴스가 하나만 있습니다.

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에 설정된 경우이 플래그는 시작된 활동이 이미 실행중인 경우 작업의 기록 스택 맨 앞으로 가져 오도록합니다.

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

참고 홈 활동 시작 모드는 single_task 여야합니다.


1

일반적으로이 활동 관리 방법은 권장되지 않는다고 생각합니다. The Stack에서 두 단계 아래로 활동을 재 활성화하는 문제는이 활동이 종료되었을 가능성이 있다는 것입니다. 귀하의 활동 상태를 기억하고 다음으로 시작하라는 조언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.