安卓第十一天笔记-Intent与inter-filter配置

Intent与inter-filter配置

1.Intent对象简述

Android应用中有包含三种重要组件:Activity,Service,BroadcastReceiver(另外还有一个ContextProvider)应用程序采用了一致的方式来启动它们---都是依靠Intent来启动的,Intent就是封装了程序想要启动的程序的意图,不仅如些,Intent还可用于与被启动组件交换信息

Activity:

  startActivity(Intent intent)
startActivityForResult(Intent intent,int requestCode)

Service:

    ComponentName startService(Intent intent)
boolean bindServcie(Intent intent,ServiceConnection conn,int flags)

BroadcastReceiver

   sendBroadcast(Intent intent)
sendBroadcast(Intent intent,String receiverPremission)
sendOrderedBroadcast(Intent intent,String receiverPremission,BroadcastReceiver resultReceiver,Handler scheduler,int initiaCode,String initialData,Bundle initiaExtras)
sendOrderBroadcast(Intent intent,String receiverPermission)
sendStickyBroadcast(Intent intent),
sendStickyOrderdBroadcast(Intent intent,BroadcastReceiver resultReceiver,Handler scheduler,int initiaCode,String initialData,Bundle initiaExtras)

2.Intent对象的属性

大致包含:Component,Action,Category,Data,Type,Extra,Flag这7种属性,其中Component用于明确指定需要启动的目标组件,而Extra用于携带需要交换的数据

3.Component属性

Intent的Component属性需要接受一个ComponentName对象,ComponentName包含如下构造器

ComponentName(String pkg,String cls)
//创建PKG据在包下的cls类所对应的组件
ComponentName(Context pkg,String cls)
//创建PKG据在包下的cls类所对应的组件
ComponentName(Context pkg, Class<?> cls)
//创建PKG据在包下的cls类所对应的组件

同时还有如下三个方法

setClass(Context packageContext,Class<?> cls)
//设置该 Intent将要启动的组件对应的类
setClassName(Context packageContext,String className)
//设置该Intent将要启动的组件对应 的类名,要全路径
setClassName(String packageContext,String className)
//设置该Intent将要启动的组件对应 的类名,要全路径

Context代表访问应用环境信息的接口,而Android应用的包名则作为应用的唯一标识,因此 Android应用的Context对象与该应用的包名有一一对应的关系 Component属性的Intent已经明确了它将要启动哪个组件,因此这种Intent也被称为显示意图 常用来启动同一个应用程序中组件 而没有指定Componet属性的Intent被称为隐式意图,隐式意图没有明克指定去启动哪个组件,就用将会根据Intent指定的规则去启动符合条件的组件,具体是哪个不确定

*使用显示意图启动另一个Activity

 /**
* 显示意图打开第二个Activity
* @param v
*/
public void open02(View v){
//创建一个Compon对象
ComponentName comp = new ComponentName(this,SecondActivity.class); Intent intent = new Intent();
//为Intent设置Compon属性
intent.setComponent(comp);
//启动
startActivity(intent);
}

第二个Activity

tv = (TextView) findViewById(R.id.tv);
//得到Intento
Intent intent = getIntent(); //获取Componet
ComponentName comp = intent.getComponent(); tv.setText("包名" + comp.getPackageName() + ",组件名称:" + comp.getClassName());

更改启动Intent的写法

/**
* 显示意图打开第二个Activity
* @param v
*/
public void open02(View v){ Intent intent = new Intent();
//为Intent设置属性
intent.setClass(this,SecondActivity.class);
//启动
startActivity(intent);
}

下面这种写法更加简单明了

4.Action,Category属性与intent-filter

Action与Category属性的值都是一个普通的字符串 其中Action代表该Intent所要完成的动作(抽象)而Category刚用于Action增加额外的附加类别信息.通常Action会与Category属性结合使用

隐式意图启动一个Activity

<!--注册SecondActivity-->
<activity android:name=".SecondActivity">
<intent-filter>
<!--添加动作名称可以随便写-->
<action android:name="com.hello.SECOND"/>
<!--类别如果是这个默认DEFAULT可以不写,但建议写上-->
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>

启动一个Activity

    Intent intent = new Intent();
//为Intent设置属性
intent.setAction("com.hello.SECOND");
intent.addCategory("android.intent.category.DEFAULT");
//启动
startActivity(intent);

*其中Action与Category都可以有多个值

//获取Action与Category的值
String action = intent.getAction(); Set<String> categories = intent.getCategories();

5.指定特定的Action与Category调用系统的Activity

Android系统内部提供了大量的标准的Action与Category常量

*返回桌面

 /*
返回桌面
*/
public void goDesk(View v){
Intent intent = new Intent();
//写字符串
intent.setAction("android.intent.action.MAIN");
//写字符串
intent.addCategory("android.intent.category.HOME");
//启动
startActivity(intent); }

*使用系统提供好的

    Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);

6.Data Type与intent-filter配置

Data属性常用于向Action属性提供操作的数据.Data属性接收一个URI的对象,一个uri对象通常通过如下字符串的形式

content://com.android.contacts/contacts/1 tel://110

*uri字符串满足以下格式

schema://host:prot/path

content:是schema部分 com.android.contacts是host部分 port是80省略了 /contacts/1是path部分

Type属性用于指定该Data所指定的URI对应 的MIME类型,这种MIME类型可以是任意任何自定义的MIME类型只要符合ABC/XYZ格式的字符即可

Data属性与Type属性关系比较微妙,这两个属性相互覆盖

  • 如果为Intent先设置Data属性,后设置Type属性,那么Type属性将会覆盖Data属性
  • 如果为Intent先设置Type属性,后设置Data属性,那么Data属性将会覆盖Type属性
  • 如果希望Intent即有Data属性,也有Type属性则应该调用Intent的setDataAndType()方法

Data属性

<data
android:host=""
android:mimeType=""
android:path=""
android:pathPattern=""
android:pathPrefix=""
android:port=""
android:scheme=""
android:ssp=""
android:sspPattern=""
android:sspPrefix=""/>
  1. host:声明Intent的Data属性的host部分
  2. mimeType:用于声明IntentData属性Type属性
  3. path:声明Data属性中path部分
  4. pathPattern所有匹配的Data属性的path部分的正则表达式
  5. pathPrefix Data属性的path前缀
  6. port :Data属性的port部分
  7. scheme:Data属性的协议部分,如:http://,tel://,content://

匹配过程:

如果组件的Data元素只指定了android:schema属性,那么只要Intent的Data属性部分与schema部分相同就可启动

<data android:scheme="abcd"/>
intent.setData(Uri.parse("abcd://"));

如果组件指定了schema,host,属性那么只要Intent的Data属性的schema,host,prot部分与之相同就可启动,可以 没有port属性

<data android:scheme="abcd"
android:host="www.fkjava.com"
/>
intent.setData(Uri.parse("abcd://www.fkjava.com"));

如果目标组件的Data子元素,只有port属性,没有host属性,那么port属性不会起作用 如果目标组件的Data子元素只有path属性,没有host属性,那么path属性不会起作用

<data android:scheme="abcd"
android:host="www.fkjava.com"
android:port="8888"/>
intent.setData(Uri.parse("abcd://www.fkjava.com:8888"));

7.调用系统的应用

  1. 打开指定浏览器的页面

      Intent intent = new Intent();
    //为Intent设置属性
    intent.setAction(Intent.ACTION_VIEW);
    //设置data
    intent.setData(Uri.parse("http://www.qq.com"));
    //启动
    startActivity(intent);

2.打电话

 Intent intent = new Intent();
//为Intent设置属性
intent.setAction(Intent.ACTION_CALL);
//设置data
intent.setData(Uri.parse("tel://110"));
//启动
startActivity(intent);

3.编辑指定的联系人

 Intent intent = new Intent();
//为Intent设置属性
intent.setAction(Intent.ACTION_EDIT);
//设置data
intent.setData(Uri.parse("content://com.android.contacts/contacts/1"));
//启动
startActivity(intent);

8.Extra属性

Extra属性用于在多个Actiton之间进行数据传递,Intent的Extra属性值应该是一个Bundle对象,Bundle对象就是一个Map对象,使用intent.putExtra(key,value)就可以保存数据

9.FLAG属性

  1. Intent.FLAGACTIVITYCLEAR_TOP用于清除当前Activity stack中的Activity,相同于singleTask android:launchMode="singleTask" abcd---启动b,就直接销毁B上面的--AB
  2. Intent.FLAGACTIVITYBROUGHTTOFRONT如果通过FLAG启动的Activity已经存在下次再次启动时以这种模式直接把stack中的Activity带到前台,有点singleInstance感觉android:launchMode="singleInstance"
  3. Intent.FLAGACTIVITYNEW_TASK相当于stardard启动模式android:launchMode="standard"
  4. Intent.FLAGACTIVITYNO_ANIMATION,不使用过渡动画
  5. Intent.FLAGACTIVITYNO_HISTORY,没有历史记录,启动完成后就再启动其它的Activity时,这种模式的Activity直接销毁,不在;Stack中,点击返回是看不到的
  6. Intent.FLAGACTIVITYREORDERTOFRONT,直接带到Stack顶部abcd,这种启用acdb
  7. Intent.FLAGACTIVITYSINGLE_TOP相当于android:launchMode="singleTop"

安卓第十一天笔记-Intent与inter-filter配置的更多相关文章

  1. ELK 学习笔记之 Logstash之filter配置

    Logstash之filter: json filter: input{ stdin{ } } filter{ json{ source => "message" } } o ...

  2. 安卓第十三天笔记-服务(Service)

    安卓第十三天笔记-服务(Service) Servcie服务 1.服务概念 服务 windows 服务没有界面,一直运行在后台, 运行在独立的一个进程里面 android 服务没有界面,一直运行在后台 ...

  3. 安卓第十天笔记-fragment

    安卓第十天笔记-fragment Fragment(片段) 一.Fragment简介 *Fragment是3.0引入的API,主要为了解决平板,大屏幕手机显示问题 *Fragment代表了Activi ...

  4. 安卓第四天笔记-Sqlite

    安卓第四天笔记-Sqlite 1.数据库的创建运行与更新 1.1.创建一个类继承SqliteOpenHelper 1.2.创建构造方法 /** * 数据库创建类 * @author 刘楠 * * 20 ...

  5. 【基于spark IM 的二次开发笔记】第一天 各种配置

    [基于spark IM 的二次开发笔记]第一天 各种配置 http://juforg.iteye.com/blog/1870487 http://www.igniterealtime.org/down ...

  6. 每日笔记---使用@ConfigurationProperties读取yml配置

    每日笔记---使用@ConfigurationProperties读取yml配置 参考地址  https://www.cnblogs.com/mycs-home/p/8352140.html 1.添加 ...

  7. 笔记-python-centos环境下安装配置

    笔记-python-centos环境下安装配置 1.      准备工作 环境准备 centos6.5 mini,已有python 2.6.6 下载源码包 Python官网下载Gzipped sour ...

  8. 【MyBatis笔记】mapper文件的配置以及说明

    <!doctype html>[MyBatis笔记]mapper文件的配置以及说明 figure:last-child { margin-bottom: 0.5rem; } #write ...

  9. 安卓笔记--intent传值不更新问题

    今天在学习安卓的过程中,遇到一个问题,就是用intent进行多次传值的话, 他永远是第一次的值 后来发现,intent接收数据被写到了onCreat();方法中,这时候finish();到上一个Act ...

随机推荐

  1. Knockout 新版应用开发教程之Observable Arrays

    假如你想到侦测和相应一个对象的改变,假如你想要侦测和响应一一组合集的改变,就要用observableArray 在许多场景都是很有用的,比如你要在UI上需要显示/编辑的一个列表数据集合,然后对集合进行 ...

  2. java中JTextPane使输出字符到指定的宽度换行,并将垂直滚动条的位置移动到输出的最后位置

    SimpleAttributeSet set = new SimpleAttributeSet(); Document doc = tp.getStyledDocument(); FontMetric ...

  3. DDD:当视图模型、领域模型和数据模型都采用了同样的类型的时候,我们该如何处理?

    如果采用这种模式,模型会在不同的逻辑层之间传递,以向内传递为例,模型的状态变化是由外向内的不同逻辑层负责修改的,因为这种模式下模型的封装性是很差的,架构和框架要做到:清晰的表达每个逻辑层该如何使用和修 ...

  4. Windows7 x64 系统下安装 Nodejs 并在 WebStorm 9.0.1 下搭建编译 LESS 环境

    1. 打开Nodejs官网http://www.nodejs.org/,点“DOWNLOADS”,点64-bit下载“node-v0.10.33-x64.msi”. 2. 下载好后,双击“node-v ...

  5. 一秒钟生成自己的iOS客户端

    原谅我这个标题党 想当年我也是亲自学过几天Objective-c的程序猿,我一眼就知道我是在骗人,但那有怎样呢!还不是满大街都是各种<十分钟让你明白Objective-C的语法>.< ...

  6. python内置模块(1)

    Python的模块在其它语言中通常称为库或类库,也就是lib.它是编程语言的第三级封装,第四级则是包,也就是模块的打包组合,而前两级分别是函数和类.封装的好处,自然不用多言,高内聚,松耦合,减少代码重 ...

  7. UIScrollView子控件的布局

    scorllView内部子控件添加约束的注意点: 1.子控件的尺寸不能通过UIScrollView来计算 *比如可以设置固定值 (width==100 height ==100) *比如可以相对于UI ...

  8. http与websocket(基于SignalR)两种协议下的跨域基于ASP.NET MVC--竹子整理

    这段时间,项目涉及到移动端,这就不可避免的涉及到了跨域的问题.这是本人第一次接触跨域,有些地方的配置是有点麻烦,导致一开始的不顺. 至于websocket具体是什么意义,用途如何:请百度. 简单说就是 ...

  9. [团队项目] Scrum 项目 3.0 SCRUM 流程的步骤2: Spring 计划

      SCRUM 流程的步骤2: Spring 计划 1. 确保product backlog井然有序.(参考示例图1) 2. Sprint周期,一个冲刺周期,长度定为两周,本学期还有三个冲刺周期. 3 ...

  10. springMVC注解@initbinder日期类型的属性自动转换

    在实际操作中经常会碰到表单中的日期 字符串和Javabean中的日期类型的属性自动转换, 而springMVC默认不支持这个格式的转换,所以必须要手动配置, 自定义数据类型的绑定才能实现这个功能. 一 ...