ProgramingTip

navigateUpFromSameTask ()를 사용하여 활동에서 복귀

bestdevel 2020. 11. 7. 10:20
반응형

navigateUpFromSameTask ()를 사용하여 활동에서 복귀


I 활동이 처음 시작되는 두 활동, A와 B를 가지고, 상기 액세스를 Intent((가)에 전달하기 때문에 Bundle인 것이 null처음부터되어야 같이), 및 정보를 표시하므로 :

CustInfo m_custInfo;
...
protected void onCreate(Bundle savedInstanceState)
{
    ...
    Bundle bundle = (savedInstanceState == null) ? getIntent().getExtras() : savedInstanceState;
    m_custInfo = (CustInfo) m_bundle.getSerializable("CustInfo");
    if (m_custInfo != null
        ...
}

이것은 처음부터 잘 작동합니다. EditText컨트롤과는 ListView제대로 작성된다.

이제 목록의 항목을 클릭하면 활동 B가 시작되어 세부 정보가 표시됩니다.

m_custInfo = m_arrCustomers.get(pos);

Intent intent = new Intent(A.this, B.class);
intent.putExtra("CustInfo", m_custInfo); // CustInfo is serializable
// printing this intent, it shows to have extras and no flags

startActivityForResult(intent, 1);

활동 B가 시작되기 직전에 프레임 워크는 A의 재정의를 호출합니다 onSaveInstanceState().

protected void onSaveInstanceState(Bundle outState)
{
    super.onSaveInstanceState(outState);

    outState.putSerializable("CustInfo", m_custInfo);
}

활동 B에서 작업 표시 줄에서 위로 버튼을 표시 활동 A로 돌아가서 이전과 동일한 상태를 유지합니다.

public boolean onOptionsItemSelected(MenuItem item)
{
    if (item.getItemId() == android.R.id.home)
    {
        Intent intent = NavUtils.getParentActivityIntent(this);
        // printing this intent, it shows to have flags but no extras

        NavUtils.navigateUpFromSameTask(this); // tried finish() here but that created an even bigger mess
        return true;
    }
    ...
}

여기에 문제 onCreate()가 있습니다. A 활동에 두 번째로 게재 Bundle되는 변수가 null 이고를 getExtras() 반환합니다 null. onSaveInstanceState()이 호출 된 이후 Bundle그 변수가 비 null.

다른 웹 사이트 에서이 문제에 대해 실험적으로 사용했지만 작동하지 않습니다.


애플리케이션이 이러한 방식으로 반응하도록 선택적으로 다음과 활동을 같이 선언해야합니다.

android:launchMode="singleTop"

AndroidManifest.xml에 있습니다.

텍스트 안드로이드는 표준 실행 모드를 사용합니다.

"시스템은 항상 대상 작업에서 활동의 새 인스턴스를 만듭니다."

활동이 다시 생성됩니다 ( Android 문서 참조 ).

singleTop을 사용하면 시스템이 작업의 백 스택 맨 위에있는 경우 기존 활동 (원래 추가 포함)으로 돌아갑니다. 이 상황에서는 onSaveInstanceState를 구현할 필요가 없습니다.

귀하의 활동이 이전에 OS에 의해 종료되지 않았 음 때문에 savedInstanceState는 귀하의 경우 null입니다.

주의 사항 ( 이를 지적 해 주신 Android 개발자에게 감사드립니다 ) :

이것이 질문에 대한 해결책이지만, 활동 돌아온 이 백 스택의 맨 위에 있지 않으면 작동 하지 않습니다 . C를 시작하는 B를 시작하는 활동 A의 경우를 고려하고 C의 상위 활동은 A로 구성됩니다. NavigateUpFromSameTask()C에서 호출하면 A가 스택의 맨 위에 있지 활동이 다시 생성됩니다.

이 경우 대신 다음 코드를 사용할 수 있습니다.

Intent intent = NavUtils.getParentActivityIntent(this); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); 
NavUtils.navigateUpTo(this, intent);

이것은 NavUtils.navigateUpFromSameTask()기본적으로 startActivity(intentForActivityA). 활동 기본값가 android:launchMode="standard"사용하는 경우 활동의 새 인스턴스가 작성되고 저장된 상태가 사용되지 않습니다. 이 문제를 해결하는 방법에는 세 가지가 있으며 다양한 장단점이 있습니다.

옵션 1

활동 B에서 getParentActivityIntent ()재정의 하고 활동 A에 필요한 적절한 추가 항목을 지정합니다.

@Override
public Intent getParentActivityIntent() {
    Intent intent = super.getParentActivityIntent();
    intent.putSerializable("CustInfo", m_custInfo);
    return intent;
}

참고 : ActionBarActivity 및 지원 라이브러리의 도구 모음을 사용하는 경우 대신 getSupportParentActivityIntent () 를 재정의해야합니다 .

사용자가 활동 B로 이동 한 방법에 관계없이 작동하므로 이것이 가장 우아한 솔루션이라고 생각합니다. 사용자가 활동 A를 거치지 않고 활동 B로 직접 이동하면 아래에 나열된 두 가지 옵션이 올바르게 작동하지 않습니다. B는 알림 또는 URL 처리기에서 시작됩니다. 이 시나리오가 '위로'탐색 API가 복잡하고 단순히 멍청한 뒤로 버튼으로 작동하지 않는 이유라고 생각합니다.

이 솔루션의 한 가지 단점은 이전 활동으로 돌아가는 애니메이션 대신 표준 시작-새 활동 전환 애니메이션이 사용된다는 것입니다.

옵션 2

위로 버튼을 가로 채서 onNavigateUp () 을 재정 의하여 멍청한 뒤로 버튼으로 취급합니다 .

@Override
public boolean onNavigateUp() {
    onBackPressed();
    return true;
}

참고 : ActionBarActivity 및 지원 라이브러리의 도구 모음을 사용하는 경우 대신 onSupportNavigateUp () 을 재정의해야합니다 .

이 솔루션은 약간 엉망이며 "up"및 "back"이 동일하게 작동해야하는 응용 프로그램에서만 작동합니다. "위로"와 "뒤로"가 동일하게 작동해야하는 경우 왜 위로 버튼을 사용 하는가? 이 솔루션의 한 가지 장점은 이전 활동으로 돌아가는 표준 애니메이션이 사용된다는 것입니다.

옵션 3

yonojoy가 제안한대로 android:launchMode="singleTop"활동 A를 설정 합니다. 자세한 내용은 그의 답변 을 참조하십시오. 참고 singleTop모든 응용 프로그램에 적합하지 않습니다. 당신은 그것을 시도하고 / 또는 스스로 결정하기 위해 문서읽는 데 시간을 할애 해야 할 것입니다.


전화하는 대신 NavUtils.navigateUpFromSameTask

탐색하기 전에 상위 인 텐트를 가져와 수정할 수 있습니다. 예를 들면 :

Intent intent = NavUtils.getParentActivityIntent(this);
intent.putExtra("CustInfo", m_custInfo); // CustInfo is serializable
NavUtils.navigateUpTo(this, intent);

이는 똑같이 동작 NavUtils.navigateUpFromSameTask하지만 인 텐트에 추가 속성을 추가 할 수 있습니다. 코드는 NavUtils.navigateUpFromSameTask매우 간단합니다.

public static void navigateUpFromSameTask(Activity sourceActivity) {
    Intent upIntent = getParentActivityIntent(sourceActivity);

    if (upIntent == null) {
        throw new IllegalArgumentException("Activity " +
                sourceActivity.getClass().getSimpleName() +
                " does not have a parent activity name specified." +
                " (Did you forget to add the android.support.PARENT_ACTIVITY <meta-data> " +
                " element in your manifest?)");
    }

    navigateUpTo(sourceActivity, upIntent);
}

상위 활동을 SINGLE_TOP로 만드는 것은 일부 간단한 응용 프로그램에서 작동 할 수 있지만이 활동이 상위 활동에서 직접 시작되지 않은 경우 어떻게됩니까? 또는 부모가 백 스택의 여러 위치에 존재하기를 합법적으로 원할 수 있습니다.


이것이 기본 Activity 클래스에 추가되는 더 일반적인 솔루션이라고 생각합니다.

@Override
public boolean onOptionsItemSelected(final MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
        final Intent upIntent = NavUtils.getParentActivityIntent(this);
        if (upIntent == null)
            onBackPressed();
        else
            //optionally add this flag to the intent: Intent.FLAG_ACTIVITY_SINGLE_TOP
            NavUtils.navigateUpTo(this, upIntent);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

특정 상위 활동으로 이동하려는 각 활동에 대해 매니페스트에서 다음을 사용합니다.

    <activity android:parentActivityName="pathToParentActivity" ...>
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="pathToParentActivity"/>
    </activity>

또한 minSdk가 API 16에서 가져온 경우 "meta-data"태그를 제거하여 매니페스트에 대신 사용합니다.

    <activity android:parentActivityName="pathToParentActivity" ...>
    </activity>

여기에 더 많은 정보


다음을 언급합니다.

활동 B에서 작업 표시 줄에서 위로 버튼을 누르면 활동 A로 돌아가서 이전과 동일한 상태에 있도록하고 싶습니다.

활동 A의 콘텐츠가 조각에 상주하는 경우 조각의 onCreate ()에서 setRetainInstance (true)를 호출합니다.

그런 다음 Fragment 인스턴스는 활동 레크리에이션 동안 유지됩니다.

참고 URL : https://stackoverflow.com/questions/14462456/returning-from-an-activity-using-navigateupfromsametask

반응형