[android] Activity.finish () 메소드는 정확히 무엇을합니까?

한동안 안드로이드 응용 프로그램을 개발 중이며 활동 수명주기 및 응용 프로그램 수명주기에 대한 많은 게시물을 따랐습니다.

나는 Activity.finish()메소드 호출을 어딘가에 호출 Activity.onDestroy()하고 스택에서 액티비티를 제거한다는 것을 알고 있으며, 어떻게 든 운영 체제와 가비지 콜렉터가 “트릭을 수행하고”좋은 시간이되면 메모리를 확보 할 수 있다고 생각합니다. 그래서….

이 게시물에 왔습니다-
응용 프로그램을 종료하는 것은 눈살을 찌푸리고 있습니까? Mark Murphy의 답변을 읽으십시오.

정확히 finish()방법이 실제로 하는 일에 대해 약간 혼란 스러웠습니다 .

내가 전화 할게 기회가 있습니까 finish()onDestroy()호출되지 않습니다는?



답변

finish()활동을 호출 하면 메소드 onDestroy()가 실행됩니다. 이 방법은 다음과 같은 작업을 수행 할 수 있습니다.

  1. 활동이 관리하고있는 대화를 닫습니다.
  2. 활동이 관리하고있는 커서를 닫으십시오.
  3. 열려있는 검색 대화 상자를 모두 닫습니다.

또한 onDestroy()소멸자가 아닙니다. 실제로 객체를 파괴하지는 않습니다. 특정 상태에 따라 호출되는 메소드 일뿐입니다. 따라서 슈퍼 클래스가 onDestroy()실행되고 돌아온 후에도 인스턴스는 여전히 살아 있고 매우 잘 * 사용 됩니다. 프로세스가 수행하지 않고 메모리를 회수해야하는 경우 프로세스가 종료됩니다.


답변

@K_Anas에서 내 2 센트가 대답합니다. finish () 메소드에서 간단한 테스트를 수행했습니다. 활동 수명주기에서 중요한 콜백 메소드 나열

  1. onCreate ()에서 finish () 호출 : onCreate ()-> onDestroy ()
  2. onStart ()에서 finish () 호출 : onCreate ()-> onStart ()-> onStop ()-> onDestroy ()
  3. onResume ()에서 finish () 호출 : onCreate ()-> onStart ()-> onResume ()-> onPause ()-> onStop ()-> onDestroy ()

내가 말하고자하는 것은 finish ()가 실행될 때 사이에있는 메소드와 함께 메소드의 대응 부분이 호출된다는 것입니다.

예 :

 onCreate() counter part is onDestroy()
 onStart() counter part is onStop()
 onPause() counter part is onResume()


답변

의도 후 finish ()를 호출하면 “뒤로”버튼으로 이전 활동으로 돌아갈 수 없습니다.

startActivity(intent);
finish();


답변

onDestroy()최종 정리를위한 것입니다. 자신이 직접 할 수있는 리소스를 확보하고 열린 연결, 리더, 작성자 등을 닫습니다. 재정의하지 않으면 시스템이 필요한 작업을 수행합니다.

반면에, finish()프로그래머에게 전류 Activity가 완료 되기를 원한다는 것을 시스템에 알리십시오 . 따라서 onDestroy()그 후에 호출됩니다 .

주목할 사항 :

그것은 그 필요는 없습니다 의 호출 finish()트리거 호출에 onDestroy(). 아시다시피, 안드로이드 시스템은 Activity해제 해야하는 전류에 필요한 리소스가 있다고 생각되면 활동 을 자유롭게 종료 할 수 있습니다.


답변

Finish () 메소드는 현재 활동을 파괴합니다. 사용자가 뒤로 버튼을 누를 때이 활동을 다시로드하지 않으려는 경우이 방법을 사용할 수 있습니다. 기본적으로 현재 스택에서 활동을 지 웁니다.


답변

위의 @rommex 답변 외에도 finish()활동 파괴가 대기하고 활동 우선 순위에 달려 있음을 알았 습니다.

finish()이후 onPause()에 전화하면이 표시 onStop()되고 onDestroy()즉시 전화했습니다.

finish()이후 onStop()에 전화하면 onDestroy()5 분 후에 는 표시되지 않습니다 .

내 관찰에 따르면, 마무리가 대기중인 것처럼 보이고 그것을 보았을 때로 adb shell dumpsys activity activities설정 finishing=true되었지만 더 이상 포 그라운드에 없기 때문에 파괴 우선 순위가 지정되지 않았습니다.

요약하면 onDestroy()호출이 보장되지는 않지만 호출 된 경우에도 지연 될 수 있습니다.


답변

다양한 답변과 메모에 따르면 finish ()는 onPause () 및 onStop ()을 건너 뛰고 onDestroy ()를 직접 실행할 수 있다고 주장합니다. 공평하게 말하면, 이것에 대한 Android 문서 ( http://developer.android.com/reference/android/app/Activity.html )는 “활동이 시스템에 의해 마무리되거나 파괴되고 있습니다”라고 지적하지만 상당히 모호하지만 finish ()는 onDestroy ()로 이동할 수 있습니다.

finish ()의 JavaDoc은 비슷하게 실망스럽고 ( http://developer.android.com/reference/android/app/Activity.html#finish () ) 실제로 종료에 대한 응답으로 어떤 메소드가 호출되는지 기록하지 않습니다. ().

그래서이 미니 응용 프로그램을 아래에 작성하여 진입시 각 상태를 기록합니다. finish ()를 호출하는 버튼이 포함되어있어 어떤 메소드의 로그가 실행되는지 확인할 수 있습니다. 이 실험은 finish () 가 실제로 onPause () 및 onStop ()을 호출 한다고 제안했습니다 . 내가 얻는 결과는 다음과 같습니다.

2170-2170/? D/LIFECYCLE_DEMO INSIDE: onCreate
2170-2170/? D/LIFECYCLE_DEMO INSIDE: onStart
2170-2170/? D/LIFECYCLE_DEMO INSIDE: onResume
2170-2170/? D/LIFECYCLE_DEMO User just clicked button to initiate finish()
2170-2170/? D/LIFECYCLE_DEMO INSIDE: onPause
2170-2170/? D/LIFECYCLE_DEMO INSIDE: onStop
2170-2170/? D/LIFECYCLE_DEMO INSIDE: onDestroy

package com.mvvg.apps.lifecycle;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

public class AndroidLifecycle extends Activity {

    private static final String TAG = "LIFECYCLE_DEMO";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "INSIDE: onCreate");
        setContentView(R.layout.activity_main);
        LinearLayout layout = (LinearLayout) findViewById(R.id.myId);
        Button button = new Button(this);
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                Toast.makeText(AndroidLifecycle.this, "Initiating finish()",
                        Toast.LENGTH_SHORT).show();
                Log.d(TAG, "User just clicked button to initiate finish()");
                finish();
            }

        });

        layout.addView(button);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "INSIDE: onStart");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "INSIDE: onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "INSIDE: onDestroy");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "INSIDE: onPause");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "INSIDE: onResume");
    }

}