简介
Activity是Android APP开发中最常用、最基础的组件,属于Android四大组件之一,其主要负责UI展示以及与用户交互。
启动
-
显式启动
显示启动就是明确指出要启动的目标Acitivity的名称,然后通过startActivity()或startAcitivtyForResult()方法来启动,并且在启动的时候可以携带数据至目标Activity。- 无参数无返回结果
//StartActivity.java文件中 this.startActivity(new Intent(this, TargetActivity.class));
- 有参数无返回结果
//send StartActivity.java文件中 Intent intent = new Intent(this, TargetActivity.class); intent.putExtra("args_data", "data from start activity with explicit"); this.startActivity(intent); //received TargetActivity.java文件中 String data = getIntent().getStringExtra("args_data");
- 无参数有返回结果
//1.send StartActivity.java文件中 //1.1 启动时指定requestCode = 1 this.startActivityForResult(new Intent(this, TargetActivity.class), 1); //1.2 重写onActivityResult方法,通过requestCode、resulutCode和Intent获取返回结果 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1) { if (resultCode == RESULT_OK) { ((TextView) findViewById(R.id.text_dashboard)).setText("got data: " + data.getStringExtra("data_return")); } } } //2. received TargetActivity.java文件中 Intent intent = new Intent(); intent.putExtra("data_return", "return data from target"); setResult(RESULT_OK, intent); finish();
- 有参数有返回结果
//1.send StartActivity.java文件中 //1.1 启动时指定requestCode = 1 Intent intent = new Intent(this, TargetActivity.class); intent.putExtra("args_data", "data from start activity for result with explicit"); this.startActivityForResult(intent, 1); //1.2 重写onActivityResult方法,通过requestCode、resulutCode和Intent获取返回结果 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1) { if (resultCode == RESULT_OK) { ((TextView) findViewById(R.id.text_dashboard)).setText("got data: " + data.getStringExtra("data_return")); } } } //2. received TargetActivity.java文件中 Intent intent = new Intent(); intent.putExtra("data_return", "return data from target"); setResult(RESULT_OK, intent); finish();
温馨提示:显式启动的方式有个比较好的写法是在每个Activity中声明静态方法来启动当前Activity,启动参数信息可以一目了然,对于调用者来说非常清晰明了,示例代码如下:
public class TargetActivity extends AppCompatActivity { private static final String DATA_TAG = "data_tag"; public static void startAction(Context context, XXX args) { Intent intent = new Intent(context, TargetActivity.class); intent.putExtra(DATA_TAG, args); context.startActivity(intent); } }
-
隐式启动
隐式启动是通过一定的匹配规则来进行启动目标Activity的,相对于显式启动更加隐晦,数据的传递及返回均域显式启动相同,唯一不同的是Intent中必须指定action名字,以及category类型(可以不需要,默认通过 `android.intent.category.DEFAULT 来匹配),另外需要在manifest文件中为目标Activity添加过滤条件,只有完全匹配的才能正常启动,简单示例如下://1. manifest.xml文件中 <activity android:name=".activity.TargetActivity"> <intent-filter> <action android:name="com.example.study.START_ACTION" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> //2. StartActivity.java 文件中 this.startActivity(new Intent("com.example.study.START_ACTION"));
温馨提示:隐式启动一般用于启动其他应用,比如拨号器和网页等,由于其需要启动的目标Activity比较隐晦,不利于代码阅读,因此在应用内尽量不要用隐式启动方式来实现启动目标Activity。
隐式启动除了可以启动本应用或者其他应用以外,还有一个比较常用的场景,即当需要在别的应用或者浏览器中启动我们的应用时,需要给我们的响应Activity配上隐式启动规则。
销毁
销毁Activity只需要调用finish() 方法即可。
生命周期
-
onCreate()
该方法只在Activity第一次创建时调用,描述的是从无到有的一个状态变化,整个页面生存期间只调用一次
,在该方法中主要做一些初始化
的工作,比如:加载布局
和绑定事件
等。 -
onStart()
该方法在Activity从不可见变成可见时调用,该方法中不要做耗时较长的事情。 -
onResume()
该方法在Activity从可见变成可交互时调用,在该方法中做一些特殊的业务逻辑,比如每次回到页面刷新页面数据
。 -
onPause()
该方法在Activity从可交互变成可见但不可交互时调用,通常会在该方法中释放消耗cpu的资源
和保存关键性数据
,但是该方法执行速度一定要快,否则会影响新Activity的展示速度
。 -
onStop()
该方法在Activity从可见变成不可见时调用。 -
onDestroy()
该方法在Activity被销毁前调用,主要做一些资源的释放工作。 -
onRestart()
该方法在Activity未销毁但不可见时将要变得可见时调用
一图胜千言:
Activity生命周期图.png
下面来看下几种常见场景的生命周期方法调用顺序:
- 当前Activity 启动另外一个正常Activity,然后返回,整个生命周期过程如下图:
通过该时序图,可以看出即将不可见的Activity的
onStop()
是在即将可见Activity的onResume()
方法之后调用的。
- 当前Activity 启动一个Dialog类型的Acitivty,然后返回,整个生命周期过程如下图所示:
在这种情况下,主要区别在于Dialog类型的Activity和普通Activity的不同,前者不会完全遮挡住后面的Activity,所以后面的Activity还是可见的,只是不能与用户交互了而已,因此后面可见但是不可交互Activity的
onStop()
、onRestart()
和onStart()
方法不会被调用。
Dialog类型Activity的最简单的创建方法是指定Activity的theme为Dialog类型即可。
<activity
android:name=".activity.lifecycle.LifecycleDialogActivity"
android:theme="@style/Theme.AppCompat.Light.Dialog.Alert" />
- 当前Activity 启动一个Alert Dialog,然后返回,整个生命周期过程
创建一个最简单的AlertDialog代码如下:
private void showAlertDialog() {
new AlertDialog.Builder(this)
.setTitle("Alert Dialog Title")
.setMessage("The message content of this alert dialog!")
.setPositiveButton("ok", null)
.setNegativeButton("cancel", null)
.create()
.show();
}
AlertDialog的显示与关闭过程中都没有任何生命周期方法调用。
-
横竖屏切换的生命周期
横竖屏切换Acitivity的生命周期.png
正常情况下横竖屏的切换,其实都是销毁当前Activity重新创建一个新Activity的过程。
启动模式
Android系统里面通过返回栈来管理每个Activity,当一个Activity被创建出来就会进栈,而当一个Activity销毁了就会出栈,并且当前位于栈顶的Activity一定是当前显示的Activity,系统提供了以下四种启动模式,可以根据需要给每个Activity设置不同的启动模式。
-
standard模式
这是默认的启动模式,如果什么也不设置即为此模式,此模式的特点是:每次启动都会创建一个新的实例而不关心当前栈里是否已存在此Activity的实例
。 -
singleTop模式
此模式的特点是:每次当需要创建一个Activity的实例时,先检查当前栈顶是否为此Activity的实例,如果是则复用,反之才会创建一个新的实例
。常用设置方式为:<activity android:name=".activity.mode.ModeSingleTopActivity" android:launchMode="singleTop" />
此模式通常用于Dialog类型Activity的启动模式。
-
singleTask模式
此模式的特点是:栈中只存在唯一实例,如果已经存在,将其置为栈顶,位于其上面的Activity全部出栈, 反之则创建新的实例
。常用设置方式为:<activity android:name=".activity.mode.ModeSingleTaskActivity" android:launchMode="singleTask" />
此模式常用于一个应用的主Activity的启动模式。
-
singleInstance模式
此模式的特点是:创建一个新的栈来管理此Activity
。常用设置方式为:<activity android:name=".activity.mode.ModeSingleInstanceActivity" android:launchMode="singleInstance" />
此模式通常用于需要与其他应用共享此Activity实例的情景,即一个Activity实例多个应用共享。如果此Activity中启动一个常规的Activity,则该常规Activity继续在老的栈中管理,此时如果按返回,会直接返回至上上个页面的Activity,例如:A-->B(SingleInstance模式)-->C,在C中按下返回按钮直接返回至A。
面试常考点
- onStart()与onResume()的区别
- 横竖屏切换的生命周期
- Activity启动流程
网友评论