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

앱이 완전히 종료된 상태에서 notification 을 눌렀을 때 호출할 화면을 바꾸고 싶습니다.

0 추천
Intent intent = new Intent(getApplicationContext(), ResultActivity.class);
PendingIntent pIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

NotificationCompat.Builder n = new NotificationCompat.Builder(getApplicationContext())
        .setContentTitle(title)
        .setContentText(msg)
        .setSmallIcon(R.drawable.icon)
        .setContentIntent(pIntent)
        .setAutoCancel(true)
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setDefaults(NotificationCompat.DEFAULT_ALL)
        .setStyle(new NotificationCompat.BigTextStyle().bigText(msg));

NotificationManagerCompat.from(getApplicationContext()).notify(12345, n.build());

이렇게 노티를 날리고, 실행 중인 앱 목록 화면에서 지워서 앱을 완전히 종료시켰습니다. 

하지만 앱이 완전히 종료됐을 때는 ResultActivity 가 아닌 MainActivity가 열렸으면 좋겠습니다. 

 

일단은 ResultActivity가 열릴 때 MainActivity가 실행 중인 액티비티 목록? 에 없으면 MainActivity를 호출하고 ResultActivity는 finish를 시키는 방법 밖에 생각이 나지 않습니다. 

 

다른 좋은 방법 없나요?

쎄미 (162,410 포인트) 님이 2017년 1월 16일 질문

2개의 답변

0 추천
 
채택된 답변
Activity 실행 목록을 따로 관리하실게 아니면 보통 그렇게 구현하시면 되죠

첫번째  getRunningAppProcesses() 를 이용해서 판단한다.

두번째  Activity스택을 직접 관리해서 액티비티가 활성화 상태인지 확인하고 처리한다

getRunningAppProssessed가 5.1 이상에서는 타앱은 가져올수 없으나 이 경우엔 해당안되므로

첫번째로 구현하시는게 편하겠네요.
라쎄린드 (25,460 포인트) 님이 2017년 1월 16일 답변
쎄미님이 2017년 1월 17일 채택됨
이 방법이 제일 나은 것 같네요. 고맙습니다.
0 추천
Intent intent = new Intent(getApplicationContext(), ResultActivity.class);

PendingIntent pendingIntent = PendingIntent.getActivities(context, 0,
            new Intent[]{new Intent(context, CallHomeAfterFinishActivity.class), intent},
            PendingIntent.FLAG_CANCEL_CURRENT);

NotificationCompat.Builder n = new NotificationCompat.Builder(context)
            .setContentIntent(pendingIntent)
            ...

NotificationManagerCompat.from(getApplicationContext()).notify(12345, n.build());

열어야 할 화면 말고 mainactivity가 떠있는지 검사할 화면을 하나 더 띄운 다음에, 

 

 

public static boolean isMainActivityRunning() {
  try {
    ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> tasksInfo = activityManager.getRunningTasks(Integer.MAX_VALUE);

    if (tasksInfo == null) { return false; }

    for (ActivityManager.RunningTaskInfo taskInfo : tasksInfo) {
      if (taskInfo.baseActivity.getClassName().equals(MainActivity.class.getCanonicalName())) { return true; }
    }
  } catch (Exception e) {}

  return false;
}

mainactivity 가 떠 있는지 검사할 함수를 추가해서 

 

 

 

public class CallHomeAfterFinishActivity extends AppCompatActivity {
  @Override protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (!SystemUtil.isMainActivityRunning()) {
      startActivity(new Intent(getApplicationContext(), MainActivity.class));
    }

    finish();
  }
}

안 떠 있으면 띄우고 자신은 죽는 걸로 해결했습니다. 

쎄미 (162,410 포인트) 님이 2017년 1월 17일 답변
...