안드로이드 노티피케이션 중복(?)실행 질문드립니다.

조회수 1859회

안드로이드 노티피케이션을 접하게 됐는데 원하는대로 실행이 되지않아 질문드립니다.

A,B액티비티가 있고 A에서 노티피케이션을 정의 후 알림을 띄워주었습니다.

밑에처럼 같이 코드를 작성했습니다.

    NotificationCompat.Builder mBuilder =
                        new NotificationCompat.Builder(MainActivity.this)
                                .setSmallIcon(R.drawable.ic_launcher_background)
                                .setContentTitle("My notification")
                                .setContentText("Hello World!");
                Intent resultIntent = new Intent(MainActivity.this, resultActivity.class);
                resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                        | Intent.FLAG_ACTIVITY_CLEAR_TOP
                        | Intent.FLAG_ACTIVITY_SINGLE_TOP);

                TaskStackBuilder stackBuilder = TaskStackBuilder.create(MainActivity.this);
                stackBuilder.addParentStack(resultActivity.class);
                stackBuilder.addNextIntent(resultIntent);
                PendingIntent resultPendingIntent =
                        stackBuilder.getPendingIntent(
                                0,
                                PendingIntent.FLAG_UPDATE_CURRENT
                        );
                mBuilder.setContentIntent(resultPendingIntent);
                NotificationManager mNotificationManager =
                        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                mNotificationManager.notify(0, mBuilder.build());

A액티비티가 켜진상태에서 노티피케이션을 누르면 B액티비티가 켜지는 모션이 보입니다.

하지만, B액티비티가 켜진 상태에서 노티피케이션을 누를시, B액티비티가 다시 켜지는 모션이 보입니다. 하지만 저는 B액티비티가 켜져있으면 같은 액티비티 이므로 다시 B액티비티를 불러오고 싶지 않습니다. 어떻게 할 수 있을까요?

2 답변

  • B액티비티를 Manifest에서 SingleTop으로 설정해주시면 될 것 같습니다. 또는 resultIntent에 설정해주신 Flag들 중 single_top을 제외한 나머지 2개의 Flag를 제외한 후 동작시켜보세요. 더 자세한 내용들은

    https://developer.android.com/guide/components/tasks-and-back-stack?hl=ko

    개발자 문서를 확인해보세요.

    • 답변 감사드립니다. 조언대로 해보았지만 B액티비티가 켜진상태에서 노티피케이션을 클릭시 B액티비티가 다시생성되는 모션이 지속되고 있습니다. 고민이네요. 혹시 다른 방법을 알고 있으시다면 알려주세요! 심승현 2018.8.16 16:08
  • 어렵게 해결한 것 같습니다. 자답입니다. 일단 위에 소스코드에서

       TaskStackBuilder stackBuilder = TaskStackBuilder.create(MainActivity.this);
       stackBuilder.addParentStack(resultActivity.class);
       stackBuilder.addNextIntent(resultIntent);
    

    이부분이 문제가 되는것 같습니다.

    1.B액티비티가 켜져있는 상태에서 노티피케이션을 누르면 B액티비티가 지속해서 올라왔습니다.

    그래서 다음 코드와 같이 변경하였습니다.

       PendingIntent resultPendingIntent =
       PendingIntent.getActivity(MainActivity.this, 0, resultIntent,        
       PendingIntent.FLAG_UPDATE_CURRENT);
    

    이와같이 변경시켜주면, 위에 설명했던 1.과같은 현상은 없어지게 됩니다.

    하지만, back키를 누를 시 A액티비티로 돌아가는 현상이 있습니다.

    TaskStackBuilder를 사용했을 땐, 잘은 모르겠지만 addParentStack때문에 B액티비티가 루트가 되어서 back를 누르면 종료된 것 같습니다.

    하지만 변경된 코드에선 task Stack이 온전하게 존재하기에, 따로 처리해야만 했습니다. intent에 flag를 넣던지, Manifest에 launchmode를 변경해주던지, 소스코드로 해결해야 한다고 하더군요.

    intent flag, launchmode를 여러번 시도했지만, 자세히 알지 못해 실패하여 소스코드로 해결하였습니다.(소스코드가 가장쉬웠습니다.)

    단순히 B액티비티에서 A액티비티가 NULL이 아니라면 finish()를 하여 B액티비티에서 back을 눌러도 A액티비티가 안나타나게 하였습니다.

    이방법이 다른사람에게 도움이 됐으면 좋겠습니다.

    ※ 틀린점 있으면 말씀해 주세요.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)