안드로이드에서 활동을 닫고 이전 활동으로 돌아가는 방법


144

주요 활동이 있는데 버튼을 클릭하고 새로운 활동을 시작하면 다음 코드를 사용했습니다.

Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);

위의 코드는 주요 활동에서 실행되었습니다.

이제 메인 액티비티에 의해 호출되는 새로운 액티비티에는 뒤로 버튼이 있습니다. 이 뒤로 버튼을 클릭하면 새 활동을 닫고 원래의 기본 활동으로 돌아 가야합니다.

나는 전화를 시도 super.finish()하고 그냥finish() (새로운 활동에서) 내 응용 프로그램을 닫습니다 (주 활동 포함).

현재 포커스가있는 활동을 닫은 다음 주 활동으로 돌아가려면 어떻게해야합니까?

편집

휴대 전화의 뒤로 버튼도 전체 앱을 닫았다는 사실 때문에 두 번째 활동을 잘못 시작했다고 생각하게됩니까?


알았어

동일한 매니페스트 코드와 동일한 코드를 사용하여 활동을 시작하는 설정 활동을 만들었습니다.

뒤로 버튼을 누를 때 활동 설정의 경우 기본 활동으로 돌아갑니다.

주요 질문에서 위에서 언급 한 활동으로 단순히 전체 앱을 종료합니다.

따라서 문제는 활동을 끝내는 코드가 아니라 활동 자체 인 것처럼 보입니다.


4
뒤로 버튼이 필요하지 않으며 사용자가 전화 뒤로 키를 사용하도록 설정하면 아무것도 할 필요가 없습니다.
Hoan Nguyen

전화 뒤로 버튼은 보조 활동뿐만 아니라 참가 신청서를 닫습니다. 주요 활동을 닫고 싶지 않습니다.
Zapnologica

1
'뒤로'버튼은 그렇게하지 않아야합니다. 더 많은 코드를 보여줄 수 있습니까?
peejaybee 2014 년

편집 한 내용에 따라 2 차 활동은 게시 한 내용과 잘 어울립니다. 나는 TGMCians가 아마도 정답을 가지고 있다고 생각하고 당신은 당신의 목록을 조사합니다.
peejaybee 2014 년

답변을 참조하십시오. 이것이 도움이 될 것으로 보입니다
Muhammad Helmi

답변:


201

시작하기 전에 finish()메소드를 호출한다고 생각합니다.MainActivitySettingsActivity .

설명한 시나리오는 다음 두 가지 방법으로 발생합니다.

어느 한 쪽

당신은 설정 android:noHistory = "true"을위한 MainActivity내부 AndroidManifest.xml원인 MainActivityfinish BACK 키를 누르면 자동으로.

또는

'SettingsActivity'로 전환하기 전에을 (를) 호출 finish()하여 종료합니다 MainActivity. 뒤로 가기 버튼을 누르면 다른 활동이 스택에 사전 설정되어 있지 않기 때문에 기본 화면으로 돌아갑니다.


전화기의 '뒤로'버튼이 주요 활동을 취소하는 이유를 설명합니다.
peejaybee 2014 년

디버깅 할 때 finish () 후에 실행이 계속되는 것을 보았으므로 반환을 추가하는 것이 좋습니다.
까지

이 답변의 세 번째 이유는 첫 번째 반복이 아닌가?
Pang

60

현재 활동에서 finish ()를 호출하여 이전 활동으로 돌아갈 수 있습니다. finish () 호출 후 모든 코드가 실행됩니다. finish ()를 호출 한 후 리턴하여이 문제를 해결할 수 있습니다.

활동 1로 결과를 리턴하려면 활동 2를 시작할 때 다음이 필요합니다.

startActivityForResults(myIntent, MY_REQUEST_CODE);

호출 된 활동 내에서 onCreate () 매개 변수에서 Intent를 얻거나 사용할 수 있습니다.

getIntent();

결과를 활동 1로 리턴하고 활동 2에서 결과를 설정하려면

setResult(Activity.RESULT_OK, MyIntentToReturn);

돌아올 의사가 없다면 그냥 말해

setResult(Activity.RESULT_OK);

활동에 나쁜 결과가있는 경우 Activity.RESULT_CANCELED를 사용할 수 있습니다 (기본적으로 사용됨). 그런 다음 활동 하나에서

onActivityResult(int requestCode, int resultCode, Intent data) {
    // Handle the logic for the requestCode, resultCode and data returned...
}

활동 2를 끝내려면 이미 설정된 결과와 함께 finish ()와 동일한 메소드를 사용하십시오.


1
"finish () 호출 후 모든 코드가 실행됩니다. finish ()를 호출 한 후 리턴하면이 문제를 해결할 수 있습니다."여기서 'fix'는 잘못된 단어 선택입니다. 다음 줄의 실행을 피하는 것과 같습니다 (고정 아님).
Lo-Tan

14

버튼을 클릭하면 다음과 같이 전화를 걸 수 있습니다.

super.onBackPressed();

12

조각을 사용한다면 u는

getActivity().onBackPressed();

단일 활동을 사용하면 u를 사용할 수 있습니다.

finish();

7

대신이 코드를 사용해보십시오 finish:

onBackPressed();


2
ActivityB에서 ActivityA로 돌아갈 때 잘 작동합니다. 조각과 단일 활동의 경우 @Osama Ibrahim의 답변을 사용할 수 있습니다.
Eftekhari


4
Button edit = (Button) view.findViewById(R.id.yourButton);
edit.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this, YourMainActivity.class);
        startActivity(intent);
        finish();
    }
});


4

나는 당신의 두 번째 활동이 아마도 자녀 활동으로서의 주요 활동과 관련이 없다고 생각합니다. AndroidManifest.xml파일을 확인 하고 <activity>자녀 활동 항목에 android:parentActivityName속성이 포함되어 있는지 확인하십시오 . 다음과 같이 보일 것입니다 :

<?xml ...?>
...
<activity
    android:name=".MainActivity"
    ...>
</activity>
<activity
    android:name=".ChildActivity"
    android:parentActivityName=".MainActivity"
    ...>
</activity>
...

1

그냥 전화하지 않는 finish()당신에 MainActivity다음이을 제거해 당신을 재정의 할 필요가 onBackPressed()당신의에 SecondActivity당신이 그 기능에 다른 일을하지 않는합니다. 이 백 버튼의 "필요성"을 느끼는 경우에 당신은 간단하게 호출 할 수 있습니다 finish()상의 SecondActivity하고 당신에 당신을 데려 갈 것이다 MainActivity당신이 호출되지 않은만큼 finish()그것을


이 경로를 시도했지만 고해상도 PNG를 사용하는 약 10 개의 화면이 순서대로 있습니다. 문제는 약 7 화면에서 백 스택의 모든 활동으로 인한 메모리 부족 장치입니다. 각 활동에 대해 finish를 호출하기로 결정하고 가비지 수집을 허용하여 문제를 해결했지만 이제 백 스택이 비어 있기 때문에 백 동작이 수동으로 코딩되어야합니다. 이 문제에 부딪 치거나 Android의 메커니즘을 알고 있습니까?
Lo-Tan

뒤로 버튼으로 무엇을 하시겠습니까? 이전 항목 Activity으로 돌아가거나 항상 MainActivity? 또한 메모리가 부족한 경우 Docs의이 부분을Bitmaps 읽으십시오 . 그것은 나를 도왔다
codeMagic

@ Lo-Tan 이전 활동으로 돌아가고 싶다면 이미지의 메모리 관리를 알아 내고 활동을 끝내지 않아야한다고 생각합니다 (내가 제공 한 링크로). 그렇지 않으면, 당신은 활동의 새로운 인스턴스를 다시 만들고 어느 것으로 되돌아 갈 것인지 알아 내야합니다
codeMagic

뒤로 버튼을 사용하여 이전 화면으로 이동하고 싶습니다. 기본적으로 일련의 튜토리얼 화면이며 사용자는 앞으로 / 뒤로 이동할 수 있습니다. 각 화면은 많은 PNG를 디자인하고 사용합니다. 때로는 작은 섬네일이 아닌 대부분의 화면을 차지하는 PNG가 각 화면에 많은 메모리를 사용합니다.
Lo-Tan

@ Lo-Tan 나는 당신이 onBackPressed () 메소드를 재정의 한 다음 가고 싶은 활동을 수동으로 생성하고 싶다고 생각합니다. 그런 다음 현재있는 것을 종료하고 이전 것을 시작할 수 있습니다.
Zapnologica

1

이것이 유용한 지 아닌지는 모르겠지만 동일한 문제로 어려움을 겪고 있었고 전역 부울 변수와 onResume () 액션만으로도 매우 쉬운 방법을 찾았습니다. 필자의 경우 내 활동 C는 특정 버튼을 클릭하면 활동 B의 finish ()를 트리거해야합니다!

Activity_A-> Activity_B-> Activity_C

Activity_A (일반적으로 Activity_B가 열립니다)

Activity_B (일부 버튼 클릭시 Activity_C가 열립니다) :

// Global:
boolean its_detail = false;
// -------
SharedPreferences prefs =  getApplicationContext().getSharedPreferences("sharedpreferences", 0);
boolean v = prefs.getBoolean("select_client", false);

its_detail = v;

startActivity(C);

@Override
public void onResume(){
     super.onResume();
     if(its_detail == true){
        finish();
     }
}

따라서 활동 C의 버튼을 클릭 할 때마다 활동 B의 "onResume ()"기능을 수행하고 활동 A로 돌아갑니다.


1
 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if ( id == android.R.id.home ) {
            finish();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

도구 모음 뒤로 버튼 모두 하드웨어 뒤로 버튼 으로 작동 합니다 .


이것은 나를 위해 일했습니다. 또한 두 번째 와 MainActivitySettingsActivity 가있었습니다 android:parentActivityName=".MainActivity". 이 코드는 툴바에서 해당 홈 / 뒤로 단추를 처리하고 스택의 이전 활동으로 돌아가는 현재 활동을 완료합니다. 감사.
mortalis

1

Finish는 전체 응용 프로그램을 닫습니다. 이것은 Android 개발에서 싫어하는 것으로 마무리되지는 않지만 괜찮습니다.

startActivity(intent)

왜 안돼?

closeActivity (intent)?


1
이 질문에 대답합니까? 아니면 시도해 볼만한 제안입니까? 두 경우 모두, 호언 장담은 불필요하며 가능성이없는 SO에 오신 것을 환영합니다
질 Gouaillardet

1

우리는 매우 비슷한 상황에 직면했습니다.

활동 1 (개방)-> 활동 2 (미리보기)-> 활동 3 (세부 사항)

잘못된 "온 백 프레스"응답

  • 활동 3을 다시 누르면 장치 2가 닫힙니다.

위에 게시 된 모든 답변을 확인했지만 그중 아무것도 작동하지 않았습니다. 활동 2와 활동 3 간 전환을위한 Java 구문이 올바른지 검토했습니다.

써드 파티 앱을 호출 할 때 코딩에서 새로워졌습니다. 활동에 의해. 구성 각도를 조사하기로 결정했습니다. 결국 문제의 근본 원인을 파악할 수있었습니다.

범위 : 활동 2 구성 (발신자).

근본 원인 :

android:launchMode="singleInstance"

해결책 :

android:launchMode="singleTask"

이 "온 백 프레스"문제에 대해 singleInstance 는 호출 된 Activity와 함께 하나의 인스턴스에서 호출 된 Activity를 고려하는 반면, singleTask 는 의도 된 Back Press에서 작동 할 수있을 정도로 고유 한 ID를 가진 호출 된 Activity 를 허용합니다.


0
{ getApplicationContext.finish();   }

이 방법을 사용해보십시오.


이 코드 블록이 질문에 대답 할 수 있지만 그 이유에 대해 약간의 설명을 제공 할 수 있으면 가장 좋습니다.
David

0

finish ()를 호출하는 것이 가능할 수 있습니다. 클릭 버튼 이벤트에서 버튼을 클릭 한 직후에 메인 활동이 닫히고 다음 활동에서 돌아올 때 메인 활동이 이미 닫혀 있고 활성 활동이 없기 때문에 애플리케이션이 종료됩니다.


0

활동의 onCreate 메소드에서 다음 코드를 작성하십시오.

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

그런 다음 다음과 같이 활동에서 onOptionsItem 선택한 방법을 재정의하십시오.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case android.R.id.home:
            finish();
    }
    return super.onOptionsItemSelected(item);
}

그리고 당신은 갈 수 있습니다.


0

MainActivity에서 이것을 사용해야합니다

 Intent intent = new Intent(context , yourActivity);

            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
            context.startActivity(intent);

플래그는 MainActivity를 유지하는 여러 작업을 시작합니다. finish를 호출하면 다른 활동이 종료되고 MainActivity로 돌아갑니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.