의도-활동이 실행중인 경우이를 앞쪽으로 가져 오거나 그렇지 않으면 알림에서 새 활동을 시작하십시오.


129

내 앱에는 플래그가없는 알림이있어 매번 새로운 활동을 시작하므로 여러 개의 동일한 활동이 서로 실행되도록합니다.

내가하고 싶은 것은 알림 보류 의도에 지정된 활동을 이미 실행중인 경우 맨 앞으로 가져오고 그렇지 않으면 시작하는 것입니다.

지금까지 내가 가지고있는 통지의 의도 / 보류 의도는

private static PendingIntent prepareIntent(Context context) {
    Intent intent = new Intent(context, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

    return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

이상하게도 때때로 작동하고 때로는 작동하지 않습니다 ... 나는 이미 모든 플래그 조합을 시도한 것처럼 느낍니다.

답변:


131

이것을 사용할 수 있습니다 :

<activity 
   android:name=".YourActivity"
   android:launchMode="singleTask"/>

어느 것과 비슷하게 작동 "singleInstance"하지만 이상한 애니메이션은 없습니다.


15
+1, 당신은 받아 들여지는 대답이어야합니다. 차이점은 여기에 있습니다 : developer.android.com/guide/topics/manifest/…
user1032613 2016 년

1
명확히하기 위해 앱에 여러 활동이 있고 단일 활동이있는 경우 단일 singleInstance 인 경우 singleTask를 사용하십시오.
frostymarvelous

4
저와 같은 누군가가이 사이트에 오기 전에 여러 가지 솔루션 조합을 시도한 경우 : 다른 변경 사항을 제거하고 올바른 활동으로 변경했는지 확인하십시오. 다른 솔루션을 시도하지 않은 경우 (예 : onNewIntent플래그 재정의 및 설정) 이 솔루션이 제대로 작동했음을 알기에는 너무 오래
걸렸습니다.

메신저, 활동 쌍의지도가 있습니다. 메시지를 받으면 Activity 인스턴스를 표시하고 싶습니다. 이 작업을 수행하는 방법이 있습니까? 예 : HashMap.get (Messenger) .bringActivityToFront (); 내 활동은 여전히 ​​진행 중입니다. 최근 작업을 열고 클릭하면 onResume (); 프로그래밍 방식으로 onResume () 수 없습니다.

@JaveneCPPMcGowan 전혀 다른 질문처럼 보이지만, 나는 자신의 질문이기 때문에 불행히도 대답을 실제로 알지 못한다고 게시하는 것이 좋습니다.
프랑코

46

나는 그것을하고 간단한 방법으로 가장 좋은 방법은 활동을 정상적으로 시작하는 것이지만 singleInstance속성으로 매니페스트에서 해당 활동을 설정하는 것입니다 . 이를 통해 활동을 항상 앞쪽으로 가져오고 활동이없는 경우 OS가 자동으로 새로운 것을 만들거나 현재 존재하는 활동을 앞쪽으로 가져 오게하여 현재 두 가지 문제에 실질적으로 접근합니다 ( singleInstance특성).

이것은 활동이 단일 인스턴스로 선언되는 방식입니다.

<activity 
   android:name=".YourActivity"
   android:launchMode="singleInstance"/>

또한 singleInstance를 통해 시작할 때 고르지 못한 애니메이션을 피하기 위해 대신 "singleTask"를 사용할 수 있습니다. 둘 다 매우 유사하지만 차이점은 여기 Google 문서에 따라 설명되어 있습니다.

<activity 
   android:name=".YourActivity"
   android:launchMode="singleTask"/>

singleInstance는 "singleTask"와 동일하지만 시스템이 인스턴스를 보유하는 작업으로 다른 활동을 시작하지는 않습니다. 활동은 항상 태스크의 유일한 유일한 구성원입니다.

도움이 되었기를 바랍니다.

문안 인사!


4
그것은 작동하는 것 같다,하지만 지금은 singleIntent MainActivity에서 다른 모든 새로운 활동 I 발사, 일반 페이드 및 규모 대신이 이상한 아크 애니메이션을 재생
우수 스

매번 새로운 활동을 시작했지만 실행중인 다른 모든 인스턴스를 지우려면 어떻게해야합니까?
urSus

글쎄요, 언급 한 애니메이션이 "singleInstance"속성과 관련이 없다고 생각합니다. 기존 인스턴스를 재사용하는 것뿐입니다. 아마도 여러분이 말하는 애니메이션이 완전히 다른 문제 일 것입니다.
Martin Cazares

1
글쎄, 나는 지금 그것을 테스트하고 있습니다. 모든 의도 플래그를 제거하고 매니페스트에서 launchMode = "singleInstance"를 설정하면 이상한 애니메이션이 있습니다. 제거하면 정상 애니메이션으로 돌아갑니다.
urSus

네, 안드로이드 문서에 따르면, "초기"애니메이션은 더 이상 평소와 같이 활동이 초기화되지 않고 재사용되기 때문에 더 이상 존재하지 않는 것 같습니다 ...
Martin Cazares

26

나는 당신이 필요로하는 singleTop Activity것이 아니라 singleTask또는 안에 있다고 생각합니다 singleInstance.

<activity android:name=".MyActivity"
          android:launchMode="singleTop"
          ...the rest... >

어떤 문서를 말한다 완벽하게 사용자의 요구에 맞게 않습니다 :

[...] singleTop새로운 의도를 처리하기 위해 " "활동 의 새 인스턴스를 만들 수도 있습니다. 그러나 대상 작업에 이미 스택 맨 위에 활동의 기존 인스턴스가있는 경우 해당 인스턴스는 새로운 onNewIntent()호출을 받습니다 ( 통화 중). 새 인스턴스가 작성되지 않습니다. 예를 들어, " singleTop"활동 의 기존 인스턴스가 대상 작업에 있지만 스택의 맨 위에 있지 않은 경우 또는 대상 작업이 아닌 스택의 맨 위에있는 경우-새로운 경우 인스턴스가 생성되어 스택에 푸시됩니다.

그 위에 (장어 의도 없음), 나는 당신과 정확히 같은 필요를 가지고있었습니다. 모든 launchMode플래그를 테스트하여 실제로 실제로 어떻게 동작하는지 파악했으며 결과적 singleTop으로 실제로 가장 적합합니다. 이상한 애니메이션 없음, 최근 응용 프로그램 목록에 앱이 한 번 표시됨 ( singleInstance실제로 인해 두 번 표시되는 것과 달리) (타인 Activity이 그 일의 일부가 될 수 있도록 ), 목표가 Activity이미 존재하는지 여부에 관계없이 적절한 행동을 취하십시오 .


2
금요일 밤 10 시까 지 일하고 이것이 내가 원하는 것입니다 ... 슬픈 개발자의 삶.
felixwcf

내 시간을 많이 절약했습니다! 감사합니다!
hetsgandhi

13

이것은 오래된 스레드이지만 여전히 답을 찾고있는 모든 사람들을 위해 여기 내 해결책이 있습니다. 매니페스트 설정없이 순수하게 코드입니다.

private static PendingIntent prepareIntent(Context context) {
  Intent intent = new Intent(context, MainActivity.class);
  intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);      
  return PendingIntent.getActivity(context, NON_ZERO_REQUEST_CODE, intent, 
    PendingIntent.FLAG_UPDATE_CURRENT);
}

FLAG_ACTIVITY_SINGLE_TOP은 기존 활동이 작업 스택의 맨 위에 있으면 기존 활동을 엽니 다. FLAG_ACTIVITY_CLEAR_TOP은 상단이 아니라 스택 내부에있는 경우 대상 활동 위에서 모든 활동을 제거하고 표시합니다. 작업이 작업 스택에 없으면 새 작업이 생성됩니다. PendingIntent.getActivity ()의 두 번째 매개 변수, 즉 requestCode는 0이 아닌 값을 가져야합니다 (내 스 니펫에서 NON_ZERO_REQUEST_CODE라고도 함). 그렇지 않으면 해당 의도 플래그가 작동하지 않습니다. 나는 그것이 왜 그런지 전혀 모른다. FLAG_ACTIVITY_SINGLE_TOP 플래그는 매니페스트의 활동 태그에서 android : launchMode = "singleTop"와 호환됩니다.


이 플래그로 몇 시간 동안 싸우면서 내 의도 플래그를 변경해도 아무런 변화가 없는지 궁금했습니다. 0이 아닌 요청 코드 ... 언급해야 할 중요한 포인트! 지금 작동합니다! 감사합니다!
Max Power

9

나는 그것이 오래되었다는 것을 알고 있지만 위의 어떤 것도 내 응용 프로그램에 적합하지 않았습니다.

매니페스트 및 기타 구성을 변경하지 않고 앱을 다시 앞으로 가져 오거나 닫을 때 여는 코드는 다음과 같습니다.

Intent notificationIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
notificationIntent.setPackage(null); // The golden row !!!
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

이것이 실제 답변입니다!
azizbekian

2
아니요, 작동하지 않습니다. 현재 활동 위에 새로운 활동을 추가합니다.
Tobliug

3

나는 이것을 시도했지만 IDE가 코드에 대해 불평하더라도 작동했습니다.

Intent notificationIntent = new Intent(THIS_CONTEXT, MainActivity.class);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    PendingIntent intent = PendingIntent.getActivity(THIS_CONTEXT, 0, notificationIntent, Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(THIS_CONTEXT)
            .setSmallIcon(R.drawable.cast_ic_notification_0)
            .setContentTitle("Title")
            .setContentText("Content")
            .setContentIntent(intent)
            .setPriority(PRIORITY_HIGH) //private static final PRIORITY_HIGH = 5;
            .setAutoCancel(true)
            /*.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS)*/;
    NotificationManager mNotificationManager = (NotificationManager) THIS_CONTEXT.getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(0, mBuilder.build());

2
<activity android : name = ". MainActivity"android : launchMode = "singleTask">
nada

Intent.FLAG_ACTIVITY_REORDER_TO_FRONTPendingINtent.getActivity
rds

@rds 소스를 연결할 수 있습니까?
Louis CAD

@LouisCAD 죄송합니다. 더 이상 소스 코드에 액세스 할 수 없습니다
nada

@rds 나는 소스 코드를 요구하지 않지만, 당신이 읽은 곳의 링크는로 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT사용될 때 유효한 플래그가 아닙니다 PendingIntent. 또는 getActivity메소드 에 전달하는 것이 유효하지 않다는 것을 의미 했지만 Intent플래그 로 사용하는 것이 유효 PendingIntent합니까?
Louis CAD

2

활동이 아직 시작되지 않은 경우 활동을 시작하고 싶다고 말했기 때문에 활동을 다시 시작해도 괜찮을 것입니다. 나는 의도를 위해 수많은 제안과 플래그 조합을 테스트했는데, 이것은 이전에 연결된 상태를 유지하지는 않지만 항상 필요한 활동을 앞으로 가져옵니다.

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);

API11 + 만 해당.


0

안드로이드 교육 사이트 에서 발견 된 알림을 추가 한 후 비슷한 문제가 발생했습니다 . 여기에 다른 답변 은 없었지만 이 답변 은 저에게 효과적이었습니다. 요약:

final Intent notificationIntent = new Intent(context, YourActivity.class);
notificationIntent.setAction(Intent.ACTION_MAIN);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.