一。Activity生命周期
下面这张图估计很多人都非常熟悉:
没错就是Activity生命周期。
Activity是Android组件中最基本,最基础的并且最常见的四大组件之一,用户能直接感受操作。Activity是一个应用程序组件,提供一个界面,让用户可以用来交互进行某项活动。
Activity所有的操作都与用户有密切相关,是一个负责和用户交互的组件,通过setContentView(View)来显示指定控件,一个Activity通常是一个单独的屏幕,里面包含很多个组件。
onCreate():创建界面,做一些数据的初始化工作;
onStart():到这一步用户可见不可交互的状态
onResume():变成和用户交互的,(通过栈的方式管理这些Activity,当前Activity在栈的最上端,运行完出栈,回到上一个Activity)
onPause():到这一步是可见但不可交互,系统会挺止动画等消耗CPU的事情,这里应该保存一些数据,因为这个时候程序的优先级低,有可能被系统收回,从这里保存的数据应该在onResume()里读出来。
onStop():变得不可见,被下一个activity覆盖了
onDestroy():是Activity被kill前最后一个被调用方法了,可能是其他类调用finish方法或者是系统为了节省空间将它暂时性的干掉,可以用isFinishing()来判断它,如果有一个Progress Dialog在线程中运行,必须在onDestroy里把它cancel干掉,不然等线程结束,调用Dialog的cancel方法会抛异常。
注意:onPause(),onstop(),onDestroy(),三种状态下的activity都由可能被系统kill掉。
(1)对于一个特定的Activity,第一次启动,回调如下:onCreate()->onStart()->onResume()
(2)当用户打开新的Activity或者切换到桌面的时候,回调如下:onPause()->onStop()
(3)当用户再次回到原Activity时,回调如下:onRestart()->onStart()->onResume()
(4)当用户按back键回退时,回调如下:onPause()->onStop()->onDestroy()
(5)当Activity被系统回收后再次打开,生命周期回调过程和(1)一样
(6)从整个生命周期来讲,onCreate()和onDestroy()是配对的,标识Activity的创建和销毁,并且只可能有一次调用,从Activity是否可见来说,onStart()和onStop()是配对的,随着用户的操作或者设备的点亮和熄灭,这两个方法可能被调用多次;从Activity是否在前台来讲,onResume()和onPause()是配对的,随着用户操作或者设备屏幕的点亮和熄灭这两个方法可能被调用多次
二。为什么要有生命周期
为了更好的友好流畅度。为什么这么说呢,举个例子:
1.当现在最前台的Activity处于onResume状态,它正在处于播放动画,这个时候跳出来一个提示框,将当前的Activity部分或者全部挡住,这个时候当前的Activity就进入onPause状态,那么这个时候再做播放动画视频这种消耗cpu的活动就毫无意义了,当然你也想再次回到这个Activity时能继续播放,这个时候就需要在onPause()这个回调方法来执行这些操作。
2.当你按Home键退出一个应用,或者从一个应用进入另一个应用,这个时候之前的那个Activity就变得完全不可见了,进入onStop状态,因为用户看不到,资源不需要继续维持了,因此就需要在onStop()方法执行这些操作。
3.当接完一个电话,回到之前的Activity,它会从onStop变回onResume状态,这个时候肯定希望它记录你离开时候的状态,那么这个时候就需要在onRestart()或者Start()执行这些操作,来恢复这些状态。
因此,设计生命周期就是为了对应在不同情况场景下让Activity完成特定的事情,给用户一个人流畅的体验度。
三。数据传递
在MainActivity.java传递参数
//显示意图,第一个参数为当前
方式1:
Intent intent = new Intent(MainActivity.this,OtherActivity.class);
//用Bundle 携带数据
Bundle bundle = new Bundle();
//传递text参数为hello
bundle.putString("text","hello");
intent.putExtras(bundle);
startActivity(intent);
在OtherActivity接受参数
//新页面接收数据
Bundle bundle = this.getIntent().getExtras();
//接收text的值
String text = bundle.getString("text");
方式2:
Intent intent = new Intent(MainActivity.this,OtherActivity.class);
intent.putExtra("name","nova");
intent.outExtra("age",23);
startActivity(intent);
在OtherActivity中
String name = getIntent().getStringExtra("name");
int age = getIntnet().getInExtra("age",0)
方式3:传递自定义对象
public class Student implements Serializable{
private int course;
private String ID;
public int getCourse() {
return course;
}
public void setCourse(int course) {
this.course = course;
}
public String getID() {
return ID;
}
public void setID(String ID) {
this.ID = ID;
}
public Source(String ID, int course) {
this.course = course;
this.ID = ID;
}
}
传递方:
Intent intent = new Intent(MainActivity.this,OtherActivity.class);
intent.putExtra("student",new Student("nova",90));
startActivity(intent);
接收方:
Intent intent = getIntent();
Student student = (Student)intent.getSerializableExtra("student");
tv.setText(+student.getID()+""student.getCourse());
方式4:从Activity返回数据
原理:在次Activity用Intent传递数据,用setResult设置返回结果,在主Activity重写onActivityResult方法,通过data参数获取数据。startActivityForResult是一个Activity结束时返回结果给上一个Activity,返回的结果在上一个Activity的onActivityResult来获取。
主方:
Intent intent = new Intent(MainActivity.this,OtherActivity.class);
startActivityForResult(intent,0);
重载onActivityResult方法,通过data参数获取数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
tv.setText(data.getStringExtra("info"));
}
返回方:
Intent intent = new Intent();
intent.putExtra("info",editText.getText().toString());
setResult(0, i); // 0表示成功
finish();