深入理解Intent和IntentFiler(二)

转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空)

    在上一篇文章中,我们比較具体学习了"Intent"的相关知识,如今将学习怎样设置Intent对象的这些属性以及怎样使用他们来启动组件。

Intent对象是一组信息,我们能够通过设置其Action、Data、Category属性来指定启动哪个组件并完毕什么样的动作(包括动作所需的数据)。

    "意图"分为显示intent和隐式intent。

所谓显示intent,指的是Intent已经明白了它将要启动哪个组件-通过指定Intent对象的Component属性实现。而隐式intent,

指的是Intent不能确定它将要启动哪个组件(没有指定Component属性)-通过AndroidManifest.xml文件里的Intent Filter来对组件进行筛选来确定启动的组件。

一、显式"intent"
    显式"意图"。顾名思义,就是指Intent已经明白以我们可了它将要启动哪个组件。因为一个组件类能够通过其所在的包名和类名唯一的确定,所以通过intent的Component属性来实现。Intent的Component属性须要接受一个ComponentName对象。其构造函数传入了该组件的包名、类名。
1.显式"intent"开发基本思路
(1)创建一个ComponentName对象,用于为"意图"指定组件包名、类名
ComponentName comp=new ComponentName(ComponentAttr.this,SecondaryActivity.class);

(2)创建一个Intent对象,并为该对象设置Component属性
Intent intent=new Intent();
intent.setComponent(comp);

注意:通过使用Intent不同的构造函数,(1)、(2)步骤能够合并为:
    Intent intent=new Intent(ComponentAttr.this,SecondaryActivity.class);
(3)启动一个类名为SecondaryActivity的Activity组件
startActivity(intent);
或者 startActivityForResult(intent,requestCode);    //关闭启动的Activity会返回结果

(4)实现被启动的组件SecondaryActivity类(继承于Activity)
(5)在AndroidManifest.xml加入一个<Activity></Activity>元素,可是无需配置<intent-filter>元素
  <!-- 被intent启动的activity --><activityandroid:name=".SecondaryActivity"android:label="第二个Activity界面" ><intent-filter><action android:name="action.CRAZYIT_ACTION"/><category android:name="android.intent.category.DEFAULT" /></intent-filter></activity>


博主笔记1:除了上述Intent的setComponent方法,我们还能够利用setClass来指定须要启动的详细组件
Intent intent=new Intent();
intent.setClass(ComponentAttr.this,SecondaryActivity.class);
startActivity(intent);


二、隐式intent
    隐式intent,顾名思义,就是没有指明intent究竟要启动哪个组件。

显式intent能够通过设置其Component属性实现。而隐式intent就通过Intent Filter来实现。

详细的说就是,我们事先设置好"意图"启动组件的相关信息(intent属性),然后再在其它组件的AndroidManifest.xml文件设置好对应的intent属性。当组件发出"意图"时。Android系统通过查找project文件

AndroidManifest.xml(或者系统级组件)其它组件的<intent-filter/>相关信息来进行匹配。筛选得到满足"意图"条件的组件。

1.使用Action属性开发基本思路
       Intent是组件之间的通信的载体,组件的通信能够分为应用内部组件之间的通信和应用间的通信。Intent的Action、Category属性都是一个普通的字符串,当中Action代表Intent索要完毕的一个"抽象"动作,Category属性用于为Action添加附加的类别信息。
(1)应用内部组件通信-自己定义字符串 方式
public final String CUSTOME_ACTION="intent.action.CUSTOME_JIANG";//字符串能够随意
Intent intent=new Intent();        //创建一个Intent对象
intent.setAction(ActionAttr.CUSTOME_ACTION); //注意:ActionAttr为我们创建的类
startActivity(intent);    //启动一个Activity

(2)与其它应用程序通信-使用系统预定action常量
Intent intent=new Intent();
intent.setAction(Intent.ACTION_CALL); //当中ACTION_CALL为Intent类的静态成员变量,能够类直接调用
startActivity(intent);

2.使用Action、Category属性开发基本思路

(1)应用内部组件通信-自己定义字符串 方式
public final String CUSTOME_ACTION="intent.action.CUSTOME_JIANG";//字符串能够随意
public final String CUSTOME_CATEGORY="intent.action.CUSTOME_CATEGORY";//字符串能够随意
Intent intent=new Intent();        //创建一个Intent对象
intent.setAction(ActionAttr.CUSTOME_ACTION); //注意:ActionAttr为我们创建的类
intent.addCategory(ActionAttr.CUSTOME_CATEGORY);
startActivity(intent);    //启动一个Activity

(2)使用系统预定action、category常量-下面代码实现当点击某个button时,通过Intent对象实现返回HOME桌面。
Intent intent=new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);//返回Home桌面
startActivity(intent);    //启动一个Activity
注意:这里无需设置AndroidManifest.xml

假设是实现应用内部组件的通信。除了上述(1)(2)步骤,我们还须要完毕步:
(3)实现须要启动的Activity,如SecondaryActivity.java,ThirdActivity.java,使其继承于Activity;
(4)在projectAndroidManifest.xml加入<activity></activity>元素,并加入<intent-filter/>相关信息
<activity
android:name=".SecondaryActivity"
android:label="第二个Activity界面" >
<intent-filter>
<action android:name="intent.action.JIANG_ACTION" />
<category android:name="intent.action.JIANG_CATEGORY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".ThirdActivity"
android:label="第三个Activity界面" >
<intent-filter>
<action android:name="intent.action.JIANG_ACTION" />
<category android:name="intent.action.JIANG_CATEGORY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity> 


博主笔记2:实际上。我们在开发包括"意图"的应用程序中,Action属性和Category属性是配合使用的。由于,Android系统会给主动Activity在AndroidManifest.xml中默认一个Action属性和Category属性。即:
 <intent-filter>
                <action android:name="android.intent.action.MAIN" />                        //应用程序入口
                <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
另外,还须要注意几点:
1.Action常量等属性。如ACTION_CALL是在设置intent时使用,其相应的字符串"android.intent.action.CALL"在AndroidManifest.xml"中使用;
2.当使用Action属性等的系统提前定义常量,与其它应用通信时,仅仅须要在本应用的AndroidManifest.xml加入对应的权限就可以。
3.一个Activity中仅仅能且必须定义一个Action属性和一个Category属性,当中。Category属性系统会分配其默认常量"CATEGORY_DEFAULT"

3.源码

    该实例主要完毕2个功能:
(1)实现一个button。使用Action属性和Category属性启动一个Activity;
(2)实现一个button,用于返回HOME界面

(1).FirstActivity.java:主Activity
package com.example.android_intent_2;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class ActionCateAttr extends Activity {//自己定义一个action常量org.crazyit.public final static String CRAZYIT_ACTION="intent.action.JIANG_ACTION";public final static String CRAZYIT_CATEGORY="intent.action.JIANG_CATEGORY";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.first);Button btn=(Button)findViewById(R.id.button);btn.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {//创建一个Intent对象Intent intent=new Intent();intent.setAction(ActionCateAttr.CRAZYIT_ACTION);                 //设置action属性intent.addCategory(ActionCateAttr.CRAZYIT_CATEGORY);    //设置category属性startActivity(intent);}});//为btn注冊一个事件监听器对象/*返回桌面按钮*/Button btn1=(Button)findViewById(R.id.home);btn1.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {//创建一个Intent对象Intent intent=new Intent();intent.setAction(Intent.ACTION_MAIN); //设置action属性intent.addCategory(Intent.CATEGORY_HOME);//设置category属性startActivity(intent);}});//为btn注冊一个事件监听器对象}
}

(2).AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.android_intent_2"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="11"android:targetSdkVersion="14" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name=".ActionCateAttr"android:label="第一个Activity界面" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activityandroid:name=".SecondaryActivity"android:label="第二个Activity界面" ><intent-filter><action android:name="intent.action.JIANG_ACTION" /><category android:name="intent.action.JIANG_CATEGORY" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></activity><activityandroid:name=".ThirdActivity"android:label="第三个Activity界面" ><intent-filter><action android:name="intent.action.JIANG_ACTION" /><category android:name="intent.action.JIANG_CATEGORY" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></activity></application>
</manifest>

(3)在project中,加入SecondaryActivity.java,ThirdActivity.java继承于Activity.
(4)效果
3.使用Data、Type属性开发基本思路
    Action属性为Intent对象描写叙述了一个"动作"。那么Data属性就为Intent对象的Action属性提供了操作的数据。Type属性用于指定该Data所指定Uri相应的MIME类型,这样的类型能够是不论什么自己定义的MIME类型,仅仅要符合abc/xyz格式的字符串就可以。

这里须要注意的是,Type属性和Data属性通常会出现相互覆盖的情况,假设希望Intent既有Data属性也有Type属性,必须通过setDataAndType()方法来实现。

这里须要注意的是,Data属性仅仅接受一个Uri对象。一个Uri对象通常通过例如以下形式的字符串来表示:

    Uri字符串格式:scheme://host:port/path 举例: content://com.android.contacts/contacts/1或tel://18819463209
    这里有两种情况。一是启动系统级应用程序;二是。启动应用内部组件。前者无需配置AndroidManifest.xml中的<data../>元素。仅仅需加入对应权限就可以;后者。须要配置AndroidManifest.xml中的<data/>元素内容。当中。为组件声明Data、Type属性都通过<data../>元素,格式例如以下:
    <data android:mimeType=""        //用于声明该组件所能匹配的Intent的Type属性
            android:scheme=""             //协议
             android:host=""                 //用于声明该组件所能匹配的Intent的Data属性host部分(主机)
             android:port=""                 //串口
             android:path=""                //资源路径
            android:pathPrefix=""        //Data属性的前缀
            android:pathPattern=""/>    //Data属性的path字符串模板
情况一、启动系统级应用组件
(1)实现一个Intent对象。并启动组件
Intent intent=new Intent();                         //创建一个Intent对象
String data="content://com.android.contacts/contacts/1";
Uri uri=Uri.parse(data);                            //将字符串转换为Uri
intent.setAction(Intent.ACTION_VIEW);  //设置Intent对象Action属性
intent.setData(uri);                                   //设置Intent对象Data属性
startActivity(intent);
或者
Intent intent=new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("content://com.android.contacts/contacts/1"));
startActivity(intent); 

(2)在AndroidManifest.xml中加入对应的权限
在Android中读取电话信息时,要注意增加
<use-permission android:name="android.permission.READ_CONTACTS"/>
在android中使用BroadcastReceiver时
<use-permission android:name="android.permission.RECEIVE_SMS"/>
在android中使用有关的文件下载功能时,要使用到的
<use-permission android:name="android.permission.INTERNET"/>
<use-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  

(3)源码
    该应用程序实现三个button实现三个功能:打开网页、编辑联系人、拨打电话
firstActivity.java
package com.android.android_intent_4;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*第一个按键功能:打开网页*/
Button btn1=(Button)findViewById(R.id.button1);
btn1.setOnClickListener(new OnClickListener(){  //为按钮1注冊一个事件监听器对象 @Override
public void onClick(View v) {
//1.创建Intent
Intent intent=new Intent();
//2.设置action、data属性
String data="http://www.baidu.com";
Uri uri=Uri.parse(data);    //将字符串转化为Uri-通用资源标识
intent.setAction(Intent.ACTION_VIEW);   //设置intent属性为系统提前定义的Intent.ACTION_VIEW
intent.setData(uri);     //为intent设置数据属性。用于传递数据
//3.启动Activity
startActivity(intent);
}}); /*第二个按键功能:编辑标识为1的联系人*/
Button btn2=(Button)findViewById(R.id.button2);
btn2.setOnClickListener(new OnClickListener(){  //为按钮1注冊一个事件监听器对象 @Override
public void onClick(View v) {
//1.创建Intent
Intent intent=new Intent();
//2.设置action、data属性
intent.setAction(Intent.ACTION_EDIT);    //设置intent属性为系统提前定义的Intent.ACTION_VIEW
intent.setData(Uri.parse("content://com.android.contacts/contacts/1"));   //为intent设置数据属性。依据指定的字符解析出Uri对象
//3.启动Activity
startActivity(intent);
}}); /*第三个按键功能:拨打电话18819465188*/
Button btn3=(Button)findViewById(R.id.button3);
btn3.setOnClickListener(new OnClickListener(){  //为按钮1注冊一个事件监听器对象
@Override
public void onClick(View v) {
//1.创建Intent
Intent intent=new Intent();
//2.设置action、data属性
intent.setAction(Intent.ACTION_DIAL);    //设置intent属性为系统提前定义的Intent.ACTION_VIEW
intent.setData(Uri.parse("tel:18819465188")); //依据指定的字符解析出Uri对象
//3.启动Activity
startActivity(intent);
}});
} } 

效果例如以下图:
情况二、启动应用内部组件
(1)实现一个Intent对象,并启动组件
Intent intent=new Intent();                         //创建一个Intent对象
String data="lee://www.fkjava.org:8888/mypath";
Uri uri=Uri.parse(data);                            //将字符串转换为Uri
intent.setAction(Intent.ACTION_VIEW);
intent.setData(uri);                                   //设置Intent对象Data属性
startActivity(intent);
或者
Intent intent=new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("lee://www.fkjava.org:8888/mypath"));
startActivity(intent); 

(2)在AndroidManifest.xml中设置<data../>元素中的相关内容就可以
  <data android:mimeType=""android:host=""android:port=""android:path=""android:pathPrefix=""android:pathPattern=""/>

(3)实现其他Activity

版权声明:本文博主原创文章。博客,未经同意不得转载。

Android两个注意事项.深入了解Intent和IntentFilter(两)相关推荐

  1. Android开发精要3--Android中的Intent机制

    1.概述 一个应用程序的三个核心组件--activities.services.broadcastreceivers,都是通过叫做intents的消息激活.Intent消息是一种同一或不同应用程序中的 ...

  2. Android的Intent和IntentFilter应用说明一例

    很多人对文档中的Intent和IntentFilter不理解是什么意思,我这里举例解释下. Intent字面意思就是目标,目的.通俗一点,需要达成某些目标,则需要提供一些动作,这些目标的分类,以及达成 ...

  3. 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!...

    今天讲下在Surfaceview中如何实现两个或者多个Activity之间的切换与数据交互,为了更形象一些我做了一个游戏登录界面的demo,其中对于输入界面的布局这些我也是随意写了下,主要是实现功能并 ...

  4. Android中的Intent和Intent-filter总结

    一.相关概念 (一)基本概念 Intent中文意思指"意图",按照Android的设计理念,Android使用Intent来封装程序的"调用意图",不管启动Ac ...

  5. android Intent和IntentFilter

    android的应用程序包含三种重要的组件:Activity.Service.BroadcastReceiver,应用程序采用一致的方式来启动他们--都是依靠Intent来进行启动.Intent就封装 ...

  6. android友盟注意事项

    android友盟注意事项: activity要在onResume中添加: MobclickAgent.onResume(Context); onPause中添加 MobclickAgent.onPa ...

  7. Android学习笔记——APP页面转换与Intent学习

    使用Intent保证多活动之间的切换,实现APP页面转换. 同时学习Intent其他诸多功能. 认知Intent Intent是Android程序中各组件之间进行交互的一种重要方式,不仅指明当前组件想 ...

  8. android 多个dialog 交替显示,Android如何在一个AlertDialog中一个接一个地显示两个ListViews...

    我有两个列表.一个列表显示可用列表中的所有可用项目(lv_available_items)和仅次要项目(lv_selected_items).我还希望该选定列表最多占用显示的50%,因此我使用属性&q ...

  9. CTS(23) --- Android 8.1GMS注意事项

    Android 8.1GMS注意事项 GMS认证软件的注意事项:  1.开机画面" Powered by android go edition" 到底边距离应等于或稍大于" ...

最新文章

  1. 【敏捷测试】一个测试人员在参与敏捷测试的经验分享(3)
  2. boost::reference_wrapper用法实例
  3. Spring的IOC原理
  4. Windows下64位Apache服务器的安装
  5. pythondd_windows7下安装python环境和django
  6. 2017,三大运营商的天猫芳华
  7. JavaScript基本语法2
  8. angular封装七牛云图片上传,解决同一页面多个上传按钮分别上传
  9. 工程、通信中的3dB带宽含义
  10. 传奇客户端传奇新手普及讲解各补丁说明
  11. WC2020 打铁记
  12. flink任务优化总结
  13. 基于js的火星坐标、百度坐标、WGS84坐标转换
  14. 巴西龟饲养日志----冬眠苏醒
  15. 台式电脑 计算机管理在哪里,设备管理器在哪 怎么打开设备管理器?
  16. Python在线聊天
  17. VS粘贴word时中文乱码修复工具v1
  18. vue2移动端仿淘宝APP省市区街道四级地区选择器
  19. 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试六十题 10 12
  20. 计算机分类汇总图片,只用文件夹目录,一个图文创作者如何快速整理大量照片...

热门文章

  1. Java作业08 计科1501 闫国雨
  2. 【matlab】将matlab中数据输出保存为txt或dat格式
  3. linux(fedora) 下dvwa 建筑环境
  4. Handler与多线程
  5. 关于VS2010帮助文档的使用和VC6.0在Win7 64位下的使用
  6. android中AsyncTask和Handler对比
  7. java如何添加同名的xml节点_jaxb怎么解析多个同名元素
  8. STM32安装Keil5、芯片支持包、startup启动文件(启动过程分析)、建立工程、烧写
  9. 全国计算机等级考试题库二级C操作题100套(第46套)
  10. java定时器_拾遗Timer定时器