在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...