1. 生命周期
-
Andriod生命周期图:
Andriod生命周期 - saveInstanceState:
活动进入停止状态时,有可能会被回收(如:内存不足)。 如果活动A是个输入表格,用户在A的基础上启动了B,如果A在后台被杀死,那么会退到A时,会发现原先填写的内容全没了,这时候就是saveInstanceState发挥作用的时候了:
// 进行数据报错
@Override
protected void OnSaveInstanceState(Budle outState){
super.OnSaveInstanceState(outState);
String tempData = "****";
outState.putString("data_key", tempData);
}
// 进程重新启动时
@Override
protected void onCreate(Budle saveInstanceState){
if(saveInstanceState != null){
String tempData = saveInstanceState.getString("data_key"); // ****
}
}
2. Intent:Activity间的跳转
- 显示Intent:
Intent intent = new Intent(FirstActivity.this, SecondActivity.this);
StartActivity(intent)
- 隐私Intent
首先在AndroidManfiest.xml配置:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.activity.ACTION_SECOND" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MY_CATEGORY" />
</intent-filter>
</activity>
然后在程序中调用:
Intent intent = new Intent("com.example.activity.ACTION_SECOND" );
intent.addCategory("android.intent.category.MY_CATEGORY"); //如果不是默认的category,需要显示设置,同事Manfiest文件中需要指定
StartActivity(intent);
- 其他intent
// 调用电话
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
StartActivity(intent);
- Activity间数据传递
// firstActivity
Intent intent = new Intent(FirstActivity.this, SecondActivity.this);
intent.putExtra("name", "狐尼克");
StartActivity(intent)
// secondActivity
String name = intent.getStringExtra("name") ; // 狐尼克
- 逆向传递数据
// firstActivity
Intent intent = new Intent(FirstActivity.this, SecondActivity.this);
StartActivityForResult(intent);
...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
if(requestCode == RESULT_OK){
String data = data.getStringExtra("name");
}
}
// secondActivity
@Override
public void onBackPressed(){
Intent intent = new Intent();
intent.putExtra("name", " 狐尼克");
setResult(RESULT_OK, intent);
finish();
}
3. Activity的启动模式
- standard
每次激活Activity时(startActivity),都创建Activity实例,并放入任务栈 - singleTop
如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建;其余情况都要创建Activity实例; - singleTask
如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,并把该Activity以上的Activity实例都pop; - singleInstance
如果应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两应用共享该Activity实例;
参考:Android入门:Activity四种启动模式
4. 最佳实践
- 获知当前是哪一个活动
@Override
protected void onCreate(Bundle savedInstanceState){
....
Log.d(getClass().getSimpleName());
}
- 随时随地退出程序
如果程序停留在第三个Activity,此时想退出程序的话,需要三次Back键。需要提供一个方法,按键一次就可退出程序。
// 提供一个ActivityController类
public class ActivityController{
public Static List<Activity> activities = new ArrayList<Activity>();
public Static void add(Activity activity){
activities.add(activity);
}
public Static void remove(Activity activity){
activities.remove(activity);
}
public Static void finishAll(){
for (Activity activity : activities){
if(!activity.isFinishing()){
activity.finish();
}
}
}
}
// 普通的Activity里进行函数调用
@Override
protected void onCreate(Bundle savedInstanceState){
....
ActivityController.add(this);
...setOnClickListener(...{
ActivityController.finishAll();
})
}
@Override
protected void onDestroy(Bundle savedInstanceState){
....
ActivityController.remove(this);
}
- 活动启动的最佳写法
public static void actionStart(Context context, String data1, String data2){
Intent intent = new Intent(context, SecondActivity.class);
intent.putExtra("param1", data1);
intent.putExtra("param2", data2);
context.startActivity(intent);
}