[Android]onNewIntent調用時機

在IntentActivity中重寫下列方法:onCreate onStart onRestart onResume onPause onStop onDestroy onNewIntent

一、其他應用發Intent,執行下列方法:

I/@@@philn(12410): onCreate

I/@@@philn(12410): onStart

I/@@@philn(12410): onResume

 

發Intent的方法:

Uri uri = Uri.parse("https://www.cnblogs.com/rayray/");

Intent it = new Intent(Intent.ACTION_VIEW, uri); 

startActivity(it);

 

二、接收Intent聲明:

<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="http"/>

</intent-filter>

</activity>

 

三、如果IntentActivity處於任務棧的頂端,也就是說之前打開過的Activity,現在處於

I/@@@philn(12410): onPause

I/@@@philn(12410): onStop 狀態的話

其他應用再發送Intent的話,執行順序為:

I/@@@philn(12410): onNewIntent

I/@@@philn(12410): onRestart

I/@@@philn(12410): onStart

I/@@@philn(12410): onResume

 

 

 

在Android應用程序開發的時候,從一個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);//must store the new intent unless getIntent() will return the old one

 

    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);//must store the new intent unless getIntent() will return the old one

 

     processExtraData()

 

 }

 

 

 

private void processExtraData(){

 

    Intent intent = getIntent();

 

    //use the data received here

 

}

發佈留言