문제

활동이 있습니다 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 사용)를 파괴하는 것입니다. ) 당신이 시작한 의도입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top