Android studio四大组件之Activity
什么是四大组件
包括: Activity、Service、BroadcastReceiver、Content Provider
简单介绍:
- Activity:Activity是Android构造块中最基本的组件,相当于界面管理,也是Android程序与用户交互的窗口;主要功能为保持各界面的状态和参数,妥善管理生命周期以及实现界面跳转逻辑;
- service:service本身是指在后台长期运行并且没有用户界面的程序。Android的service服务于Activity,接受activity指令,并完成相关指令的实质操作,比如完成文件下载,音乐播放,或视频解码编码等等;
service 分为由startService指令启动的service和bindService指令捆绑的service; - BroadCast Receiver:处理Intent触发事件并对消息做一些简单处理,转换成一条Notification,统一了Android的事件广播模型;
- Content Provider:是Android提供的第三方应用数据的访问方案,可以派生Content Provider类,对外提供数据,可以像数据库一样进行选择排序,屏蔽内部数据的存储细节,向外提供统一的借口模型,大大简化上层应用,对数据的整合提供了更方便的途径
Activity
Android Activity的生命周期(Lifecycle)
在android.app.Activity类里面,定义了7个方法来控制android Activity的生命周期. 注意,这是一个ContextThemeWrapper的子类。
Android的生命周期有点类似windows的视窗,或者Java的window or frame,你可以通过他来处理UI组件及widgets。
Android Activity生命周期方法
我们看一下7个生命周期的方法(图片来源参考【1】),
Method | Description |
onCreate | 当Activity第一次被创建时运行 |
onStart | 当Activity显示在视图中的时候运行 |
onResume | 当Activity和用户交互(比如获得焦点)的时候运行 |
onPause | 当Activity变得不可交互(失去焦点)时运行(如果要恢复可见,resume即可) |
onStop | 当Activity对用户来说变得不再可见时运行(如果要恢复可见,必须restart重启) |
onRestart | 重新启动时运行 |
onDestroy | 销毁时运行 |
这4种状态的详细情况如下
- 活动状态(Active/Running):Activity处于界面最顶端,获取焦点;
- 暂停状态(Paused):Activity失去焦点,但对用户可见;
- 停止状态(Stopped):Activity被完全遮挡,但保留所有状态和成员信息;
- 非活动状态(Killed):Activity被停止
Activity的启动模式
Anroid有4种启动模式,可以在AndroidManifest.xml中配置,
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.spacesoftwares.helloworld">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:launchMode="standard">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
默认使用standard,如上面的源码所示。
任务(Task)
在了解这些模式之前,我们必须了解Android 的任务(Task)。
Task就是一个后进先出的栈内一个或多个Activity实例的集合。通常程序运行的第一个activity的实例叫做根任务(root Task),一个android系统会有很多的任务,但某一时刻在前台运行的任务只有一个。
Standard:标准的启动模式(默认启动模式)
<activity android:launchMode="standard" />
Activity跳转机制:同一个Activity会在同一个任务栈里(即TaskID相同),但是每次启动时就会创建一次不同的Activity实例,依次进栈。每次返回时,栈顶的任务实例就回弹出任务栈。一个activity可对应的多个实例,每个实例可能都属于不同的任务。
tv = (TextView) findViewById(R.id.textView1);
tv.setText(String.format("任务ID:%d\n当前的Activity实例:\n%s",getTaskId(), toString()));
btn = (Button) findViewById(R.id.btnStartSelf);
// 同一个任务栈里面,但是不同任务实例。返回时,弹出栈顶实例(这是Activity的跳转机制)
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, MainActivity.class));
}
});
图片来源参考【2】
SingleTop
<activity android:launchMode="singleTop" />
(2). SingleTop
SingleTop模式和standard模式非常相似,主要区别就是当一个singleTop模式的Activity已经位于任务栈的栈顶,再去启动它时,不会再创建新的实例此时,系统不会调用onCreat,但会调用onNewIntent;如果不位于栈顶,就会onCreate创建新的实例。
例子如下:
假设目标task的activity栈为: A->B->C->D(栈底->栈顶)
在程序中调用startActivity(D)
如果D是standard模式,则activity栈变为: A->B->C->D->D, 也就是会重新创建一个D实例
如果D是singleTop模式,则activity栈变为: A->B->C->D,不会创建D实例。
即如果D在目标task 的activity栈的栈顶,就不会创建新的实例,而是调用D的onNewIntent()方法,反之如果D不在目标task 的activity栈的栈顶,则会重新创建一个D实例。
图片来源参考【2】
singleTask
<activity android:launchMode="singleTask" />
SingleTask模式的Activity在同一个Task内只有一个实例,如果Activity已经位于栈顶,系统不会创建新的Activity实例,和singleTop模式一样。但Activity已经存在但不位于栈顶时,系统就会把它上面的activity出栈,直到该Activity移到栈顶。
例如,如果A调用startActivity(B)启动B实例,则A和B位于同一个task中,且都只有一个实例存在于task栈中。
图片来源参考【2】
SingleInstance
<activity android:launchMode="singleInstance" />
该模式的Activity会启动一个新的任务栈来管理Activity实例,且该实例在整个系统中只有一个。无论从那个任务栈中启动该Activity,都会是该Activity所在的任务栈转移到前台,从而使Activity显示。这种模式主要用于在不同程序中共享一个Activity实例。
例如,如果A调用startActivity(B)启动B实例,则系统会自动给intent添加一个属性LAG_ACTIVITY_NEW_TASK,将B实例放入到一个新的task中,也就是说A实例所在的task中有且只有一个A实例,不能存在其他实例。
图片来源参考【2】
【1】https://www.javatpoint.com/android-life-cycle-of-activity
【2】https://www.programering.com/a/MjNxIjNwATg.html