Android学习笔记2——启动模式

Android启动模式共四种,分别如下:

1、standard
1)是Activity的默认启动模式
2)只要执行startActivity方法启动Activity,则一定创建该Activity的新实例
3)在一个任务中可以包含同一个Activity的多个实例
4)同一个Activity的多个实例可以存在于不同的任务中
5)默认情况总是在当前任务中创建Activity的新实例
2、singleTop
1)通常情况下与标准模式的Activity表现一致
2)当该Activity的实例位于当前任务的栈顶时,再启动该Activity,不会创建新的实例,而是将intent传入到当前的栈顶实例中
3、singleTask
1)是全局单实例的
2)当使用startActivity方法启动该Activity时
1-如果当前系统中不存在该Activity的实例,则创建新实例:
a)如果该Activity的taskAffinity值与当前任务的taskAffinity值相同,则在当前任务中创建
b)如果该Activity的taskAffinity值与当前任务的taskAffinity值不同,则在新任务中创建
2-如果当前系统中已存在该Activity的实例,则不会创建新的实例而是将已存在的实例重新设置为栈顶实例(位于该实例之上的其他实例需要被销毁)
4、singleInstance
1)是全局单实例的
2)创建该Activity的实例时总是在新的任务中创建
3)该Activity的实例总是独自占用一个任务栈
4)如果通过该Activity的实例启动其他Activity的新实例时,首先会判断新实例的taskAffinity值是否与已存在的任务的taskAffinity值相同
如果相同:在该任务中创建新实例
如果不同:在新的任务中创建新实例

taskAffinity
1、任务吸附值或任务亲族值
2、对于每个Application来说如果未明确设置,则该值与应用程序的主包名一致
3、对于每个Activity来说,如果未明确设置,则该值与Activity所在的|Application的taskAffinity值相同
4、对于task来说,该值与其任务栈栈底的Acitivity的taskAffinity值相同

Task
其taskAffinity的值等于其任务栈中栈底的Activity的吸附值
Application
如果未明确设置Application的taskAffinity值
则该值默认为当前应用程序主包名
Activity
如果未明确设置Activity的taskAffinity值
则该值默认与其所在的Application的taskAffinity值相同

————————————————
版权声明:本文为CSDN博主「键盘上的钢琴师_v5」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/daijin888888/article/details/51115886


显式Intent

:通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,去调用Intent.setComponent()、Intent.setClassName()或Intent.setClass()方法或者在new Intent(A.this,B.class)指明需要转向到的Activity,显式意图明确指定了要激活的组件是哪个组件,一般是在应用程序内部使用。

隐式Intent

:通过在清单文件中配置IntentFilter来实现的,它一般用在没有明确指出目标组件名称的前提下,当一个应用要激活另一个应用中的Activity时(看不到源代码),只能使用隐式意图,根据Activity配置的意图过滤器建一个意图,让意图中的各项参数的值都跟过滤器匹配,这样就可以激活其他应用中的Activity。Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。一般是用于在不同应用程序之间,如果想隐式intent不可以被跨应用启动只需要在AndroidManifest.xml对应的activity中配置android:exported="false"即可。

当Android系统接收到一个隐式Intent要启动一个Activity(或其他组件)时,Android会根据以下三个信息比较Intent的信息与注册的组件的intent-filter的信息,从而为该Intent选择出最匹配的Activity(或其他组件):

  • intent中的action
  • intent中的category
  • intent中的data(包含Uri以及data的MIME类型)

也就是隐式intent对象要满足要启动的目标组件中注册的intent-filter中的、、三个标签中的信息,即要分别通过action测试、category测试以及data测试。intent-filter信息是在Android的manife文件中描述的,顾名思义,intent-filter是intent过滤器,就是用来过滤intent的。

如果隐式intent对象同时通过了某个组件的中intent-filter的action测试、category测试以及data测试,那么该组件就可以被intent对象所启动。如果隐式intent对象没有通过系统中任何组件的intent-filter测试,那么就没有Android系统无法找到该intent对象要启动的组件。下面我们依次看一下如何才能通过这三个测试。

————————————————

Action测试

为了指定能够接收并处理的Intent的类型,组件可以在intent-filter中声明其支持0个或多个action,例如:

<intent-filter>
    <action android:name="com.ispring.action.ACTION_TEST1" />
    <action android:name="com.ispring.action.ACTION_TEST2" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

intent对象可以通过setAction()方法设置唯一的一个action值。对于action测试,需要分两种情况:

1、intent对象设置了action

如果intent对象通过调用setAction()方法设置了action的值,那么只有当组件的intent-filter中包含了intent对象中的action值的时候,action测试才通过,否则无法通过。
举个例子,假设我们的Activity的intent-filter如下所示:

<intent-filter>
   <action android:name="com.ispring.action.ACTION_TEST1" />
   <action android:name="com.ispring.action.ACTION_TEST2" />
   <category android:name="android.intent.category.DEFAULT" />
   <data android:scheme="ispring" android:host="blog.csdn.net" />
</intent-filter>

总结起来有两点结论:

  1. 要想让intent对象通过action测试,那么intent-filter中声明的action不能为空且要包含intent对象中的action值(如果intent的action值不为空的话)。
  2. 如果intent-filter没有声明任何action,那么所有的intent的对象(即无论intent如何配置)都无法通过intent-filter的action测试。
    ————————————————

Intent作为联系各Activity之间的纽带,其作用并不仅仅只限于简单的数据传递。通过其自带的属性,其实可以方便的完成很多较为复杂的操作。例如直接调用拨号功能、直接自动调用合适的程序打开不同类型的文件等等。

Intent主要有以下四个重要属性,它们分别为:

Action:Action属性的值为一个字符串,它代表了系统中已经定义了一系列常用的动作。通过setAction()方法或在清单文件AndroidManifest.xml中设置。默认为:DEFAULT。

Data:Data通常是URI格式定义的操作数据。例如:tel:// 。通过setData()方法设置。

Category:Category属性用于指定当前动作(Action)被执行的环境。通过addCategory()方法或在清单文件AndroidManifest.xml中设置。默认为:CATEGORY_DEFAULT。

Extras:Extras属性主要用于传递目标组件所需要的额外的数据。通过putExtras()方法设置。常作为一个Intent,BroadCast Receiver等组件的传入数据使用。

Android隐示启动的Action、Category、Data匹配规则

1.定义:

  • Action:定义匹配动作,属性值为一个字符串,Intent中必须携带有action,系统预定义了一些action,但是我们也可以在应用中定义自己的action.

  • Category:用于指定当前动作(Action)被执行的环境,属性值也是一个字符串,系统也预定义了一些Category,我们也可以自定义.过滤规则intent-filter过滤器中一定要有如下设置

 <category android:name="android.intent.category.DEFAULT" />
  • Data:用于指定数据,由两部分组成,mimeType和URI.mimeType指媒体类型,比如image/ipeg,video/*可以表示图片,文本,视屏等不同的媒体格式

2 匹配规则:

1.Action的匹配规则:Intent中必须携带有Action
示例1:

Intent intent = new Intent();
intent.setAction(“com.action.demo1”);
intent.setAction(“com.action.demo2”);
startActivity(intent);

intent中包含2个action ,“com.action.demo1"和"com.action.demo2”。要启动的组件必须包含这两个action,如下

<activity android:name=".ActionDemoActivity">
            <intent-filter>
                <action android:name="com.action.demo1" />
                <action android:name="com.action.demo2" />
                <action android:name="com.action.demo3" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
</activity>

说明:

  1. action的匹配要求Intent中要携带至少一个action,并且Intent中携带的所有action在某一组intent-filter中都能完全匹配上,即不会出现Intent中携带的某个action在intent-filter中找不到的情况.

  2. 一个act可以有多个Intent-filter,一个Intent-filter中可以有多个action,一个Intent只要能匹配任何一组intent-filter就可以成功启动对应的act

  3. action区分大小写,大小写不同的字符串匹配action会匹配失败

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值