在Android應用程序開發的時候,從一個Activity啟動另一個Activity並傳遞一些數據到新的Activity上非常簡單,但是當您需要讓后台運行的Activity回到前台並傳遞一些數據可能就會存在一點點小問題。
首先,在默認情況下,當您通過Intent啟到一個Activity的時候,就算已經存在一個相同的正在運行的Activity,系統都會創建一個新的Activity實例並顯示出來。為了不讓Activity實例化多次,我們需要通過在AndroidManifest.xml配置activity的加載方式(launchMode)以實現單任務模式,代碼如下:
//清單文件Manifast部分內容 <activity android:name=".MainActivity" android:label="@string/app_name" android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MainTwoActivity" android:label="@string/app_name"> </activity>
package com.itheima.test; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); processExtraData(); } public void clickText(View view){ Intent intent = new Intent(this,MainTwoActivity.class); startActivity(intent); } @Override protected void onRestart() { Log.i("test","onRestart..."); super.onRestart(); } @Override protected void onNewIntent(Intent intent) { Log.i("test","onNewIntent..."); setIntent(intent); processExtraData(); super.onNewIntent(intent); } private void processExtraData(){ String value = getIntent().getStringExtra("test"); Log.i("test","value===>"+value); } }
package com.itheima.test; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class MainTwoActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_two_main); } public void clickTwoText(View view){ Intent intent = new Intent(this,MainActivity.class); intent.putExtra("test","hello..."); startActivity(intent); } }
onNewIntent()非常好用,Activity第一啟動的時候執行onCreate()---->onStart()---->onResume()等后續生命周期函數,也就時說第一次啟動Activity並不會執行到onNewIntent(). 而后面如果再有想啟動Activity的時候,那就是執行onNewIntent()---->onResart()------>onStart()----->onResume(). 如果android系統由於內存不足把已存在Activity釋放掉了,那么再次調用的時候會重新啟動Activity即執行onCreate()---->onStart()---->onResume()等。
(1).正常流程: 第一個Activity啟動,再啟動第二個Activity,再啟動第一個Activity,結果如下:
03-29 14:39:22.888: I/test(24340): value===>null
03-29 14:39:25.763: I/test(24340): onNewIntent...
03-29 14:39:25.763: I/test(24340): value===>hello...
03-29 14:39:25.765: I/test(24340): onRestart...
(2).特殊流程: 第一個Activity啟動,再按下home房子鍵,再立即重新啟動應用(避免后台進程被殺死)
03-29 14:42:12.790: I/test(24340): value===>null
03-29 14:42:16.715: I/test(24340): onNewIntent...
03-29 14:42:16.715: I/test(24340): value===>null
03-29 14:42:16.716: I/test(24340): onRestart...