onNewIntent () 라이프 사이클 및 등록 된 리스너


150

를 통해 검색 대화 상자에서 의도를 수신하기 위해 singleTop Activity를 사용하고 onNewIntent()있습니다.

내가 알아 차린 것은 onPause()전에 onNewIntent()호출 된 다음 호출 onResume()됩니다. 시각적으로 :

  • 검색 대화가 시작되었습니다
  • 활동에 해고 된 검색 의도
  • onPause()
  • onNewIntent()
  • onResume()

문제는 내가에 등록 된 리스너해야한다는 것입니다 onResume()제거하는 GET을 onPause(),하지만 그들은 내부에 필요한 onNewIntent()전화를. 그러한 청취자를 이용할 수있게하는 표준 방법이 있습니까?

답변:


294

onNewIntent()는 스택의 다른 곳에서 이미 실행되어 호출 할 수없는 singleTop 활동의 진입 점으로 사용됩니다 onCreate(). 따라서 활동 라이프 사이클 관점에서 onPause()전에 호출 해야 onNewIntent()합니다. 이 리스너를 사용하지 않도록 활동을 다시 작성하는 것이 좋습니다 onNewIntent(). 예를 들어 대부분의 경우 내 onNewIntent()방법은 다음과 같습니다.

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    // getIntent() should always return the most recent
    setIntent(intent);
}

모든 설정 로직에서 일어나고으로 onResume()활용하여 getIntent().


@Rodja는이에 대해 언급하시기 바랍니다 것입니다 stackoverflow.com/questions/19092631/...을
개발자

3
원래의 질문에 관련 : 검색 처리하는 코드를 이동하는 경우 명심 Intent로를 onResume(), 당신의 활동은 아마하는이 다시 시작 때마다 검색 실행 당신이 원하는 아마 동작을 시도 할 것이다.
Tony Chan

1
Rodja의 말 : 액티비티 라이프 사이클 관점에서 onNewIntent () 안드로이드가 이런 식으로 디자인하기 전에 onPause ()를 호출해야합니다. 활동이 이미 수명주기를 거쳐 resume ()에 도달했습니다. 안드로이드가 onPause ()를 호출 한 다음 onResume ()을 다시 호출 할 필요가 없습니다. 앱이 재개되면 os는 단순히 onNewIntent ()를 호출하고 재개 된 상태를 유지할 수 있습니다.
Sani Elfishawy 2016 년

Rodja의 말 : 활동 라이프 사이클 관점에서 onNewIntent () 안드로이드가 그것을 설계 할 필요가 있기 전에 onPause ()를 호출 할 필요가 있습니다. 활동이 이미 수명주기를 거쳐 재개되었습니다. 행위가 재개되면 단순히 onNewIntent ()를 호출하고 재개 된 상태를 유지할 수 있습니다. Android 시퀀스의 문제점은 사용자 작업으로 인한 onPause와 배경 의도로 인한 onPause를 구분할 수 없다는 것입니다. 사용자 작업의 경우에만 onPause를 수행하려면 나중에 onPause ()로 이동하는 이유를 알지 못하므로 문제가 발생합니다.
Sani Elfishawy 2016 년

중요한 점은 getIntent ()는 여전히 원래의 인 텐트를 반환한다는 것입니다. setIntent (Intent)를 사용하여 새 의도로 업데이트 할 수 있습니다.
linuxjava

15

참고 : 다른 방법으로 라이프 사이클 메소드를 호출하는 것은 좋지 않습니다. 아래 예제에서 귀하의 onNewIntent가 항상 활동 유형에 관계없이 호출되도록 노력했습니다.

OnNewIntent ()는 활동이 처음 작성된 경우를 제외하고 항상 singleTop / Task 활동에 대해 호출됩니다. 이때 onCreate는이 스레드에서 요청 된 몇 가지 쿼리에 대한 솔루션 제공을 호출합니다.

onNewIntent를 다음과 같은 onCreate 메소드에 넣어 항상 호출 할 수 있습니다

@Override
public void onCreate(Bundle savedState){
    super.onCreate(savedState);
    onNewIntent(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
  super.onNewIntent(intent);
  //code
}

59
일반적으로 라이프 사이클 메소드를 직접 호출하는 것은 좋지 않습니다. 아마도 무해하거나 onNewIntent ()의 기본 구현에서 onPause ()가 이미 호출되었다고 가정합니까? 두 곳에서 호출 할 수있는 메서드로 앱 코드를 캡슐화하는 것이 더 안전 할 것입니다.
BernalKC

12
동의했다. 우리는이 접근법을 사용하여 몇 가지 엣지 사례를 발견했습니다. 피하는 것이 가장 좋습니다.
Saad Farooq

3
예 .. 나도 이것을 피하는데 동의합니다 ... 이것은 onCreate에서 onNewIntent를 호출하려는 사람들을위한 것입니다.
Pawan Maheshwari
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.