마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

알림 눌렀을때 보여줄 엑티비티 설정.

0 추천
"내어플"이 있으며, A,B,C 의 엑티비티로 구성되어있습니다.

3명의 사용자가 있고, 각 사용자의 TaskStack은 아래와 같습니다.

1 : A

2 : A ~ B

3 : A ~ B ~ C

3명이 모두 카톡을 하다가 "내어플" 알림이 도착 했습니다.

그래서 알림을 눌렀습니다.

각 사용자는 자신의 스택에 있던 마지막 Activity로 이동을 시키고 싶습니다.

1번은 A , 3번은 C 액티비티로..

 

알림 눌렀을때 이동할 액티비티 설정은 아래와 같이 하더군요

PendingIntent.getActivity(  context , reqCode , intent, flasg );

3번째 인자인 Intent 에 이동할 액티비티를 설정하는데..어떻게 해야 할까요?

도움 부탁 드립니다.
박봉배 (730 포인트) 님이 2014년 6월 10일 질문

1개의 답변

0 추천
 
채택된 답변
해당기능을 넣어야 하는 확실한 이유가 필요 하겠네요~~!

그래야 하는 이유는 예외사항이 너무나도 많습니다~!

머 공부를 위해 하신다면 한번쯤 해 보시는 것도 나쁘지 않으나 해당 기능을 넣음으로써 앱의 전체 구조 마저 바꾸어야 하기 때문입니다.

일단 유저가 마지막에 머무른 엑티비티를 띄운다라....

불가능 한것은 아닙니다~! 그냥 인터넷에 떠돌아 다니는 소스 엑티비티 이름만 바꾸어도 잘 실행 됩니다.

단~~! 엑티비티에 접근 할때마다 엑티비티 현재 실행되는 엑티비티정보를 저장 한후 분기를 해야겠지요~~!

허나 노티피의 인텐트는 생성 될때 인텐트가 고정되어 버립니다~! 모순이 생겨 버리죠~!

알림이 온 후 알림클릭이 아닌 아이콘 클릭에 의한 어플 실행 후 다른 엑티비티에서 종료시 알림클릭시에는 내가 마지막에 종료한 엑티비티가 아닌 다른 엑티비티에서 실행이 되버리죠~~!

그건 어쩔수 없다~! 라고 하시면 해당기능 자체가 논리적으로 불 필요한 기능이 되버립니다~!

과감히 빼시면 되죠~~!

허나 반드시 이루어 져야 한다면.......

일단 어플의 스택구조 부터 바꾸어야 합니다~!

일단 님의 질문처럼 c엑티비티가 알림으로 인하여 실행 되었을 시 백버튼은 어떻게 하실 건가요???

별다른 작업이 없다면 그냥 어플이 종료가 되버리겠죠~!

허나 분명히 b엑티비티로 이동 되길 원하실 겁니다~!

쌓이지 않은 b엑티비티를 어떻게 또 실행 시키실 건가요?

이 또한 불가능한 기능은 아니죠~!

단순히 c엑티비티의 진입경로가 b밖에 없다면 간단 하겠지만... c엑티비티의 진입경로가 여러개 라면????

이 외에도 예외사항은 수없이 많습니다~!

만약 이런 논리적 로직을 답변 원하신 거라면 너무나도 방대하기에 답변이 어렵습니다.

여태 주저리주저리 한것은 해당기능을 최대한 배제하라는 의미에서 주저리 한것이고 행여 INTENT설정이 궁금하신 거라면....

Intent intent = new Intent(context, act.class);

act = 이동하고자 하는 엑티비티

와같이 인텐트 초기화후 인자로 넘겨주심 되겠죠?
ThisPlus (46,920 포인트) 님이 2014년 6월 11일 답변
박봉배님이 2014년 6월 11일 채택됨
우선 정성스러운 답변 정말 감사합니다 ^^
저는 처음에 간단하게 생각했습니다.
"내 앱을 그냥 foreground 상태로 돌리면 되겠지.."
근데 PandingIntent를 사용해야 하니 어떻게 해야 할지를 몰랐습니다.
디스플러스님 말씀 들어보니.. 복잡하네요. 우선은 아래처럼 연구중입니다..

ActivityManager.getRunningTasks(999); 를 이용하여 RunningTaskInfo
목록을 갖고 온 후, 내 앱과 패키지가 같은 RunningTaskInfo.topActivity
를 이용하여 최상의Activity의 class 를 Intent에 할당.
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT|Intent.FLAG_ACTIVITY_SINGLE_TOP); 를 할당하여 사용중인 엑티비티가 계속 사용 되도록한다.

그런데 내앱의 최상위 엑티비티를 갖고 오려면 아래와 같이 하면 되나요?

public static Class<?> getLastActivity(Context context, String packageName) {
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
       
        List<RunningTaskInfo> runningList = am.getRunningTasks(999);
        for (RunningTaskInfo running : runningList) {
            if (running == null) continue;
            if( !running.topActivity.getPackageName().equals(packageName) ) continue;
            try {
                return Class.forName(running.topActivity.getClassName());
            } catch ( ClassNotFoundException e ) {
                continue;
            }
        }
        return null;
    }
네~! 맞습니다~!
올리신 소스가 클래스 네임을 리턴 하기는 하죠~~!
하지만 막상 돌려보시면 원하시는 결과는 얻으 실수 없을 겁니다~!
왜냐구요???
위의 소스는 내앱이 실행중이라면 실행되어져야할 소스지요???
실행중이 아닐때는 그냥 메인부터 띄우실 생각인가 보네요~~!
하지만 안타갑게도 안드로이드에 어플의 종료라는 개념자체가 없습니다.
여기서 문제가 발생합니다~!
getRunningTasks(999)에서 실행중인지 아닌지 판별 하시려는거 같은데 ...정말 안타깝게도 해당 소스로 앱의 실행여부를 알 수 가 없습니다~!
앱이 한번 실행 된 순간 부터 해당 타스크에 항상 님의 앱이 리턴 되어집니다~~! 하하하하
즉 실행여부를 알수 없는 순간 위 소스는 무용지물이 된거지요~~!
에초에 질문하신 이유와 비슷한거지요~~! 생각가능한 기능이지만 막상 실행해 놓으면 논리적으로 모순이 발생 합니다~!
종료의 개념을 배제한 안드로이드의 플랫폼 특성상 앱의 실행 여부를 api만을 통하여 알 수 있는 방법은 없습니다.
내가 생각하는 종료와 안드로이드가 생각하는 종료의 개념자체가 다르기때문에 생기는 문제지요~~!
이 또한 에초의 답변과 같습니다~!
직접 다 관리 하셔야 합니다~!
예를 들어 어플 종료시와 백그라운드진입시 적당한 값을 저장 하여 분기를 주는 방법이 있지요~!
음~~! 제생각인데 지금 생각하신 기능을 한번쯤 생각대로 구현 해보는 것도 좋을 듯싶네요~~! 제가 드린 설명은 진짜 일부분 이거든요~~! 직접 부딛혀 보시면 많은 것을 알게 되실겁니다~~!
그리고 인텐트를 사용한다고 하여 반드시 엑티비티가 떠야 한다는 생각을 버리시면 작업이 조금 수월해지 실겁니다.
엑티비티가 아닌 서비스를 실행 시키신다면 훨씬 작업이 수월 하실 겁니다~!
답변을 보니... 뭔가 지옥에 떨어진 기분이네요 ^^;;
공부를 시작한지 얼마 안되어 개념이 별로 없는 저에게 다음 미션을 주셔서 정말 감사합니다.
다음미션은 서비스~
고맙습니다!
...