利用onNewIntent避免Activity之間的跳轉傳值屢次實體化

onNewIntentless

須要注意的是:spa

一、經過Intent啓到一個Activity的時候,就算已經存在一個相同的正在運行的Activity,系統也會建立一個新的Activity實例。爲了避免讓Activity實例化屢次,咱們須要經過在AndroidManifest.xml配置啓動方式。xml

二、launchMode爲singleTask的時候,經過Intent跳到一個Activity,若是系統已經存在一個實例,系統就會將請求發送到這個實例上,但這個時候----------系統就不會再調用onCreate方法,而是調用onNewIntent方法。內存

能用到的地方是A-->B-->C-->A,此時onActivityResult就有些複雜了。 例如:get

一、點擊 設置密碼(A),跳到 設置密碼頁面(B),輸入密碼;it

二、點擊完成 跳到 肯定密碼頁面(C),輸入密碼,設置成功後返回到設置頁面(A)並帶回一個狀態,此時(A)中的「設置密碼」變成「修改密碼」;後臺

三、用戶設置過密碼後,此頁面就變成了「修改密碼」的選項用戶體驗

四、C跳到A,這個A咱們要用之前棧中已有的,不能再去新建一個A的實例,因此須要在AndroidManifest.xml配置activity的啓動方式以實現單任務模式。每步的跳轉中,咱們不能finish掉上一步Activity,不然按返回鍵時,用戶體驗很差。。。。這時就須要onNewIntent了。固然這只是個人一個思路。配置

 

首先在AndroidManifest.xml配置activity的啓動方式以實現單任務模式請求

先看第二個SecondActivity,它須要把值傳到FirstActivity。

再來看FirstActivity

此時沒有走onCreat方法,可是爲了以防萬一,最好在onCreat方法裏也寫上操做,由於後臺運行的Activity可能在內存太高時被系統殺掉,這時就會走onCreat方法。

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

 }
相關文章
相關標籤/搜索