Programing

알림에서 애플리케이션 및 스택 재개

lottogame 2020. 12. 10. 08:24
반응형

알림에서 애플리케이션 및 스택 재개


사용자가 런처에서 아이콘을 탭할 때와 똑같은 방식으로 상태 표시 줄 알림에서 내 앱을 다시 시작하고 싶습니다.

즉, 스택이 사용자가 떠나기 전과 동일한 상태에 있기를 원합니다.

알림에 보류중인 인 텐트를 설정할 때 문제는 항상 특정 활동을 대상으로한다는 것입니다. 나는 이것을 원하지 않는다. 런처와 마찬가지로 애플리케이션을 재개해야합니다.

따라서 사용자가 활동 A에있는 경우 활동 A를 재개하고 싶습니다. 활동 A에서 활동 B를 시작한 경우 사용자가 알림을 탭할 때 B가 표시되고 A가 가져 오도록 스택이 복원되기를 원합니다. 사용자가 B에서 뒤로 버튼을 탭하면 다시 시작됩니다.

비슷한 제목의 질문에 대한 몇 가지 다른 질문이 있지만 내 문제를 해결하는 질문은 없습니다.


Android가 앱을 시작할 때 사용하는 것과 동일한 인 텐트 필터를 사용하면됩니다.

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

는 AS Intent당신이 당신을 열 생성 Activity알림 표시 줄에서 안드로이드 앱을 실행에 사용되는 것과 동일 이전에 열린이 Activity아닌 새로운 하나를 만드는 표시됩니다.


런처 활동을 원하지 않거나 하드 코딩 할 수없는 상황의 경우이 솔루션이 작동합니다.

Intent i = getPackageManager()
    .getLaunchIntentForPackage(getPackageName())
    .setPackage(null)
    .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, i, 0);

return new NotificationCompat.Builder(context)
        ...
        .setContentIntent(pendingIntent)
        .build();

setPackage (널) 부분은 키이었다 없이 응용 프로그램이 이전 작업을 다시 시작되지 않았기 때문에 내 경우이다. 내 인 텐트를 Android 런처의 인 텐트와 비교 한 결과 pkg가 설정되지 않았으므로 인 텐트에서 패키지 이름을 제거하는 방법을 찾았습니다.

내 특별한 상황은 알림이 라이브러리에서 생성되어 런처 활동이 무엇인지 알 수 없다는 것입니다.


활동을 생성 한 다음 카테고리와 각 플래그를 설정하는 중 ... 이것이 저에게 효과가있는 방식이었습니다.이 방식으로 수행해야했기 때문에 Api lvl 8 을 지원했습니다.

intent.addCategory(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClass(this, YourActivity.class);

intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT|
                Intent.FLAG_ACTIVITY_SINGLE_TOP);

PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 
                   PendingIntent.FLAG_UPDATE_CURRENT);

그리고 AndroidManifest에서

android:launchMode="singleTask"

그래서 트릭을 만든 Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT것은 매니페스트에 설정된 라인과 함께 였습니다 .

다른 사람들에게 도움이되기를 바랍니다.


나는 또한 같은 문제가 있었고 @GrAnd의 대답과 같은 문제를 해결하려고 시도했습니다.

final Intent notificationIntent = new Intent(context,YourActivity.class);
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);

이것은 작동하지만 의심의 여지가 없지만 의도를 ACTION_MAIN으로 설정할 때 문제가 있습니다. 그러면 인 텐트에 번들을 설정할 수 없습니다. 즉, ACTION_MAIN에는 추가 데이터를 포함 할 수 없기 때문에 기본 데이터가 대상 활동에서 수신되지 않습니다.

대신 활동을 singleTask로 설정하고 ACTION_MAIN을 설정하지 않고 정상적으로 의도를 호출하고 대상 활동의 onNewIntent () 메소드에서 의도를 수신 할 수 있습니다.

그러나 당신이 전화한다면, super.onNewIntent (intent); 그런 다음 활동의 두 번째 인스턴스가 생성됩니다.


이것은 매우 간단합니다. 매니페스트 파일을 열고 활동 속성에서 시작 모드 singleTop 속성을 설정 합니다.


<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.REORDER_TASKS" />

private void bringApplicationToForeground(){
    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

      List<ActivityManager.AppTask> tasksList = am.getAppTasks();
      for (ActivityManager.AppTask task : tasksList){
        task.moveToFront();
      }
    }else{

      List<ActivityManager.RunningTaskInfo> tasksList = am.getRunningTasks(Integer.MAX_VALUE);
      if(!tasksList.isEmpty()){
        int nSize = tasksList.size();
        for(int i = 0; i < nSize;  i++){
          if(tasksList.get(i).topActivity.getPackageName().equals(getPackageName())){
            am.moveTaskToFront(tasksList.get(i).id, 0);
          }
        }
      }
    }
}

더 간단한 방법이있을 수 있지만 sqlite 데이터베이스에 데이터를 저장할 수 있으며 데이터베이스에 저장 한 상태가 무엇이든 앱을 다시 시작할 때마다 값을 검색하고 필요한 값으로 설정할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/5502427/resume-application-and-stack-from-notification

반응형