New Intent()는 Android로 새 인스턴스를 시작합니다.launchMode=“싱글탑”
-
19-09-2019 - |
문제
활동이 있습니다 A
~와 함께 android:launchMode="singleTop"
매니페스트에서.
액티비티에 가면 B
, C
, 그리고 D
내 애플리케이션 루트 활동으로 돌아갈 수 있는 메뉴 바로가기가 있습니다(A
).
코드는 다음과 같습니다.
Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
startActivity(myIntent);
그러나 이미 존재하는 인스턴스로 돌아가는 대신 A
나의 MainActivity.class
새 인스턴스를 생성합니다 -> 다음으로 이동합니다. onCreate()
대신에 onNewIntent()
.
이는 예상되는 동작이 아닙니다. 그렇죠?
해결책
이것은 트릭을 수행해야합니다.
<activity ... android:launchMode="singleTop" />
앱 사용을 시작하려는 의도를 만들 때 :
Intent intent= new Intent(context, YourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
이것은 필요합니다.
다른 팁
결국 저를 위해 실제로 일한 것은 다음과 같습니다.
Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(myIntent);
인용 선적 서류 비치:
"표준"및 "Singletop"모드는 단 한 가지 측면에서 서로 다릅니다. "표준"활동에 대한 새로운 의도가있을 때마다 새로운 수업의 인스턴스가 해당 의도에 응답하도록 만들어집니다. 각 인스턴스는 단일 의도를 처리합니다. 마찬가지로, 새로운 의도를 처리하기 위해 "Singletop"활동의 새로운 인스턴스가 만들어 질 수 있습니다. 하지만, 대상 작업에 이미 스택 상단에 기존 활동 인스턴스가있는 경우,이 인스턴스는 새로운 의도를 받게됩니다 (onnewintent () 호출). 새 인스턴스가 생성되지 않습니다.
"이미 스택 상단에 기존의 활동 인스턴스가있는"이 무엇인지 100% 확신하지는 않지만 아마도 당신의 활동은이 조건을 충족시키지 못할 것입니다.
일 것이다 singleTask
또는 singleInstance
당신을 위해 일합니까? 아니면 아마도 설정을 시도 할 수 있습니다 FLAG_ACTIVITY_SINGLE_TOP
의도적으로 당신은 그것이 그렇게 할 것이라고 생각하지는 않지만 그것이 차이를 만들지는 것을 확인하기 위해 만들고 있습니다.
동일한 기존 활동 인스턴스로 돌아갈 수 있습니다.android:launchMode="singleInstance"
매니페스트에서. 당신이 돌아올 때 A
~에서 B
, 필요할 수 있습니다 finish()
파괴 B
.
먼저 Stack 구조를 살펴볼 수 있다.실행 모드의 경우:singleTop
동일한 활동의 인스턴스가 이미 작업 스택 위에 있는 경우 이 인스턴스는 인텐트에 응답하기 위해 재사용됩니다.
모든 활동은 스택("선입 후출")에 보관되므로 현재 활동이 스택의 맨 위에 있고 매니페스트 파일에서 이를 SingleTop으로 정의하면
android:name=".ActivityA"
android:launchMode="singleTop"
활동중인 경우 활동을 재현하는 경우 OnCreate를 입력하지 않을 것입니다. onnewintent ()를 재개하고 알림을 작성하여 볼 수 있습니다.
Intent activityMain = new Intent(ActivityA.this,
ActivityA.class);
activityMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(activityMain);
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
notify("onNewIntent");
}
private void notify(String methodName) {
String name = this.getClass().getName();
String[] strings = name.split("\\.");
Notification noti = new Notification.Builder(this)
.setContentTitle(methodName + "" + strings[strings.length - 1])
.setAutoCancel(true).setSmallIcon(R.drawable.ic_launcher)
.setContentText(name).build();
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify((int) System.currentTimeMillis(), noti);
}
B, C 또는 D에서 시작할 때까지 원래 A 활동이 이미 파괴되고 있기 때문입니다. 따라서 OnCreate는 OnNewIntent ()의 Stead에서 호출됩니다. 이것을 해결하는 한 가지 방법은 새 A를 시작하기 전에 항상 기존 A (flag_activity_clear_task | flag_activity_task | flag_activity_task | flag_activity_task | flag_activity_task | flag_activity_task 사용)를 파괴하는 것입니다. ) 당신이 시작한 의도입니다.