문제

Android 문서에서 활동의 발사 모드 속성을 Singletop으로 설정하거나 추가하여 읽었습니다. FLAG_ACTIVITY_SINGLE_TOP 내 의도, 그 부름에 플래그 startActivity(intent) 단일 활동 인스턴스를 재사용하고 onNewIntent 콜백. 나는이 두 가지 일을 모두했다 onNewIntent 결코 해고하지 않고 onCreate 매번 발사합니다. 문서도 그렇게 말합니다 this.getIntent() 처음으로 만들어 졌을 때 활동에 처음 통과 된 의도를 반환합니다. ~ 안에 onCreate 전화 해요 getIntent 그리고 나는 매번 새로운 것을 얻고 있습니다 (나는 다른 활동에서 의도 객체를 만들고 추가를 추가하고 있습니다 ...이 추가는 그것이 나에게 같은 의도 대상을 돌려 주면 매번 동일해야합니다). 이 모든 것이 내 활동이 "싱글 탑"처럼 행동하지 않는다고 믿게합니다.

필요한 단계가 누락 된 경우 배경을 추가하려면 여기에 Manifest의 활동 선언과 활동을 시작하는 데 사용하는 코드가 있습니다. 활동 자체는 다음과 관련하여 언급 할 가치가 없습니다.

AndroidManifest.xml에서 :

    <activity
        android:name=".ArtistActivity"
        android:label="Artist"
        android:launchMode="singleTop">
    </activity>     

내 호출 활동에서 :

        Intent i = new Intent();
        i.putExtra(EXTRA_KEY_ARTIST, id);
        i.setClass(this, ArtistActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        startActivity(i);
도움이 되었습니까?

해결책

당신은 확인 했습니까? onDestroy() 또한 부름을 받았습니까? 아마도 그 이유 일 것입니다 onCreate() 대신 매번 호출됩니다 onNewIntent(), 활동이 이미 존재하는 경우에만 호출됩니다.

예를 들어 백 버튼을 통해 활동을 떠나면 기본적으로 파괴됩니다. 그러나 당신이 활동 스택을 다른 활동으로 더 높이 올라가면 거기에서 전화하십시오. ArtistActivity.class 다시 건너 뜁니다 onCreate() 그리고 직접 가십시오 onNewIntent(), 활동이 이미 생성되었고 당신이 그것을 다음과 같이 정의했기 때문에 singleTop Android는 새로운 인스턴스를 만들지 않지만 이미 거짓말을하고있는 인스턴스를 가져옵니다.

내가 무슨 일이 일어나고 있는지 보려고하는 일은 각 활동의 모든 다른 상태에 대해 더미 기능을 구현하므로 항상 지금 무슨 일이 일어나고 있는지 :

@Override
public void onDestroy() {
    Log.i(TAG, "onDestroy()");
    super.onDestroy();
}

동일합니다 onRestart(), onStart(), onResume(), onPause(), onDestroy()

위의 (백 버튼)이 문제가되지 않았다면,이 더미를 구현하면 최소한 더 나은 디버깅에 도움이됩니다.

다른 팁

허용 된 대답은 정확하지 않습니다. ondestroy ()가 이전에 호출되면 예, oncreate ()는 항상 호출됩니다. 하지만, 이 진술은 잘못되었습니다: "활동 스택이 다른 활동으로 더 높아져서 ArtistActivity에 다시 전화하면 oncreate ()를 건너 뛰고 onnewintent ()로 직접 이동합니다."

"Singletop"섹션 http://developer.android.com/guide/components/tasks-and-back-stack.html 그것이 어떻게 작동하는지 설명합니다 (아래의 대담한 텍스트에 대한 관심; 나는 또한 내 자신의 디버깅을 통해 이것을 증명했습니다) :

"예를 들어, 작업의 백 스택이 활동 B, C 및 D가있는 루트 활동 A로 구성되어 있다고 가정합니다.스택은 ABCD입니다. D가 맨 위에 있습니다). D 유형 D의 활동에 대한 의도가 도착합니다. D에 기본 "표준"런치 모드가있는 경우 클래스의 새로운 인스턴스가 시작되고 스택은 ABCDD가됩니다. 그러나 D의 발사 모드가 "Singletop"인 경우 기존 D 인스턴스는 스택의 상단에 있기 때문에 Onnewintent ()를 통해 의도를받습니다. 스택은 ABCD로 유지됩니다. 하지만, 유형 B의 활동에 의도가 도착하면 발사 모드가 "싱글 탑"인 경우에도 새로운 B 인스턴스가 스택에 추가됩니다.

다시 말해서, Single_Top을 통해 활동을 시작하면 기존 활동이있는 경우에만 재사용됩니다. 이미 스택 상단에 있습니다. 동일한 작업의 다른 활동이 상단에 있으면 작동하지 않습니다 (예 : startActivity (Single_Top)를 실행하는 활동). 대신 새 인스턴스가 생성됩니다.

이 문제를 해결하는 두 가지 방법이 있습니다 당신이 원하는 싱글_top 동작을 얻을 수 있도록 새로운 활동을 만드는 대신 기존 활동을 재사용하는 것입니다.

첫 번째 방법 (허용 된 답변의 주석 섹션에 설명 된대로) : 활동에 "Singletask"의 발사 모드를 추가 할 수 있습니다. Singletask는 주어진 작업에 특정 활동의 하나의 인스턴스 만있을 수 있다는 것을 의미하기 때문에 Newintent ()를 강제합니다. 앱이 특정 상황 (내 프로젝트와 같이)에서 해당 활동의 여러 인스턴스가 필요한 경우 나사로 나사가되기 때문에 이것은 다소 해킹 된 솔루션입니다.

두 번째 방법 (더 나은) :flag_activity_single_top 대신 flag_activity_reorder_to_front를 사용하십시오. 이렇게하면 기존 활동 인스턴스를 스택 상단으로 옮겨서 재사용합니다 (onnewintent ()는 예상대로 호출됩니다).

flag_activity_single_top의 주요 목적은 여러 활동 인스턴스의 생성을 방지하는 것입니다. 예를 들어, 해당 활동이 응용 프로그램의 주요 작업 외부에서 나오는 의도를 통해 시작될 수있는 경우. 내 앱의 활동 사이의 내부 전환을 위해 깃발이 _activity_reorder_to_front가 일반적으로 원하는 대신 원하는 것임을 발견했습니다.

이 깃발을 의도로 설정하십시오.

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top