Android에서 활동 재로드


220

AndroidActivity 에서 다시로드하는 것이 좋습니다 ?

가장 좋은 방법은 무엇입니까? this.finish그런 다음 this.startActivity활동과 함께 Intent?


3
저는 숙련 된 Android 개발자는 아니지만 활동을 다시 시작하면 디자인이 좋지 않은 것처럼 들리고 극단적 인 경우에만 수행해야합니다.
Hudson

@Hudson 구성 변경에 따라 발생합니다. 그것이 좋은 디자인인지 아닌지에 대해서는 완전히 다른 토론입니다. ;)
hpique

1
@Hudson 그래서 당신은 지금 5 년의 경험 개발자입니다 : D
Pratik Butani

@PratikButani, 당신을 알고 있습니까? :) 나는 8 년의 경험을 지금 좋아하지만 안드로이드 개발에서는 그리 많지 않습니다.
Hudson

P @Hudson : 당신은 내가 알고있는 내 프로필을 방문
Pratik Butani을

답변:


521

간단하게 사용할 수 있습니다

finish();
startActivity(getIntent());

Activity자체에서 새로 고치기 위해 .


2
액티비티 클래스 내에서 호출 할 수 없다면 컨텍스트 참조로 어떻게 할 수 있습니까?
giorgiline

1
@giorgiline-예, 활동 클래스 내부에서 정의하는 인터페이스를 만들고 해당 인터페이스를 사용하는 외부 클래스에 매개 변수로 전달하십시오.
집합

1
와우, 나는 이것이 쉬운 것이라고 생각하지 않았다.
theblang

1
결과를 위해 시작된 활동을 어떻게 다룰 수 있습니까? 원래 발신자가 여전히 결과를 받고있는 상태에서 다시 시작할 수 있습니까?
tothphu

1
@tothphu-시도하지는 않았지만 이론적으로는 그렇습니다. 그러나 활동이 두 번째 완료되면 처음으로 작성된 활동에 결과가 리턴되지 않습니다.
Sush

64

recreate () 메소드 후 깜박임 을보고 싶지 않은 사람들은 단순히

 finish();
 overridePendingTransition(0, 0);
 startActivity(getIntent());
 overridePendingTransition(0, 0);

2
대박! 사용자가 알지 못하도록 전환을 재정의하고 싶었습니다!
Ceddy Muhoza

잘 했어! 사용자는 리로드가 거의 눈에 띄지 않습니다.
sam

38

이것이 환경 설정 변경에서 돌아온 후 활동을 다시로드하기 위해 수행하는 작업입니다.

@Override
protected void onResume() {

   super.onResume();
   this.onCreate(null);
}

이것은 본질적으로 활동이 다시 그려 지도록합니다.

업데이트 : 더 좋은 방법은 recreate()메소드 를 호출하는 것입니다. 이로 인해 활동이 다시 작성됩니다.


15
작동 할 수도 있지만 수명주기 메소드를 명시 적으로 호출하지 않는 것이 좋습니다.
ITisha

이 경로를 사용하는 경우 onCreate ()를 호출하는 대신 모든 것을 설정하고 onCreate () 및 onResume ()에서 호출하는 별도의 init () 메소드를 사용해야합니다.
Tom

1
라이프 사이클 방법이 다른 용도로 사용되는 경우를 제외하고는 훌륭한 솔루션이 작동하지 않습니다. 예를 들어, 휴대 전화 카메라에 액세스하고 있는데 사진을 찍으면 화면이 내 활동으로 돌아가서보기에 게시됩니다. 수명주기 방법을 사용하여 새로 고침하면 카메라 프로세스가 시작되고 사진이 활동으로 돌아 가지 않고 처음부터 활동을 얻습니다. 알아야 할 예입니다.
Azurespot

1
recreate ()를 사용할 때 활동의 launchMode를 고려하는 것이 중요합니다. 예를 들어 launchMode = singleTop이있는 활동에서 recreate ()를 호출하면 나중에 onCreate ()가 호출되지 않습니다. OTOH, recreate ()를 호출하는 대신 finish ()를 명시 적으로 호출 한 다음 startActivity ()를 호출하면 나중에 onCreate ()가 호출되는 것을 볼 수 있습니다.
albert c braun

14

Intent를 사용하여 활동을 다시로드하기 위해 주어진 이전 답변을 보았습니다. 그것들은 작동하지만 Activity 클래스 자체에 주어진 recreate () 메소드를 사용하여 동일한 작업을 수행 할 수도 있습니다.

이것을 쓰는 대신

// 대화 상자를 닫으면 주 활동을 새로 고칩니다.

Intent refresh = new Intent(this, clsMainUIActivity.class);
startActivity(refresh);
this.finish();

이것은 이것을 작성하여 수행 할 수 있습니다

recreate();

recreate()"StartActivityForResult"를 사용하여 활동을 시작하고 동작이 중단됨에 따라 활동이 "다시 시작"되었습니다.
KYL3R


10

서둘러 응용 프로그램 중 하나에서 메시지 목록을 업데이트해야했기 때문에 대화 상자를 닫기 전에 기본 UI 활동을 새로 고쳤습니다.이 작업을 수행하는 더 좋은 방법이있을 것입니다.

// Refresh main activity upon close of dialog box
Intent refresh = new Intent(this, clsMainUIActivity.class);
startActivity(refresh);
this.finish(); //

9

Android에는 활동의 생성 및 소멸을 처리하는 프로세스 관리 시스템이 포함되어있어 수동으로 활동을 다시 시작하면 얻을 수있는 이점을 크게 무효화합니다. 이에 대한 자세한 내용은 Application Fundamentals 에서 확인할 수 있습니다.

그러나 모범 사례는 onPause 및 onStop 메소드가 활동 요구를 절대적으로 최소화하기 위해 onLowMemory 를 보유하고 사용할 필요가없는 모든 자원을 해제하도록하는 것 입니다.


2
onLowMemory를 언급하면 ​​+1입니다. 나는 그런 방법이 존재한다는 것을 몰랐다!
hpique

4

같은 의도로 시작 activity하고를 닫습니다 activity.

Intent refresh = new Intent(this, Main.class);
startActivity(refresh);//Start the same Activity
finish(); //finish Activity.

4

어떤 경우에는 최선의 방법입니다. 다른 경우에는 다음과 같은 방법으로 활동을 시작하여 아들에게 전달하는 것이 가장 좋습니다.

    Intent i = new Intent(myCurrentActivityName.this,activityIWishToRun.class);    
    startActivityForResult(i, GlobalDataStore.STATIC_INTEGER_VALUE);

일은 당신이 activityIWishToRun에서 끝날 때마다 살아있는 활동으로 돌아갑니다.


1
이것은 아마도 오래되었지만 많은 시간을 절약했습니다! :)
Lior Iluz

4

전체 활동을 다시로드하는 것은 힘든 작업 일 수 있습니다. ( kotlin )에 새로 고쳐야하는 코드 부분을 넣으십시오 .

override fun onResume() {
    super.onResume()
    //here...
}

자바:

@Override
public void onResume(){
    super.onResume();
    //here...

}

필요할 때마다 " onResume () "을 호출하십시오 .


2

나는 그것이 좋은 생각이라고 생각하지 않습니다 ... 깨끗한 방법을 구현하는 것이 좋습니다. 예를 들어, 활동에 양식이 있으면 클리너 메소드는 양식의 각 위젯을 지우고 모든 임시 데이터를 삭제할 수 있습니다. 나는 그것이 당신이 원하는 것 같아요 : 활동을 초기 상태로 복원하십시오.


실제로 응용 프로그램 상태를 변경 한 다음 변경 사항을 반영하기 위해 활동을 다시로드하고 싶습니다.
hpique

귀하의 경우 "응용 프로그램 상태"는 무엇입니까? 환경 설정?
zehrer

2

이것을 잠시 동안 실험 한 후에 활동을 다시 시작한 결과 예기치 않은 결과가 발견되지 않았습니다. 또한 방향이 변경 될 때 Android가 기본적으로하는 것과 매우 유사하다고 생각하므로 비슷한 상황에서이를 수행하지 않는 이유는 없습니다.


반대로 활동을 다시 시작하여 화면을 "새로 고침"하려고했습니다. 그것은 무엇이 잘못되었는지 표면에 나타나지 않았으며, 내 정보는 내가 원하는 방식으로 업데이트되었으며 LogCat은 다른 이야기를 들려줍니다. LogCat에서 활동의 onCreate 메소드로 돌아가서 환경 설정을 가져 오려고 시도합니다. 첫 번째 시도에서 null 포인터 예외가 발생하면 onCreate에서 다시 시작하여 두 번째로 storedPref를받습니다. 여기에서 무슨 일이 일어나고 있는지 잘 모르겠지만 WYSIWIG가 나에게 해당되지 않았기 때문에 단순히 결과를보고있는 것이 아니라고 확신하고 싶었습니다.
taraloca

활동을 정확히 다시 시작하고 있습니까?
hpique

2

나는 같은 문제가있다

import android.support.v4.content.IntentCompat;

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

이 코드는 저에게 효과적입니다. 안드로이드 API 17


2

액티비티에서는 액티비티 recreate()를 "재 작성"하도록 호출 할 수 있습니다 (API 11+).


1

나는 또 다른 접근 방식을 가지고 있었다 : launchMode내 활동의 설정 singleTop을 전화하지 않고 전화하지 않고 finish()바로 일을 startActivity(getIntent())할 것이다. onCreate()와 에서 모두 새 데이터를 관리해야합니다 onNewIntent. Sush의 방식으로 AMAN SINGH가 말한 것처럼 응용 프로그램이 깜박일 수 있습니다. 그러나 AMAN SINGH의 접근 방식은 여전히 ​​'깜박임'문제를 해결하더라도 불필요하게 새로운 활동을 창출 할 것이라고 생각합니다.

이 질문에 너무 늦었지만 누군가 해결책을 찾고 있다면 여기 있습니다.


0

로그인 후 동일한 문제가 발생하여 사용했습니다.

@Override
protected void onRestart() {
    this.recreate();
    super.onRestart();
}


0

나를 위해 그것은 다른 인 텐트를 만들지 않고 동일한 인 텐츠에 새로운 데이터를로드하고 있습니다.

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