2013-10-22 5 views
1

실행기에서 앱 아이콘을 클릭하여 활동을 시작하면 기록에서 선택하는 것처럼 활동이 전경으로 표시됩니다. 따라서 onCreate 호출은 존재하지 않아야합니다.Android 런처 아이콘을 클릭하면 새로운 활동이 시작됩니다. 알림에서 해당 활동을 시작한 후에 만 ​​표시됩니다.

그러나 알림을 클릭하여 활동을 시작한 후에이를 실행하려고하면 시작 프로그램이 활동의 ​​다른 인스턴스를 시작합니다.

런처가 계속 작동하도록 (배경과 응용 프로그램의 정확한 상태를 다시 시작하기 위해) 어떤 플래그를 추가해야합니까?

필수 코드를 게시 할 예정입니다.

알림을 시작합니다

<activity 
     android:name="com.example.ihatenotifiicationsapp.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

이 resumeIntent가 자동으로 안드로이드에 의해 FLAG_ACTIVITY_NEW_TASK를 추가합니다 :

Intent resumeIntent = new Intent(this, MainActivity.class); 
PendingIntent resumePendingIntent = PendingIntent.getActivity(this, 2, 
     resumeIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

Notification resumeNotification = new Notification.Builder(this).setContentTitle(
     "Resume style") 
     .setSmallIcon(R.drawable.ic_launcher) 
     .setContentIntent(resumePendingIntent) 
     .build(); 

NotificationManager notificationManager = (NotificationManager) getSystemService(Service.NOTIFICATION_SERVICE); 
notificationManager.notify(1, launcherNotification); 

이 매니페스트 활동 모습입니다. 이 플래그는 응용 프로그램을 백그라운드에서 다시 시작하는 것을 허용합니다.

이 알림을 클릭하고 앱을 다시 시작하면 실행기에서 앱을 클릭하면 Android에서 MainActivity의 다른 인스턴스를 실행합니다.

이것은 내 응용 프로그램과 백 스택을 손상시킵니다 (스택에 2 개의 MainActivity가 있으며 이상하게 보입니다).

알림을 클릭하기 만하면 재미있는 일입니다 (실행기 동작을 클릭하여 다른 인스턴스를 시작).

답변

0

이 동작을 원할 경우 activity 태그에 android:launchMode="singleTask" 플래그를 사용할 수 있습니다. 이렇게하면 현재 하나의 Active가있는 경우 OS가 다른 인스턴스를 시작하지 못하게합니다. launchbehaviors에 대한 자세한 정보는 SDK Doku를 참조하십시오. here

나는 Emanuel Moecklin 코멘트에 해당하는이 답변을 편집했습니다. lauchModes를 섞어서. 도쿠에서

발췌 :

시스템은 새 작업과 루트 그것에 의도의 루트에있는 활동을 만듭니다. 그러나 액티비티의 인스턴스가 이미 인 경우 시스템은 새로운 인스턴스를 생성하는 대신onNewIntent() 메서드를 호출하여 기존 인스턴스에 인 텐트를 라우팅합니다.

+1

singleInstance는 일반적으로 원하는 것이 아닙니다. 하나의 인스턴스가 단독 작업으로 시작된 활동이 작업의 유일한 활동으로 시작되었습니다. 다른 활동이 시작되면 해당 활동은 FLAG_ACTIVITY_NEW_TASK가 인 텐트에있는 것처럼 실행 모드에 관계없이 다른 작업으로 시작됩니다. 일반적으로 선호하는 것은 "singleTask"입니다. –

+0

singleTask는 솔루션 일 수 있지만 큰 문제가 1 개 있습니다. 실행 프로그램이 실행될 때 (ACTION_MAIN 및 CATEGORY.LAUNCHER를 사용하여 마지막으로 사용한 활동으로 사용자를 복원하려는 경우) 응용 프로그램을 시작하려면 운없는. standal launchMode를 사용하면 – aureliangtx

0

시작되는 활동이 이미 설정된 현재 작업에서 실행하는 대신 그 활동의 새로운 인스턴스를 출시

Intent resumeIntent = new Intent(this, MainActivity.class) 
         .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP; 

설정 한 경우와 시도, 다른 모든 활동 그 위에는 닫히고 이 인 텐트가 새로운 인 텐트로 이전 활동에 배달됩니다. http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP

+0

이 시도했지만 여전히 새 인스턴스가 시작됩니다. 알림을 클릭 한 것과 같습니다. Android Runtime은 애플리케이션이 실행 중임을 인식하지 못하고 실행기를 클릭하면 다른 애플리케이션을 시작합니다. – aureliangtx