Activity 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。 每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上。
本文将从创建Activity,Activity的生命周期,Activity的状态,Activity的启动模式
一、创建Activity
(1)继承基类:android.app.Activity
public class TestActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
(2)设置UI布局
setContentView(R.layout.layout_head);
(3)在AndroidMainfest文件中注册
<activity android:name=".activity.TestActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
二、Activity的生命周期
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// The activity is being created.
}
@Override
protected void onStart() {
super.onStart();
// The activity is about to become visible.
}
@Override
protected void onResume() {
super.onResume();
// The activity has become visible (it is now "resumed").
}
@Override
protected void onPause() {
super.onPause();
// Another activity is taking focus (this activity is about to be "paused").
}
@Override
protected void onStop() {
super.onStop();
// The activity is no longer visible (it is now "stopped")
}
@Override
protected void onDestroy() {
super.onDestroy();
// The activity is about to be destroyed.
}
三、Activity的状态
图片左侧依次向上为Activity的创建
图片右侧依次向下为Activity的销毁
特殊的Activity状态
当前ActivityA正在运行,调用其他ActivityB时,会调用ActivityA的onSaveInstance(),此时ActivityA会不可见,遇到两种情况
(1)重新回到ActivityA,会调用onRestart
(2)系统急需内存,会杀掉ActivityA,此时重新启动ActivityA,会调用onCreate()或onRestoreInstance()
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_c);
generateTag();
Log.e(TAG, "onCreate");
if(savedInstanceState != null) {
String extra = savedInstanceState.getString("extra");
if(!TextUtils.isEmpty(extra)) {
Log.e(TAG, "onCreate : [" + extra + "]");
}
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.e(TAG, "onSaveInstanceState");
outState.putString("extra", "this is a test");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String extra = savedInstanceState.getString("extra");
Log.e(TAG, "onRestoreInstanceState : [" + extra + "]");
}
四、Activity的启动模式
通过两种方法定义不同的启动模式:
1、使用清单配置文件
在清单文件中声明 Activity 时,您可以使用 元素的 launchMode 属性指定 Activity 应该如何与任务关联。
2、使用Intent标志
(1)默认模式的启动(standard)
概念:默认。系统在启动 Activity 的任务中创建 Activity 的新实例并向其传送 Intent。Activity 可以多次实例化,而每个实例均可属于不同的任务,并且一个任务可以拥有多个实例。
任务是一个有机整体,当用户开始新任务或通过“主页”按钮转到主屏幕时,可以移动到“后台”。 尽管在后台时,该任务中的所有 Activity 全部停止,但是任务的返回栈仍旧不变,也就是说,当另一个任务发生时,该任务仅仅失去焦点而已。
后台可以同时运行多个任务。但是,如果用户同时运行多个后台任务,则系统可能会开始销毁后台 Activity,以回收内存资源,从而导致 Activity 状态丢失。
由于返回栈中的 Activity 永远不会重新排列,因此如果应用允许用户从多个 Activity 中启动特定 Activity,则会创建该 Activity 的新实例并推入堆栈中(而不是将 Activity 的任一先前实例置于顶部)。 因此,应用中的一个 Activity 可能会多次实例化(即使 Activity 来自不同的任务)。
注:使用adb shell dumpsys 命令查看解释
名字 功能
account 显示accounts信息
activity 显示所有的activities的信息
cpuinfo 显示CPU信息
window 显示键盘,窗口和它们的关系
wifi 显示wifi信息
batteryinfo $package_name 电量信息及CPU 使用时长
package packagename 获取安装包信息
usagestats 每个界面启动的时间
statusbar 显示状态栏相关的信息
meminfo 内存信息
diskstats 磁盘相关信息
battery 电池信息
alarm 显示Alarm信息
(2)栈顶复用(singleTop)
<activity-->
<!--android:name=".ActivityC"-->
<!--android:launchMode="singleTop" />
概念:如果当前任务的顶部已存在 Activity 的一个实例,则系统会通过调用该实例的 onNewIntent() 方法向其传送 Intent,而不是创建 Activity 的新实例。Activity 可以多次实例化,而每个实例均可属于不同的任务,并且一个任务可以拥有多个实例(但前提是位于返回栈顶部的 Activity 并不是 Activity 的现有实例)。
图为标准模式和singleTop的区别
(3)栈内复用(singleTask)
概念:系统创建新任务并实例化位于新任务底部的 Activity。但是,如果该 Activity 的一个实例已存在于一个单独的任务中,则系统会通过调用现有实例的 onNewIntent() 方法向其传送 Intent,而不是创建新实例。一次只能存在 Activity 的一个实例。
<activity-->
<!--android:name=".ActivityC"-->
<!--android:launchMode="singleTask"/>
<activity-->
<!--android:name=".ActivityC"-->
<!--android:launchMode="singleTask"-->
<!--android:taskAffinity="com.netease.study.activity.ActivityC"/>
(4)单实例模式(singleInstance)
与 “singleTask” 相同,只是系统不会将任何其他 Activity 启动到包含实例的任务中。该 Activity 始终是其任务唯一仅有的成员;由此 Activity 启动的任何 Activity 均在单独的任务中打开。
注:官方文档上的讲解
无论 Activity 是在新任务中启动,还是在与启动 Activity 相同的任务中启动,用户按“返回”按钮始终会转到前一个 Activity。 但是,如果启动指定 singleTask 启动模式的 Activity,则当某后台任务中存在该 Activity 的实例时,整个任务都会转移到前台。此时,返回栈包括上移到堆栈顶部的任务中的所有 Activity。
Activity的官方地址:
https://developer.android.com/guide/components/activities.html