前言
https://mp.csdn.net/mdeditor/92801025#
简介
Activity是一个用户可以接触到最直接的一个单位,几乎所有的activity都会和用户交互,activity会通过setContentView加载一个UI布局来创建一个窗口,很多情况下它是以全屏的方式呈现,但是它也可以以对话框的形式呈现,或者嵌入到其他的activity中。
生命周期
首先上图镇楼
onCreate:
在第一次创建活动时调用,一般在该方法中使用setContentView()加载布局和控件、对象等的初始化操作。
onStart:
当活动变得对用户可见时调用。
onRestart:
在活动停止后再次启动之前调用。
onResume:
当活动开始与用户交互时调用。
onPause:
当activity失去焦点的时候调用。这个方法通常代表着系统开始准备离开当前activity去启动或者恢复另一个activity;在这里通常会进行一些数据的保存操作(一般使用ContentProvider)。
onStop:
当activity不再对用户可见时调用,因为另一个activity已恢复并且正在覆盖此activity
简单点说activity就是手机提供给用户一个可以交互的界面,然后这个界面也有生老病死这样的现象。
注册
当我们创建完一个activity后需要在AndroidManifest.xml(清单文件)中进行activity的注册。比如我创建一个名为LinearActivity的activity,在我们运行的时候需要在清单文件中的application节点下使用activity节点进行声明:
Activity的启动模式
补充:
1、 一般情况下一个应用程序是由多个组件组成,这组件将以进程为载体相互协作实现app的相关功能。
2、 进程,进程是正在运行的程序的实例,是并发执行的程序在执行过程中分配和管理资源的基本单位。
3、 任务栈(task stack),任务栈用来存放用户开启的activity,在应用程序创建之初,系统会默认分配一个任务栈。当任务栈中的最后一个activity被销毁时,对应的应用程序将被关闭,并且清除任务栈,但是会保留该程序的进程。
4、 Affinity,默认状况下,拥有同一个affinity的activity在同一个任务栈中,任务栈的affinity属性由根activity的affinity属性决定,application的affinity属性默认状态下是应用程序的包名。
5、 Activity在栈中是先进后出的原则。
正文:
Standard
默认启动模式:每次启动这个activity,不管这个实例是否存在,都会创建一个新的实例,并且谁启动了这个activity,该activity就会属于启动它的activity所在的任务栈中。
SingleTop
栈顶复用模式,如果该activity已经处于栈顶,那么该activity则不会被重复创建,如果不存在,则创建一个新的activity。该模式常用于通过通知栏跳转到的页面。
SingleTask
栈内复用模式,如果该activity在栈中已经存在,那么不管它是否处于栈顶,都将进行复用,复用时将会将它上面的activity全部出栈,并且调用onNewIntent方法,如果不存在则创建。该模式可用于首页的activity。
SingleInstance
全局唯一模式,通过该模式启动的activity会单独占用一个任务栈,具有全局唯一性,如果该activity已经存在,那么在启动它的时候,系统会将它所在的任务调度到前台。系统工具常使用。
备注:
设置activity的启动模式,可以通过在清单文件中设置,也可通过java代码动态设置,并且动态设置高于静态设置。
Activity的几个重要方法
onSaveInstanceState和onRestoreInstanceState
当activity由于系统原因被杀掉时,activity将会调用onSaveInstanceState方法传入一个bundle对象进行保存数据的操作,然后在onRestoreInstanceState方法中通过bundle再将数据取出来。Android中已经将ui控件进行了封装,我们不需要进行相关操作,我们需要对属于本类中变量进行保存的操作。
新建TestActivity,在布局中放入一个输入框两个button,其中一个button的作用是将输入框中的内容赋值给变量edtStr,另一个button是将变量以Toast的形式弹出。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/edt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入内容" />
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="提交" />
<Button
android:id="@+id/btn2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="测试" />
</LinearLayout>
java代码
String edtStr = "";
EditText edt;
Button btn;
Button btn2;
edt = (EditText) findViewById(R.id.edt);
btn = (Button) findViewById(R.id.btn);
btn2 = (Button) findViewById(R.id.btn2);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
edtStr = edt.getText() == null ? "" : edt.getText().toString();
}
});
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(TestActivity.this, edtStr, Toast.LENGTH_SHORT).show();
}
});
在输入框中随意输入内容,然后点击“提交”按钮,然后点击“测试”按钮会弹出刚才输入的内容,然后旋转屏幕变为横屏,点击“测试”按钮,会发现弹出的内容为空。
然后重写onSaveInstanceState和onRestoreInstanceState方法,如下:
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
edtStr=savedInstanceState.getString("edt");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
outState.putString("edt", edtStr);
}
然后重复刚才的操作可以发现无论怎么切换都可以弹出输入框中的内容。
对生命周期的可能影响因素探究
(1)普通对话框对生命周期的影响:
new AlertDialog.Builder(mContext).setTitle("测试")
.setPositiveButton("确定", new android.content.DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.dismiss();
}
}).show();
查看打印的log日志,对activity的生命周期并无影响;
(2)当其他activity设置为dialog模式弹出时:
创建activity并且设置该activity为dialog模式,查看log日志,activity会执行onPause方法;
onPause方法是当系统启动另一个activity时才会执行的一个方法。
(3)启动一个普通的activity时:
创建activity,并且在MainActivity中通过intent启动该activity,查看log日志,activity会执行onPause->onStop;当我们点击返回键再次返回到该activity时,activity会执行onRestart->onStart->onResum;
(4)手机返回键对activity生命周期的影响
在activity界面点击返回键,查看log日志,可以看到activity的生命周期走了onPause->onstop->ondestroy;
(5)手机home键对activity生命周期的影响
在activity页面点击home键,查看log日志,可以看到activity的生命周期走了onPause->onStop;
(6)手机灭屏对生命周期的影响
在activity页面,等待手机灭屏,查看log日志,可以看到activity的生命周期走了onpause->onstop;
(7)默认状态下横竖屏切换对生命周期的影响
查看log日志可知,activity首先会销毁当前activity,然后再重新走onCreate->onStart->onPause方法。
加入我的行列:
(嘿嘿嘿,点击这里关于我哦,分享小知识):https://www.jianshu.com/p/7d19f0df5b6b