(详细)Android启动模式 Intent属性详解

来源:互联网 发布:免费收支软件 编辑:程序博客网 时间:2024/05/01 21:53

一、Task和Back Stack 提高用户体验
Task:为了完成统一的操作与用户交互的多个activity的集合
Back Stack:用来存储同一个task中activity stack栈结构 后进先出

Activity的启动模式 启动模式:activtiy启动后在回退栈中如何进行管理

   <Activity android:lauchMode=""></Activity>

standard 标准启动模式 默认启动模式
* standard启动模式下 会按照activity的启动的顺序依次创建activity的实例并且压入到回退栈中
*
* SingleTop 栈顶唯一 单顶模式
* SingleTop启动模式下 启动一个activity的实例时 如果发现回退栈的顶端是该activit的实例 将复用该实例不再重新创建实例压如栈中
* 如果需要避免某个activity被重复多次启动时 可以设置为singleTop 系统短信界面
*
* singleTask 栈内唯一
* singleTask启动模式下 启动一个activity实例时 检查回退栈中是否存在该activity的实例 如果实例存在 回退栈中会清除
* 该activity实例以上所有的activity的实例
* 如果存在比较耗费系统资源的activity时建议使用singleTask启动模式
*
* singleInstance 单独的回退栈中的单一的实例
* singleInstance启动模式下 启动一个activity的实例时 会将当前的activity存储到一个单独的回退栈中作为单一的实例
* 如果用户与该activtiy交互时 表示该activity所在的回退栈处于前端
* singleInstance一般适用于需要系统中只存在一个实例的场景 例如:android中来电

二、Intent的属性

Intent 意图
* 作用
* 1.激活组件 启动组件 Activity BroadCastReceiver service
* 2.传递数据
* 3.根据action标记的特征动作 启动系统界面 例如:拨打电话 发送短信 发送邮件 打开网页
*
* Intent中的属性
* 1.ComponentName 组件名 类类型 组件名表示全类名 包名.类名
* 设置组件名 setComponent() setClass() setClassName()
* 获取组件名 getComponent()
*
* 2.Action 字符串类型的变量 对组件特征动作的描述 用字符串标示类能干什么
* 系统提供的aciton字符串 自定义action
* 设置 action setAction()
* 获取action getAction()
*
* 3.Data 数据 uri类型 一般与action结合到一起使用 表示aciton动作执行的数据资源
* URI(统一资源标示符) 资源数据需要通过uri标示符进行标示
* uri数据资源中包括两部分 数据资源 数据类型 MIMEType
*
* scheme://host:port/path
* sms://10086 tel://10086
*
* setData() setType() setDataAndType() 设置数据
* getData() getType() 获取数据
*
* 4.Category 字符串类型 分类
* addCategory() 设置分类
* removeCategory() 移除分类
* getCategory() 获取分类
*
* 5.Extra 额外信息 使用Intent意图对象进行启动组件时传递数据
*
* 6.flag 标记 int类型
* 用来标记回退栈中的activity 提供常量可以设置activity的启动模式
* setFlags() 设置标记
* getFlags() 获取标记

Intent intent=new Intent(); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  singleTask startActivity(intent);

显式 隐式启动:

根据activtiy的启动方式将activity划分为两类 一类是隐式activity 显式activity
* 不管哪种形式启动activity都是用的是Intent意图对象
* 显式activity 使用Intent启动activity时明确指定启动activity的组件名称 一般适合使用在同一个app中多个activity之间的启动
* 隐式activity 使用Intent启动activity时并未明确指定组件名称 而是指定组件的特征
* 一般适合使用不同的app中activity之间的启动

Intent intent=new Intent(“action”);
startActivity(intent);

<Activity android:name="acivity的包名.类名">    <Intent-filter>        <action android:name="action"/>     action标签必须存在 并且可以是一个列表 只要有一个aciton的取值与Intent对象中一致就可以启动        .....        <category android:name="android.intent.categoty.DEFAULT">          只要隐式启动activity categroy就会被设置为默认      </Intent-filter> </Activity>

三、UI线程模型
应用程序启动时,系统会在应用程序中创建一个线程执行当前启动的应用程序组件 ,这个线程称为主线程(Main Thread)
* 主线程非常重要,因为它主要负责UI界面的绘制以及ui界面事件的处理,main线程主要负责UI工具包(android.widget
* android.view)中的操作 所以主线程也被称为UI线程。
*
* 如果UI线程中执行的耗时操作过多时,会造成UI线程的阻塞,如果阻塞超过5秒钟就会出现ANR(application not responding)
* 为了分担UI线程的工作 可以将耗时操作放到工作线程中执行 但是一般情况下耗时操作的结果都需要展示到Ui界面中 如果在工作线程中
* 访问ui工具包中的内容时会报错
*
* android中单一线程模型(只能UI线程访问UI工具包中的类)
* 1.UI线程不能阻塞
* 2.工作线程不能操作UI工具包

0 0
原创粉丝点击