Activity是一个应用程序组件,提供用户与程序交互的界面。
Android 4大组件:
1. Activity 2. Service 3. BroadcastReceiver 4. Content Provider
Activity使用:
1.继承 Android 的 Activity类 ;
2. 重写 onCreate() 方法;
3.调用 setContentView() 方法 设置显示布局;
4.在 AndroiMainfest 文件中,注册 Activity
Activity的生命周期
从创建到销毁的过程
onCreate(); 创建
onStart(); 运行
onResume(); 获取焦点
onPause(); 失去焦点
onStop(); 暂停
onDestroy(); 销毁
onRestart();
Activity的四种状态:
活动状态:(Activity/Runing)Activity处于界面最顶端,获取焦点
暂停状态:(Paused)Activity失去焦点,但对用户可见
停止状态:(Stopped)Activity被完全遮挡,但保留所有状态和成员信息
非活动状态:(Killed)Activity被停止
Activity从创建到销毁的生命周期:
onCreate() --> onStart --> onResume() --> onPause() --> onStop() --> onDestroy()
Activity从启动到后台,再到前台的生命周期:
onCreate() --> onStart --> onResume() --> onPause() --> onStop() --> onRestart() --> onStart() --> onResume()
Activity从启动到失去焦点,再到获取到焦点的生命周期:
onCreate() --> onStart --> onResume() --> onPause() --> onResume()
返回栈
Android使用任务(Task)来管理活动,一个任务就是一组存放在栈里的活动的集合,这也被称为返回栈(Back Stack)。
栈是这一种先入后出的数据结构,在默认情况下,每当启动了一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。而每次按下Back键或调用finish()方法去销毁一个活动时,处于栈顶的活动就会出栈,前一个入栈的活动就会重新处于栈顶的位置。系统总是会显示处于栈顶的活动给用户。
活动被回收了怎么办
用户A在活动A的基础上启动了活动B,活动A进入了停止状态,这个时候由于系统内存不足,将活动A回收掉了,然后用户按Back键返回活动A,此时会执行活动A的onCreate()方法,重新创建一次活动A。如果活动A中存在临时数据和状态需要保留,Activity提供了一个onSaveInstanceState()回调方法,这个方法保证在活动被回收之前一定会被调用,来解决活动被回收时临时数据得不到保存的问题。
onSaveInstanceState()方法携带一个Bundle类型的参数,Bundle提供了一系列的方法用于保存数据,比如可以使用putString()方法保存字符串,使用putInt()方法保存整型数据。每个保存方法需要传入两个参数:第一个是键,用于后面从Bundle取值,第二个是真正要保存的内容。
如果之前有做数据保存的话,取出数据在onCreate()中调用所保存对象的saveInstanceState.getString(key)方法。
活动的启动模式
活动的启动模式有四种:standard、singleTop、singleTask、singleInstance,在AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来选择启动模式。
1、standard
默认的启动模式,每次启动都会创建该活动的一个新的实例。
2、singleTop
启动活动时,如发现返回栈栈顶已经是该活动,则直接使用它,不再创建新的活动实例。
不过当要启动的活动并未处于栈顶位置时,这使再启动该活动,还是会创建新的实例。
3、singleTask
当活动的启动模式指定为singleTask,每次启动活动时系统首先会在返回栈中检查是否存在该活动的实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
4、singleInstance
指定为singelInstance的活动会启用一个新的返回栈来管理这个活动,不管哪个应用程序来访问这个活动,都共用一个返回栈,解决了共享活动实例的问题。
在按Back键时,直到所有的栈都已退出,才会退出程序。
知晓当前对应的活动
getClass().getSimpleName()
随时退出程序
用一个专门的集合类对所有的活动进行管理
新建一个ActivityCollector类作为活动管理器:
public class ActivityCollector{
public static List<Activity> activities = new ArrayList<>();
public static void addActivity(Activity activity){
activities.add(acitvity);
}
public static void removeActivity(){
activities.remove(activity);
}
public static void finishAll(){
for (Activity activity : activities){
if (!acitvity.isFinishing()){
activity.finish();
}
}
}
}
在活动管理器中,通过一个list来暂存活动,然后提供一个addActivity()方法用于向List中添加一个活动,提供一个moveAcitvity()方法用于从List移除一个活动,最后提供一个finishAll()方法将List中存储的活动全部销毁。
BaseActivity:
public class BaseActivity extends AppcompatActivity {
@override
protected void onCreate(Bundle saveInstanceState) {
super.onCreate(saveInstanceState);
Log.d("BaseActivity", getClass().getSimpleName());
ActivityCollector.addActivity(this);
}
@override
protected void onDestory(){
super.onDestory();
ActivityCollectory.removeAcitvity(this);
}
}
以后,不管想在什么地方退出程序,只需调用ActivityCollector.finishAll()方法就可以了。
还可以在销毁所有活动的代码后面加上杀掉当前进程的代码,以保证程序完全退出:
android.os.Process.killProcess(android.os.Process.myPid());
其中,killPrecess()方法用于杀掉一个进程,它接收一个进程id参数,可以通过myPid()方法来获得当前的进程id。