Android组件系列----Intent详解

来源:http://www.venoautomotive.com 作者:www.463.com 人气:102 发布时间:2019-11-23
摘要:  【声明】   应接转载,但请保留小说原本出处→_→  生命壹号:  随笔来源:  Android组件系列----Intent详解。  【正文】 Intent组件即便不是第四次全国代表大会组件,但却是连接四

 【声明】 

应接转载,但请保留小说原本出处→_→ 

生命壹号: 

随笔来源: 

Android组件系列----Intent详解。 

【正文】

Intent组件即便不是第四次全国代表大会组件,但却是连接四大组件的桥梁,学习好这么些文化,也不行的根本。

Android组件系列----Intent详解。一、什么是Intent

1、Intent的概念:

  • Android中提供了Intent机制来帮衬应用间的人机联作与广播发表,或许应用更标准的传道是,Intent不仅仅可用来应用程序之间,也可用来应用程序内部的activity, service和broadcast receiver之间的竞相。Intent这几个立陶宛共和国(Republic of Lithuania卡塔尔国语单词的原意是“目标、意向、意图”。
  • Intent是黄金年代种运维时绑定(runtime binding)机制,它能在程序运转的进度中三番两次多少个不等的机件。通过Intent,你的主次能够向Android表明某种央浼大概愿望,Android会依照意愿的剧情选取分外的零件来响应。

activity、service和broadcast receiver之间是经过Intent进行通讯的,而除此以外一个零器件Content Provider本人正是生龙活虎种通讯机制,不必要经过Intent。我们来看下边那个图就理解了:

图片 1

假使Activity1要求和Activity2实行关联,二者无需直接挂钩,而是通过Intent作为桥梁。通俗来说,Intnet相符于中介、媒婆的剧中人物。

 

2、对于向那二种组件发送intent有两样的体制:

  • 接纳Context.startActivity() 或 Activity.startActivityForResult(),传入一个intent来运维一个activity。使用 Activity.setResult(),传入贰个intent来从activity中回到结果。
  • 将intent对象传给Context.startService()来运转二个service只怕传消息给三个周转的service。将intent对象传给 Context.bindService()来绑定三个service。
  • Android组件系列----Intent详解。将intent对象传给 Context.send布罗兹cast(),Context.sendOrderedBroadcast(),或许Context.sendSticky布罗兹cast()等广播方法,则它们被传给 broadcast receiver。

二、Intent的相关属性:

  • Intent由以下依次组成都部队分:
  • component(组件):指标组件
  • action(动作卡塔 尔(英语:State of Qatar):用来表现意图的行走
  • category(体系卡塔 尔(英语:State of Qatar):用来表现动作的门类
  • data(数据卡塔尔国:表示与动作要调整的数量
  • Android组件系列----Intent详解。type(数据类型卡塔尔:对于data模范的形容
  • extras(扩张新闻卡塔 尔(英语:State of Qatar):扩大新闻
  • Flags(标识位卡塔 尔(阿拉伯语:قطر‎:期望以此意图的运转情势

Intent类型分为显式Intent(直接类型卡塔 尔(英语:State of Qatar)、隐式Intent(直接类型卡塔尔国。官方建议采纳隐式Intent。上述天性中,component属性为直接类型,别的均为直接类型。

看待与显式Intent,隐式Intnet则含蓄了多数,它并不明显提出我们想要运营哪一个活动,而是内定一文山会海更为抽象的action和category等消息,然后交由系统去剖析那些Intent,并帮大家找寻切合的活动去运转。

Activity 中 Intent Filter 的特别进程:

图片 2

 

1、component(组件):指标组件

Android组件系列----Intent详解。Component属性鲜明钦点Intent的靶子组件的类名称。(归于直接Intent卡塔 尔(阿拉伯语:قطر‎

假设component这一个性格有钦点的话,将一向行使它钦点的机件。钦点了那个性情现在,Intent的任何具备属性都是可选的。

诸如,运转首个Activity时,我们得以这么来写:

 1         button1.setOnClickListener(new OnClickListener() {            
 2             @Override
 3             public void onClick(View v) {
 4                 //创建一个意图对象
 5                 Intent intent = new Intent();
 6                 //创建组件,通过组件来响应
 7                 ComponentName component = new ComponentName(MainActivity.this, SecondActivity.class);
 8                 intent.setComponent(component);                
 9                 startActivity(intent);                
10             }
11         });

万大器晚成写的简约一点,监听事件onClick()方法里能够如此写:

1                 Intent intent = new Intent();
2                 //setClass函数的第一个参数是一个Context对象
3                 //Context是一个类,Activity是Context类的子类,也就是说,所有的Activity对象,都可以向上转型为Context对象
4                 //setClass函数的第二个参数是一个Class对象,在当前场景下,应该传入需要被启动的Activity类的class对象
5                 intent.setClass(MainActivity.this, SecondActivity.class);
6                 startActivity(intent);    

再轻松一点,可以如此写:(当然,也是最普及的写法卡塔尔

1                 Intent intent = new Intent(MainActivity.this,SecondActivity.class);
2                 startActivity(intent);

 

 

2、Action(动作卡塔尔国:用来显现意图的行路

当平常生活中,描述二个愿望或希望的时候,总是有贰个动词在中间。举例:小编想“做”七个仰卧起坐;笔者要“写” 生龙活虎封表白信,等等。在Intent中,Action就是描述做、写等动作的,当你指明了叁个Action,实践者就能够遵照本条动作的提示,选择有关输入,表现对应行为,发生相符的输出。在Intent类中,定义了一堆量的动作,比如ACTION_VIEW,ACTION_PICK等, 基本富含了常用动作。加的动作越来越多,越规范。

Action 是一个客商定义的字符串,用于描述叁个 Android 应用程序组件,贰个 Intent Filter 可以包涵多个 Action。在 AndroidManifest.xml 的Activity 定义时,能够在其 <intent-filter >节点钦命三个 Action列表用于标志Activity 所能接纳的“动作”。

 

3、category(种类卡塔尔:用来显现动作的项目

Category属性也是用作<intent-filter>子成分来声称的。比方:

<intent-filter>

  <action android:name="com.vince.intent.MY_ACTION"></action>

  <category android:name="com.vince.intent.MY_CATEGORY"></category> 

  <category android:name="android.intent.category.DEFAULT"></category> 

</intent-filter>   

Action 和category常常是放在一同用的,所以这里一同介绍一下。大家来先来举一个例子:

新建叁个工程文件smyh006_Intent01,在私下认可文件的底子之上,新建文件SecondActicity.java和activity_second.xml。

随着,大家要到清单文件中张开挂号,打开AndroidManifest.xml,增添SecondActivity的action和category的过滤器:

1         <activity 
2             android:name=".SecondActivity">
3             <intent-filter>
4                  <action android:name="com.example.smyh006intent01.MY_ACTION"/>
5                  <category android:name="android.intent.category.DEFAULT" />
6             </intent-filter>            
7         </activity>

下边代码,表示SecondActicity能够匹配第4行的MY_ACTION那一个动作,当时,要是在别的的Acticity通过这些action的原则来研究,那SecondActicity就有所了那一个标准。雷同于相亲时,小编要求对方有怎么着原则,然后对方那个SecondActicity恰恰满意了那么些条件(够通俗了呢卡塔尔。

注:若无一点点名的category,则必需选用暗许的DEFAULT(即上方第5行代码卡塔尔。

也正是说:唯有<action>和<category>中的内容还要能够协作上Intent中钦定的action和category时,那些活动技术响应Intent。如若利用的是DEFAULT这种暗中同意的category,在稍后调用startActivity()方法的时候会自动将这几个category增多到Intent中。

近来来改正MainActivity.java中按键的点击事件,代码如下:

 1         button1.setOnClickListener(new OnClickListener() {            
 2             @Override
 3             public void onClick(View v) {
 4                 //启动另一个Activity,(通过action属性进行查找)
 5                 Intent intent = new Intent();
 6                 //设置动作(实际action属性就是一个字符串标记而已)
 7                 intent.setAction("com.example.smyh006intent01.MY_ACTION"); //方法:Intent android.content.Intent.setAction(String action)
 8                 startActivity(intent);        
 9             }
10         });

上面代码中,也足以换来下边这种简洁的艺术:

1         button1.setOnClickListener(new OnClickListener() {            
2             @Override
3             public void onClick(View v) {
4                 //启动另一个Activity,(通过action属性进行查找)
5                 Intent intent = new Intent("com.example.smyh006intent01.MY_ACTION");//方法: android.content.Intent.Intent(String action)                
6                 startActivity(intent);        
7             }
8         });

上边第5行代码:在这里个Intent中,笔者并从未点名具体哪二个Activity,笔者只是钦赐了叁个action的常量。所以说,隐式Intent的功力就表现的淋漓了。当时,点击MainActicity中的开关,就能跳到SecondActicity中去。

上述情状唯有SecondActicity相称成功。要是有多少个零器件相配成功,就能以对话框列表的法子让客商展开分选。我们来详细介绍一下:

咱俩新建文件ThirdActicity.java和activity_third.xml,然后在项目清单文件AndroidManifest.xml中增加ThirdActivity的action和category的过滤器:

1         <activity 
2             android:name=".ThirdActivity">
3             <intent-filter>
4                  <action android:name="com.example.smyh006intent01.MY_ACTION"/>
5                  <category android:name="android.intent.category.DEFAULT" />
6             </intent-filter>            
7         </activity> 

这个时候,运路程序,当点击MainActivity中的开关时,弹出如下分界面:

图片 3

相信大家看来了那一个分界面,应该就一览无遗了。于是大家得以做出如下总结:

在自定义动作时,使用activity组件时,必需增多一个私下认可的品种

切切实实的贯彻为:

<intent-filter>

               <action android:name="com.example.action.MY_ACTION"/>

               <category android:name="android.intent.category.DEFAULT"/>

</intent-filter>

万生龙活虎有多个构件被相称成功,就能以对话框列表的章程让顾客举办抉择。

各种Intent中只好钦命二个action,但却能钦点多少个category;体系更加的多,动作越具体,意图越分明(相似于相亲时,给对方提了众多渴求卡塔尔。

脚下大家的Intent中独有叁个暗中同意的category,未来能够透过intent.addCategory()方法来兑现。改革MainActivity中按键的点击事件,代码如下:

 1         button1.setOnClickListener(new OnClickListener() {            
 2             @Override
 3             public void onClick(View v) {
 4                 //启动另一个Activity,(通过action属性进行查找)
 5                 Intent intent = new Intent();
 6                 //设置动作(实际action属性就是一个字符串标记而已)
 7                 intent.setAction("com.example.smyh006intent01.MY_ACTION"); //方法:Intent android.content.Intent.setAction(String action)
 8                 intent.addCategory("com.example.smyh006intent01.MY_CATEGORY");
 9                 startActivity(intent);        
10             }
11         });

既然在Intent中增添了三个category,那么我们要在项目清单文件中去注脚这些category,不然程序将无法运营。代码如下:

1             android:name=".SecondActivity">
2             <intent-filter>
3                  <action android:name="com.example.smyh006intent01.MY_ACTION"/>
4                  <category android:name="android.intent.category.DEFAULT" />
5                  <category android:name="com.example.smyh006intent01.MY_CATEGORY" />
6             </intent-filter>            
7         </activity>

那会儿,点击MainActicity中的按键,就能够跳到SecondActicity中去。

总计如下:

自定义连串: 在Intent加多连串能够增加多少个连串,那就要求被相配的组件必得同临时间满足那四个品类,才具协作成功。操作Activity的时候,若无项目,须加上暗中认可种类

 

4、data(数据卡塔 尔(英语:State of Qatar):表示与动作要调整的数量

  • Data属性是Android要拜候的数额,和action和Category评释格局相仿,也是在<intent-filter>中。
  • 七个零零器件相配成功显示优先级高的; 相似展现列表。

Data是用多个uri对象来代表的,uri代表数量的地址,归于风流倜傥种标志符。平常状态下,大家接受action+data属性的构成来描述叁个意图:做如何

动用隐式Intent,大家不但能够运维本身程序内的移位,还足以运营别的程序的移动,那使得Android多少个应用程序之间的效果分享成为了大概。比方应用程序中须求展现一个网页,未有供给本身去贯彻三个浏览器(事实上也不太也许卡塔 尔(英语:State of Qatar),而是只要求条用系统的浏览器来开采这么些网页就能够了。

【实例】张开内定网页:

MainActivity.java中,监听器部分的骨干代码如下:

 1         button1.setOnClickListener(new OnClickListener() {            
 2             @Override
 3             public void onClick(View v) {
 4                 Intent intent = new Intent();
 5                 intent.setAction(Intent.ACTION_VIEW);
 6                 Uri data = Uri.parse("http://www.baidu.com");
 7                 intent.setData(data);                
 8                 startActivity(intent);        
 9             }
10         });

本来,上方代码也足以简写成:

1         button1.setOnClickListener(new OnClickListener() {            
2             @Override
3             public void onClick(View v) {
4                 Intent intent = new Intent(Intent.ACTION_VIEW);
5                 intent.setData(Uri.parse("http://www.baidu.com"));                
6                 startActivity(intent);        
7             }
8         });

第4行代码:指定了Intent的action是 Intent.ACTION_VIEW,表示查看的情趣,那是多少个Android系统内置的动作;

第5行代码:通过Uri.parse()方法,将二个网站字符串深入深入分析成叁个Uri对象,再调用intent的setData()方法将那个Uri对象传递步入。

当点击按键时,将跳到如下分界面:

图片 4

此刻, 调用的是系统默许的浏览器,也正是说,只调用了那四个零器件。现在只要有多少个构件获得了同盟,应该是怎么样情况呢?

咱们更正改良项目清单文件中对SecondAcivity的扬言:

1         <activity 
2             android:name=".SecondActivity">
3             <intent-filter>
4                  <action android:name="android.intent.action.VIEW" />
5                  <category android:name="android.intent.category.DEFAULT" />
6                  <data android:scheme="http" android:host="www.baidu.com"/>                 
7             </intent-filter>            
8         </activity>

现行反革命,SecondActivity也格外成功了,我们运路程序,点击MainActicity的按键时,弹出如下分界面供我们筛选:

图片 5

作者们能够总括如下:

  • 当Intent相配成功的组件有多少个时,彰显优先级高的构件,假使优先级相仿,展现列表让客户自身筛选
  • 预先级从-1000至1000,并且个中叁个必得为负的才使得

注:系统暗许的浏览器并不曾做出优先级证明,其事先级暗许为正数。

先行级的安插如下:

在清单文件中期维修改对SecondAcivity的评释,即扩充后生可畏行代码,通过来android:priority设置优先级,如下:

1         <activity 
2             android:name=".SecondActivity">
3             <intent-filter android:priority="-1">
4                  <action android:name="android.intent.action.VIEW" />
5                  <category android:name="android.intent.category.DEFAULT" />
6                  <data android:scheme="http" android:host="www.baidu.com"/>                                  
7             </intent-filter>            
8         </activity>

注:

Data属性的扬言中要钦定访谈数据的Uri和MIME类型。能够在<data>成分中经过一些本性来设置:

android:scheme、android:path、android:port、android:mimeType、android:host等,通过这么些属性来对号入座八个标准的Uri格式scheme://host:port/path。举个例子:

 

5、type(数据类型卡塔尔:对于data范例的刻画

假若Intent对象中既包涵Uri又带有Type,那么,在<intent-filter>中也非得双方都满含技艺通过测验。

Type属性用于明显钦赐Data属性的数据类型或MIME类型,不过经常来讲,当Intent不点名Data属性时,Type属性才会起功效,不然Android系统将会依赖Data属性值来深入分析数据的档案的次序,所以不必钦点Type属性。

data和type属性温日只须要二个,通过setData方法会把type属性设置为null,相反设置setType方法会把data设置为null,假若想要五个个性同一时候安装,要动用Intent.setDataAndType()方法。

【任务】:data+type属性的施用
【实例】:播放钦定路径的mp4文本。

切实如下:

新建筑工程程文件smyh006_Intent02,MainActivity.java中按键监听事件部分的代码如下:

 1         button.setOnClickListener(new OnClickListener(){
 2             @Override
 3             public void onClick(View v) {
 4                 Intent intent = new Intent();
 5                 intent.setAction(Intent.ACTION_VIEW);
 6                 Uri data = Uri.parse("file:///storage/sdcard0/平凡之路.mp3");
 7                 //设置data+type属性
 8                 intent.setDataAndType(data, "audio/mp3"); //方法:Intent android.content.Intent.setDataAndType(Uri data, String type)
 9                 startActivity(intent);                
10             }            
11         });

代码解释:

第6行:"file://"表示查找文件,前边再加多本人的OPPO手提式无线话机存款和储蓄卡的门道:/storage/sdcard0,再拉长具体歌曲的路径。

第8行:设置data+type属性  

运维后,当点击开关时,效果如下:

图片 6

上方界面中,使用的是Moto渡部建系统私下认可的音乐播放器。

 

6、extras(扩张消息卡塔尔:增加音讯

是其他具备附加消息的联谊。使用extras可感觉组件提供扩大消息,比方,如果要实践“发送电子邮件”那几个

动作,能够将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。

 

7、Flags(标志位卡塔 尔(阿拉伯语:قطر‎:期待以此意向的周转形式

贰个主次运行后系统会为那一个程序分配叁个task供其行使,别的同三个task里面能够具有分歧应用程序的activity。那么,同一个前后相继能或不能够具备四个task?那就关系到加载activity的启航方式,这几个必要独自讲一下。

注:android中风流洒脱组逻辑上在协同的activity被叫作task,自个儿感到能够领略成三个activity堆栈。

 

三、Activity的起步格局:(面试注意卡塔 尔(阿拉伯语:قطر‎

Activity有二种运维方式:standard、singleTop、singleTask、singleInstance。能够在AndroidManifest.xml中activity标签的习性android:launchMode中设置该activity的加载格局。

  • standard形式:暗许的方式,以这种方式加载时,每当运行二个新的活动,必定会构造一个新的Activity实例放到重返栈(指标task卡塔尔国的栈顶,不管这么些Activity是或不是早就存在于重回栈中;
  • singleTop格局:假使四个以singleTop方式运行的activity的实例已经存在于重回桟的桟顶,那么再起步这些Activity时,不会创制新的实例,而是录取位于栈顶的老大实例,何况会调用该实例的onNewIntent()方法将Intent对象传递到这几个实例中;

注:借使以singleTop情势运营的activity的八个实例已经存在于再次来到桟中,可是不在桟顶,那么它的作为和standard格局相像,也会创立多少个实例;

  • singleTask形式:这种格局下,每趟运营三个activity时,系统率先会在回来栈中检查是还是不是留存该活动的实例,要是存在,则直接行使该实例,并把那一个活动之上的兼具活动统统去掉;如果未有察觉就能够创建三个新的移位实例;
  • singleInstance形式:总是在新的职责中张开,並且那个新的职务中有且唯有这么些实例,也正是说被该实例运维的任何activity会自动运转于另一个任务中。当再次运转该activity的实例时,会再度调用已存在的天职和实例。而且会调用那一个实例的onNewIntent()方法,将Intent实例传递到该实例中。和singleTask相似,同不日常刻在系统中只会存在二个这么的Activity实例。(singleInstance即单实例)

注:前边三种情势中,每种应用程序都有谈得来的归来栈,同二个平移在不一致的回来栈中入栈时,必然是开创了新的实例。而利用singleInstance形式能够扫除那些主题材料,在这里种情势下会有三个独门的回来栈来管理这么些活动,不管是哪三个应用程序来访谈那一个运动,都公用同贰个回来栈,也就一蹴而就了分享活动实例的标题。(这时候能够实现任务之间的切换,实际不是单身有些栈中的实例切换卡塔尔国

 

实则大家不在清单文件中设置,只在代码中通过flag来安装也是足以的,如下:

1         Intent intent = new Intent(MainActivity.this,SecondActivity.class);
2         //相当于singleTask
3         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
4         startActivity(intent);

 

 

1         Intent intent = new Intent(MainActivity.this,SecondActivity.class);
2         //相当于singleTop
3         intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
4         startActivity(intent);

 

 

三、Intent的广大应用:

1、展开钦赐网页:(直接复制的上面的代码卡塔 尔(阿拉伯语:قطر‎

MainActivity.java中,监听器部分的主导代码如下:

 1         button1.setOnClickListener(new OnClickListener() {            
 2             @Override
 3             public void onClick(View v) {
 4                 Intent intent = new Intent();
 5                 intent.setAction(Intent.ACTION_VIEW);//方法:android.content.Intent.Intent(String action)
 6                 Uri data = Uri.parse("http://www.baidu.com");
 7                 intent.setData(data);                
 8                 startActivity(intent);        
 9             }
10         });

本来,上方代码也得以简写成:

1   button1.setOnClickListener(new OnClickListener() {            
2             @Override
3             public void onClick(View v) {
4                 Intent intent = new Intent(Intent.ACTION_VIEW);
5                 intent.setData(Uri.parse("http://www.baidu.com"));                
6                 startActivity(intent);        
7             }
8         });

第4行代码:指定了Intent的action是 Intent.ACTION_VIEW,表示查看的意味,那是多少个Android系统内置的动作;

第5行代码:通过Uri.parse()方法,将二个网址字符串解析成一个Uri对象,再调用intent的setData()方法将这些Uri对象传递步入。

要么可以写成:

1         button1.setOnClickListener(new OnClickListener() {            
2             @Override
3             public void onClick(View v) {
4                 Uri uri = Uri.parse("http://www.baidu.com");
5                 Intent intent = new Intent(Intent.ACTION_VIEW,uri);//方法: android.content.Intent.Intent(String action, Uri uri)        
6                 startActivity(intent);        
7             }
8         });

 

2、打电话:

【情势意气风发】展开拨打电话的分界面:

 

1                 Intent intent = new Intent(Intent.ACTION_DIAL);
2                 intent.setData(Uri.parse("tel:10086"));
3                 startActivity(intent);  

运营程序后,点击开关,突显如下分界面:

图片 7

 

【情势二】直接拨打电话:

 

1                 Intent intent = new Intent(Intent.ACTION_CALL);
2                 intent.setData(Uri.parse("tel:10086"));
3                 startActivity(intent);

要使用那些成效亟须在布局文件中投入权限:(加后生可畏行代码卡塔尔国

 

1     <uses-sdk
2         android:minSdkVersion="8"
3         android:targetSdkVersion="16" />
4     <uses-permission android:name="android.permission.CALL_PHONE"/>

 

3、发送短信:

【情势大器晚成】打开垦送短信的界面:action+type

 

1         Intent intent = new Intent(Intent.ACTION_VIEW);
2         intent.setType("vnd.android-dir/mms-sms");
3         intent.putExtra("sms_body", "具体短信内容"); //"sms_body"为固定内容
4         startActivity(intent); 

【格局二】张开采短信的分界面(同一时间钦命电话号码):action+data

 

1         Intent intent = new Intent(Intent.ACTION_SENDTO);
2         intent.setData(Uri.parse("smsto:18780260012"));
3         intent.putExtra("sms_body", "具体短信内容"); //"sms_body"为固定内容        
4         startActivity(intent);

4、播放钦点路径音乐:action+data+type

 

1         Intent intent = new Intent(Intent.ACTION_VIEW);
2         Uri uri = Uri.parse("file:///storage/sdcard0/平凡之路.mp3"); ////路径也可以写成:"/storage/sdcard0/平凡之路.mp3"
3         intent.setDataAndType(uri, "audio/mp3"); //方法:Intent android.content.Intent.setDataAndType(Uri data, String type)
4         startActivity(intent);

5、卸载程序:action+data(比方点击按键,卸载某些应用程序,依据包名来甄别卡塔 尔(英语:State of Qatar)

注:无论是安装照旧卸载,应用程序是基于包名package来识别的。

 

1         Intent intent = new Intent(Intent.ACTION_DELETE);
2         Uri data = Uri.parse("package:com.example.smyh006intent01");
3         intent.setData(data);
4         startActivity(intent);

6、安装程序:action+data+type

 

1         Intent intent = new Intent(Intent.ACTION_VIEW);
2         Uri data = Uri.fromFile(new File("/storage/sdcard0/AndroidTest/smyh006_Intent01.apk"));    //路径不能写成:"file:///storage/sdcard0/···"
3         intent.setDataAndType(data, "application/vnd.android.package-archive");  //Type的字符串为固定内容
4         startActivity(intent);

注:第2行的不二等秘书籍不可能写成:"file:///storage/sdcard0/···",不然报错如下:

图片 8

闷葫芦:通过上面包车型地铁这种方法安装程序,运营时怎么会出错呢?

 

1     //通过指定的action来安装程序
2     public void installClickTwo(View view){
3         Intent intent = new Intent(Intent.ACTION_PACKAGE_ADDED);
4         Uri data = Uri.fromFile(new File("/storage/sdcard0/AndroidTest/smyh006_Intent01.apk"));    //路径不能写成:"file:///storage/sdcard0/···"
5         intent.setData(data);
6         startActivity(intent);
7     }

 

 

 

 

综述,完整版代码如下:

 

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     android:orientation="vertical"
10     tools:context=".MainActivity" >
11     <Button 
12         android:id="@+id/button1_browsePage"
13         android:layout_width="match_parent"
14         android:layout_height="wrap_content"
15         android:onClick="browsePageClick"
16         android:text="打开指定网页"/>   
17     <Button 
18         android:id="@+id/button2_openDialPage"
19         android:layout_width="match_parent"
20         android:layout_height="wrap_content"
21         android:onClick="openDialPageClick"
22         android:text="打开拨号面板"/>
23     <Button 
24         android:id="@+id/button3_dialPhone"
25         android:layout_width="match_parent"
26         android:layout_height="wrap_content"
27         android:onClick="dialPhoneClick"
28         android:text="直接拨打指定号码"/>
29     <Button 
30         android:id="@+id/button4_openMsgPage"
31         android:layout_width="match_parent"
32         android:layout_height="wrap_content"
33         android:onClick="openMsgPageClick"
34         android:text="打开发短信的界面"/>
35     
36     
37      <Button 
38         android:id="@+id/button5_sendMsg"
39         android:layout_width="match_parent"
40         android:layout_height="wrap_content"
41         android:onClick="sendMsgClick"
42         android:text="给指定的人发短信"/>  
43         
44      <Button 
45         android:id="@+id/button6_playMusic"
46         android:layout_width="match_parent"
47         android:layout_height="wrap_content"
48         android:onClick="playMusicClick"
49         android:text="播放指定路径音乐"/>      
50      
51      <Button 
52         android:id="@+id/button7_uninstall"
53         android:layout_width="match_parent"
54         android:layout_height="wrap_content"
55         android:onClick="uninstallClick"
56         android:text="卸载程序"/>    
57      <Button 
58         android:id="@+id/button8_install"
59         android:layout_width="match_parent"
60         android:layout_height="wrap_content"
61         android:onClick="installClick"
62         android:text="安装程序"/>    
63         
64     
65 </LinearLayout>

MainActivity.java代码如下:

 

 1 package com.example.m06intent01;
 2 import java.io.File;
 3 import android.app.Activity;
 4 import android.content.Intent;
 5 import android.net.Uri;
 6 import android.os.Bundle;
 7 import android.view.Menu;
 8 import android.view.View;
 9 public class MainActivity extends Activity {
10     @Override
11     protected void onCreate(Bundle savedInstanceState) {
12         super.onCreate(savedInstanceState);
13         setContentView(R.layout.activity_main);
14     }
15     //打开指定网页
16     public void browsePageClick(View view){
17         Intent intent = new Intent(Intent.ACTION_VIEW);
18         intent.setData(Uri.parse("http://www.baidu.com/"));
19         startActivity(intent);  
20         
21     } 
22     
23     //打开拨号面板
24     public void openDialPageClick(View view){
25         Intent intent = new Intent(Intent.ACTION_DIAL);
26         intent.setData(Uri.parse("tel:10086"));
27         startActivity(intent);        
28     }
29     
30     //直接拨打指定号码
31     public void dialPhoneClick(View view){
32         Intent intent = new Intent(Intent.ACTION_CALL);
33         intent.setData(Uri.parse("tel:10086"));
34         startActivity(intent);        
35     }
36     
37     //打开发短信的界面:action+type
38     public void openMsgPageClick(View view){
39         Intent intent = new Intent(Intent.ACTION_VIEW);
40         intent.setType("vnd.android-dir/mms-sms");
41         intent.putExtra("sms_body", "具体短信内容"); //"sms_body"为固定内容
42         startActivity(intent);        
43     }   
44     
45     //打开发短信的界面(指定电话号码):action+data
46     public void sendMsgClick(View view){
47         Intent intent = new Intent(Intent.ACTION_SENDTO);
48         intent.setData(Uri.parse("smsto:18780260012"));
49         intent.putExtra("sms_body", "具体短信内容"); //"sms_body"为固定内容        
50         startActivity(intent);        
51     }      
52     
53     //播放指定路径音乐
54     public void playMusicClick(View view){
55         Intent intent = new Intent(Intent.ACTION_VIEW);
56         Uri uri = Uri.parse("file:///storage/sdcard0/平凡之路.mp3");  //路径也可以写成:"/storage/sdcard0/平凡之路.mp3"
57         intent.setDataAndType(uri, "audio/mp3"); //方法:Intent android.content.Intent.setDataAndType(Uri data, String type)
58         startActivity(intent);
59     } 
60     
61     //卸载某个应用程序,根据包名来识别
62     public void uninstallClick(View view){
63         Intent intent = new Intent(Intent.ACTION_DELETE);
64         Uri data = Uri.parse("package:com.example.smyh006intent01");
65         intent.setData(data);
66         startActivity(intent);
67     } 
68     
69     //安装某个应用程序,根据apk的文件名来识别
70     public void installClick(View view){
71         Intent intent = new Intent(Intent.ACTION_VIEW);
72         Uri data = Uri.fromFile(new File("/storage/sdcard0/AndroidTest/smyh006_Intent01.apk"));    //路径不能写成:"file:///storage/sdcard0/···"
73         intent.setDataAndType(data, "application/vnd.android.package-archive");  //Type的字符串为固定内容
74         startActivity(intent);
75     }
76     
77     
78     @Override
79     public boolean onCreateOptionsMenu(Menu menu) {
80         // Inflate the menu; this adds items to the action bar if it is present.
81         getMenuInflater().inflate(R.menu.main, menu);
82         return true;
83     }
84     
85 }

运行后,主分界面如下:

图片 9

【工程文件】

链接:

密码:qnix

本文由永利官网误乐域发布于www.463.com,转载请注明出处:Android组件系列----Intent详解

关键词:

频道精选

最火资讯