2011-08-01 4 views
4

스택에서 활동을 다시로드하려고합니다.활동을 시작할 때 onCreate()가 호출되지 않도록하려면 어떻게해야합니까?

나는 새로운 활동을 시작하기 위해 startActivity()을 사용합니다. When on 활동 D활동 A을 다시로드하고 새 인 텐트를 시작하지 않겠습니다. D에서 호출 할 때 이 일부 데이터를 가져 오기 위해 스레드를 시작하기 때문에 startActivity()을 사용할 수 없습니다.

수정 : 스택을 업데이트했습니다.

FLAG_ACTIVITY_REORDER_TO_FRONT을 사용하는 경우 onCreate() 메서드를 다시 호출합니다.

내 시나리오는 다음과 같습니다.

Login Activity ̣→ Activity A → Activity B → Activity C → Activity D → Activity A 

onCreate()은 어떻게 호출합니까?

답변

5

완전히 다른 접근 방식을 취해야합니다.액티비티를 시작할 때 또는 startActivityForResult()으로 액티비티를 시작하면 onCreate(), onStart()onResume()이 호출되기 때문에 중요하지 않습니다.

이제 작업 클래스에서 작업을 수행하기 위해 다른 스레드를 시작하는 메서드가있는 경우 플래그로 작업해야합니다. 액티비티가 처음 실행될 때 자동으로 스레드를 시작해야한다면 if 절을 둘러 싸서 처음 실행될 때 설정 한 플래그를 확인해야합니다.

아이디어는 스레드가 처음 실행될 때 Application 인스턴스 또는 SharedPreferences 인스턴스에서 활동을 부울로 설정하는 것입니다. 해당 액티비티로 돌아와서 onCreate()이 호출되어 자동으로 해당 스레드가 실행되기를 원하지 않으면 아래 예제에서와 같이 if 코드 절을 사용하여 호출 코드를 래핑해야합니다.

다음은 예입니다.

@Override 
public void onCreate(Bundle bundle) { 
    super.onCreate(bundle); 
    // Other stuff 

    if (!YourApplicationInstance.wasCalled) { 
     // Run your thread or do something else you want to do only once. 

     // Set the wasCalled flag to true to not run this code again 
     // if onCreate() is called a second time. 
     YourApplicationInstance.wasCalled = true; 
    } 
} 

당신은 내 의사 클래스 YourApplicationInstance를 구현하는 방법을 이해하는 Using Application context everywhere?를 읽을해야합니다.

0

1) 잘 모르겠지만 startActivity() 대신 startActivityForResult()를 사용해보십시오. 나는 이것이 활동을 완전히 끝내고 다시 시작하지 않는다고 생각한다. 더 이상 그런 방법을 구현하는 방법을 읽기 위해서는 this 링크를 사용하는 것이 좋습니다.

2) 또는 D -> A 작업을 수행 할 때 startActivity()를 계속 사용하지만 더미를 추가로 전달하십시오. 그런 다음 활동 A에서 if 문을 사용하십시오.

건배. 이게 도움이 되길 바란다.

+0

** ** ** :'if' 문에주의! – Kgrover

2

매니페스트의 활동에 launchMode라는 태그가 있습니다. 체크 아웃은 link입니다. 그러면 onCreate가 호출되지 않지만 onNewIntent가 호출되어 다시 초기화 할 수 있습니다.

2

다음 내용은 사실이 아닙니다. 에 startActivityForResult() startActivity를()는() 대신 startActivity를보다)에 startActivityForResult를 (사용하려고 호출 활동

의 반환 대상에 차이가 있습니다. 나는 이것이 활동을 완전히 끝내고 다시 시작하지 않는다고 생각한다. I 은 이러한 방법을 구현하는 방법을 더 자세히 읽으려면이 링크를 사용하는 것이 좋습니다.

그래서 @Kgrover의 포인트 2는 보유하지 않습니다.

의도 플래그 http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_REORDER_TO_FRONT이 정확히 수행합니다.

활동 전환을 중심으로 요구 사항이있을 때마다 인 텐트 플래그를주의 깊게 살펴보십시오. 이 시스템은 탁월한 지원을합니다.

이는 Sam Quest의 솔루션과 동일합니다. 단, 유일한 차이점은 launchMode을 설정하면 활동의 스택 동작이 하드 코드되어, 즉 활동 A가 항상 singleTask 모드에 있다는 것입니다.

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

이렇게하면 하위 작업이 중단됩니다. 그래서 부모 활동은 다시 만들어지지 않는다.

관련 문제