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

深入理解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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle常用sql语句(一)

Sql的分类DDL操作数据库表列等表基本的操作主键索引视图 常用数据类型字符串类型数字类型日期类型LOB类型LONG类型 数据转换character datenumbercharacter通用函数条件表达式Sql的分类 DDL &#xff08;Data Definition Language&#xff09;&#xff1a;数据定义语言&#xf…

ASP.NET Web API 实现客户端Basic(基本)认证 之简单实现

优点是逻辑简单明了、设置简单。 缺点显而易见&#xff0c;即使是BASE64后也是可见的明文&#xff0c;很容易被破解、非法利用&#xff0c;使用HTTPS是一个解决方案。 还有就是HTTP是无状态的&#xff0c;同一客户端每次都需要验证。 实现&#xff1a; 客户端在用户输入用户名及…

WPF|分享一个登录界面设计

分享一个登录界面&#xff0c;先看效果图&#xff1a;准备文中使用到了一些图标&#xff1a;我们可以从 iconfont[1]免费下载&#xff1a;代码简单说明请随手创建一个WPF项目&#xff08;.NET Framework、.NET 5\6\7皆可&#xff09;&#xff0c;使用tree /f命令看看最终的文件…

《零基础看得懂的C++入门教程 》——(6)自己动手写个函数

一、学习目标 了解C语言的自定义函数的使用方法了解C语言自定义函数的传参了解C语言自定义函数的返回值 目录 预备第一篇&#xff0c;使用软件介绍在这一篇&#xff0c;C与C使用的软件是一样的&#xff0c;查看这篇即可&#xff1a;《软件介绍》 想了解编译原理和学习方法点…

【计算机图形学】实验:C#语言采用GDI+定义笔刷并填充图形完整实验操作流程

一、实验目的: 熟练掌握在.net环境下对笔刷的定义,并可用定义好的笔刷填充多边形。 二、实验准备: 学习在.net环境下GDI+所提供的5种笔刷类型,掌握定义笔刷的方法和填充图形的函数,如FillRectange ( )、FillEllipse ( )等。 三、实验内容: 在.net环境中设计一个窗体…

管道模式 pipe

先放一个图&#xff0c;预则立嘛 PipelinePattern.rar 这里是 不完整的码转载于:https://www.cnblogs.com/ganmk--jy/p/5525897.html

《零基础看得懂的C++入门教程 》——(7)小数组玩起来

一、学习目标 了解数组的使用方法了解一维数组的使用方法了解一维数组与循环的使用方法 目录 预备第一篇&#xff0c;使用软件介绍在这一篇&#xff0c;C与C使用的软件是一样的&#xff0c;查看这篇即可&#xff1a;《软件介绍》 想了解编译原理和学习方法点这篇&#xff0c…

SSO 方案演进

1背景介绍 随着业务与技术的发展&#xff0c;现今比以往任何时候都更需要单点登录 SSO 身份验证。现在几乎每个网站都需要某种形式的身份验证才能访问其功能和内容。随着网站和服务数量的增加&#xff0c;集中登录系统已成为一种必要。在本文中&#xff0c;我们将讨论下 …

《零基础看得懂的C++入门教程 》——(8)搞定二维数组与循环嵌套

一、学习目标 了解二维数组的使用方法了解循环嵌套的使用方法 目录 预备第一篇&#xff0c;使用软件介绍在这一篇&#xff0c;C与C使用的软件是一样的&#xff0c;查看这篇即可&#xff1a;《软件介绍》 想了解编译原理和学习方法点这篇&#xff0c;学习方法和一些原理C与C都…

常见的Ubuntu命令30条(一)

Ubuntu命令是指在Ubuntu操作系统中用于执行各种任务和操作的命令行指令。这些命令可以用于管理系统、配置网络、安装软件、浏览文件等。Ubuntu命令通常在终端&#xff08;Terminal&#xff09;应用程序中输入并执行。 在Ubuntu中&#xff0c;有许多常用的命令和指令。以下是一…

【计算机图形学】实验:C#.net环境下的图形变换完整实验操作流程

一、实验目的: 熟练掌握在.net环境下对图形的变换方法。 二、实验准备: 学习图形变换的基本算法,如平移、旋转、缩放等,以及在.net环境下变换图形的基本方法。 三、实验内容: 在.net环境中利用变换图形的基本方法对图形进行变换,包括平移、旋转、缩放、对称、复合变…

《零基础看得懂的C++入门教程 》——(9)结构体原来如此

一、学习目标 了解C语言的结构体的使用方法了解C语言结构体的结构的赋值了解多种C语言结构体变量的赋值方法和取值方法 目录 预备第一篇&#xff0c;使用软件介绍在这一篇&#xff0c;C与C使用的软件是一样的&#xff0c;查看这篇即可&#xff1a;《软件介绍》 想了解编译原…

微信小程序python token验证_微信小程序python 用户认证

按流程图来先通过wx.login()获取code,再通过我们后台配置的接口获取openid和session_key// 登录wx.login({success: res > {console.log(res)// 发送 res.code 到后台换取 openId, sessionKey, unionIdwx.request({url: api.GET_OPENID, //data: {js_code: res.code},succes…

C#实用技巧之:将图标打包进DLL并读取

概述个人的项目界面有时候需要用到很多图标&#xff0c;这些图片可以建立一个文件夹单独存放&#xff0c;但有时涉及到多台设备部署的话&#xff0c;每台设备都需要随项目一起拷贝过去&#xff0c;如果忘记了界面显示就会出问题&#xff0c;有没有更好的办法解决&#xff1f;有…

【计算机图形学】实验:VB.net环境下的绘制贝赛尔(Bezier)自由曲线完整实验操作步骤

一、实验目的 熟练掌握在.net环境下绘制贝赛尔自由曲线。 二、实验准备 学习生成贝赛尔自由曲线的基本算法,以及在.net环境下绘制贝赛尔自由曲线的基本方法(DrawBezier和DrawBeziers)。 三、实验内容 在.net环境中绘制二次、三次贝赛尔曲线。 四、实验过程及步骤 (包…

《零基础看得懂的C++入门教程 》——(10)面向对象

一、学习目标 了解C类是什么了解类对象与类型修饰一样进行创建了解了类的属性如何使用了解了类方法的使用方法 目录 预备第一篇&#xff0c;使用软件介绍在这一篇&#xff0c;C与C使用的软件是一样的&#xff0c;查看这篇即可&#xff1a;《软件介绍》 想了解编译原理和学习…

浅谈JSONP

这是我在13年初写的文章&#xff0c;当时懵懵懂懂写下了自己对JSONP的理解。 文章原文 博客 欢迎订阅 提到JSONP&#xff0c;我当时在网上找了无数帖子也没有看懂它。那些文章大同小异&#xff0c;都是讲到JSONP原理以后就戛然而止&#xff0c;把我们这些初学者搞得云里雾里。所…

Asp.Net Core 7 preview 4 重磅新特性--限流

前言限流是应对流量暴增或某些用户恶意攻击等场景的重要手段之一&#xff0c;然而微软官方从未支持这一重要特性&#xff0c;AspNetCoreRateLimit这一第三方库限流库一般作为首选使用&#xff0c;然而其配置参数过于繁多&#xff0c;对使用者造成较大的学习成本。令人高兴的是&…

【计算机图形学】实验:C#.net环境下采用GDI+图形特技处理案例教程

一、实验目的 掌握在.net环境下对图形特技的处理方法。 二、实验准备 学习在.net环境下读取图像文件、改变颜色等基本知识。 三、实验内容 在.net环境中实现对图像的灰度化处理、柔化和锐化、底片滤镜、淡入淡出以及浮雕、油画和木刻等艺术效果。 四、实验过程及步骤 (…

Android中build target,minSdkVersion,targetSdkVersion,maxSdkVersion概念区分

如果开发的应用用户较多&#xff0c;那么必须保证应用在多个版本不同的设备上能够正确的运行。这就要求对各个版本比较熟悉&#xff0c;知道在什么版本中加入了什么新的功能或特性。但是Android的版本太多了&#xff0c;是个令人头疼的问题。如果想了解Android的版本差异&#…