English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
1. onNewIntent()
IntentActivity에서 다음 메서드를 재정의합니다: onCreate, onStart, onRestart, onResume, onPause, onStop, onDestroy, onNewIntent
1다른 애플리케이션이 Intent를 보낼 때, 다음 메서드를 실행합니다:
onCreate
onStart
onResume
Intent 발생 방법:
Uri uri = Uri.parse("philn:",//blog.163.com"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it);
2Intent 수신 선언:
<activity android:name=".IntentActivity" android:launchMode="singleTask" android:label="@string/testname"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="philn"/> </intent-filter> </activity>
3IntentActivity가 작업 스택의 최상단에 있을 때, 즉 이전에 열린 Activity가 현재 onPause, onStop 상태일 때, 다른 애플리케이션이 Intent를 보내면 실행 순서는 다음과 같습니다:
onNewIntent, onRestart, onStart, onResume.
안드로이드 애플리케이션 개발 중에는, 하나의 Activity에서 다른 Activity를 시작하고 새 Activity에 데이터를 전달하는 것은 매우 간단하지만, 백그라운드에서 실행 중인 Activity가 프론트그라운드로 돌아가 데이터를 전달할 때는 작은 문제가 발생할 수 있습니다.
먼저, 기본적으로, Intent를 통해 Activity를 시작하면, 이미 실행 중인 동일한 Activity가 존재하더라도, 시스템은 새로운 Activity 인스턴스를 생성하고 표시합니다. Activity 인스턴스가 여러 번 생성되지 않도록 하기 위해, AndroidManifest.xml에서 activity의 로드 방식(launchMode)을 설정하여 단일 작업 모드를 구현해야 합니다. 다음과 같이 합니다:
<activity android:label="@string/app_name" android:launchmode="singleTask"android:name="Activity1></activity>
launchMode이 singleTask일 때, Intent를 통해 Activity를 시작하면, 시스템이 이미 존재하는 인스턴스가 있다면, 이 인스턴스에 요청을 보냅니다. 그러나 이때 시스템은 일반적으로 요청 데이터를 처리하는 onCreate 메서드를 호출하지 않고, 다음과 같이 onNewIntent 메서드를 호출합니다:
protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent);//getIntent()이 오래된 것을 반환하지 않는 한 새로운 intent를 저장해야 합니다 processExtraData(); }
기억해야 합니다, 시스템은 언제든지 백그라운드에서 실행 중인 Activity를 종료할 수 있습니다. 이러한 일이 발생하면 시스템은 onCreate 메서드를 호출하고 onNewIntent 메서드를 호출하지 않습니다. 좋은 해결책은 onCreate와 onNewIntent 메서드에서 동일한 데이터 처리 메서드를 호출하는 것입니다. 다음과 같이 합니다:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); processExtraData(); } protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent);//getIntent()이 오래된 것을 반환하지 않는 한 새로운 intent를 저장해야 합니다 processExtraData(); } private void processExtraData(){ Intent intent = getIntent(); //여기서 받은 데이터를 사용하세요 }
두 번째, onNewIntent()의 setIntent()과 getIntent()
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); // setIntent(intent); int data = getIntent().getIntExtra("HAHA", 0); // int data = intent.getIntExtra("HAHA", 0); }
setIntent(intent)을 호출하지 않으면, getIntent()이 가져오는 데이터는 예상한 것과 다를 수 있습니다. 그러나 intent.getInXxx를 사용하면 정확한 결과를 얻을 수 있습니다.
이 문장에 주의하세요:
getIntent()은 여전히 원래의 Intent를 반환합니다. 이를 새로운 Intent로 업데이트하려면 setIntent(Intent)을 사용할 수 있습니다.
따라서 setIntent(intent)을 호출하는 것이 가장 좋습니다. getIntent()을 사용할 때 문제가 발생하지 않도록 합니다.
이것이 Android onNewIntent() 트리거 메커니즘 및 주의사항에 대한 자료 정리입니다. 이후 추가 자료를 계속 보충하겠습니다. 많은 지원에 감사합니다!
성명서:이 문서의 내용은 인터넷에서 가져왔으며, 저작권자는 모두에게 있습니다. 내용은 인터넷 사용자가 자발적으로 기여하고 업로드한 것이며, 이 웹사이트는 소유권을 가지지 않으며, 인공 편집 처리를 하지 않았으며, 또한 관련 법적 책임을 부담하지 않습니다. 저작권 침해가 의심되는 내용이 있을 경우, notice#w로 이메일을 보내 주시기 바랍니다.3codebox.com(메일을 보내는 경우, #을 @으로 변경하여 신고하시고, 관련 증거를 제공해 주시면, 해당 사이트는 즉시 저작권 침해 내용을 삭제할 것입니다。)