Android组件之Activity解析

来源:互联网 发布:aws s3 上传文件 php 编辑:程序博客网 时间:2024/05/21 09:43

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

0 0
原创粉丝点击