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
- Android组件之Activity解析
- Android组件之Activity生命周期解析
- android组件之Activity
- Android之Activity组件
- android组件之Activity
- android组件之Activity
- Android之Activity组件
- Android组件之Activity
- Android组件之Activity
- Android组件之Activity
- Android研究之Activity组件
- Android四大组件之Activity
- Android四大组件之Activity
- android组件之Activity生命周期
- Android四大组件之Activity
- Android四大组件之Activity
- android四大组件之Activity
- android四大组件之Activity
- mysql update 等值 锁区间
- HTTP状态码大全
- listview回到顶部
- 几个闭包的案例
- C语言基础(六)- 结构体、共用体、枚举和typeof自定义类型
- Android组件之Activity解析
- strip去符号
- 动态代理的一个demo
- 高通使用/system/bin/r读取msm8916的gpio配置
- C语言基础(七)- 动态内存
- setCompoundDrawable
- Swift 创建桥接头文件
- 程序员面试金典: 9.3栈与队列 3.3设计一个栈,栈到一定高度就会另外建栈。
- IOS系统版本