Intent介绍及Intent在Activity中的使用方法

1.Intent的实现过程

  在Android中,Intent不仅可用于应用程序之间的交互,也可用于应用程序内部的Activity/Service之间的交互。

  Intent负责对应用中一次操作进行描述,描述内容包括动作以及动作所涉及的数据,Android中的Intent机制则根据此描述,找到对应的组件,将Intent传递给该被调用组件,完成对组件的一次调用。

  这便是Intent的实现过程,可见,在Intent中提供了组件互相调用的相关信息,实现了调用者与被调用者之间的解耦。

2.Intent的应用场合

  归纳起来,Intent的应用场合主要有以下三种:

2.1启动一个Activity

  (1)Activity.startActivity(Intent intent);  //启动一个Activity

  (2)Activity.startActivityForResult(Intent intent, int requestCode);  //启动一个带请求码的Activity,当该Activity结束时将回调原Activity的onActivityResult()方法,并返回一个结果码。

2.2启动一个Service

  (1)Context.startService(Intent service); 

  (2)Context.bindService(Intent service, ServiceConnection conn, int flags); 
2.3启动一个Broadcast

  (1)sendBroadcast(Intent intent); 
    sendBroadcastAsUser(Intent intent, UserHandle user); 

  (2)sendStickyBroadcast(Intent intent); 
         sendStickyBroadcastAsUser(Intent intent, UserHandle user); 

  (3)sendOrderedBroadcast(Intent intent, String receiverPermission); 
      sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission,
BroadcastReceiver resultReceiver,Handler scheduler, int initialCode, String initialData, Bundle initialExtras); 

3.Intent属性设置

  Intent的属性设置包括:Action(要执行的动作)、Data(执行动作所操作的数据)、Type(显式的指定Intent的数据类型)、Category(执行动作的附加信息)、Component(指定Intent目标组件的类名称)、Extras(其它所有附加信息的集合)。    

3.1 Action(要执行的动作)

  在SDK中定义了一系列标准动作,其中的一部分如图1所示。



图1 部分标准动作


  其中,ACTION_CALL表示调用拨打电话的应用;ACTION_EDIT表示调用编辑器;ACTION_SYNC表示同步数据。

3.2 Data(执行动作所操作的数据)

  在Intent中,Data使用指向数据的URI来表示。比如,在联系人应用中,指向联系人列表的URI是content://contacts/people/。

3.3 Type(显式的指定Intent的数据类型)

  对于不同的动作,其URI数据的类型是不同的。

  通常,Intent的数据类型能够根据其数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型。

3.4 Category(执行动作的附加信息)

  Category表示执行动作的附加信息。比如,当我们想要让所执行的动作被接收后,作为顶级应用而位于其他所有应用的最上层,并可以使用附加信息LAUNCHER_CATEGORY来实现。 

3.5 Component(指定Intent目标组件的类名称)

  Component用于指定Intent目标组件的类名称。通常,Android会根据Intent 中所包含的其它属性信息(比如Action、Data/Type、Category)进行查找,并找到一个与之匹配的目标组件。但是,如果我们设置了Component属性,明确的指定了Intent目标组件的类名称,那么上述查找过程将不需要执行。 

3.6 Extras(其它所有附加信息的集合)

  使用extras可以为组件提供扩展信息。

4.Intent解析过程

  在使用Intent时,根据是否明确的指定Intent对象的接收者,而分为两种情况。一种是显式的Intent,即在构造Intent对象时就指定其接收者;另一种是隐式的Intent,即在构造Intent对象时,并不指定其接收者。

  对于显式的Intent来说,Android不需要解析Intent,因为目标组件已经很明确。对于隐式的Intent来说,Android需要对其进行解析,通过解析,将Intent映射给可以处理该Intent的Activity、Service或Broadcast。        

  Intent解析机制是通过查找注册在AndroidManifest.xml文件中的所有IntentFilter,以及IntentFilter所定义的Intent,找到最匹配的Intent。

  在解析过程中,Android通过判断Intent的Action、Type、Category这三个属性,从而找出最匹配的Intent,具体的判断方法如下:

  (1)如果Intent指明了Action,则目标组件IntentFilter的Action列表中就必须包含有这个Action,否则不能匹配;

  (2)如果Intent没有提供Type,系统将从Data中得到数据类型。目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。

  (3)如果Intent中的数据不是content: URI,而且Intent也没有明确指定它的Type,将根据Intent中数据的scheme (比如 http: 或者mailto:) 进行匹配。同理,Intent 的scheme必须出现在目标组件的scheme列表中,否则不能匹配。

  (4)如果Intent指定了一个或多个Category,这些类别必须全部出现在目标组件的类别列表中,否则不能匹配。

5.Intent使用实例

  下面介绍几个使用Intent的实例。

5.1调用其他的应用

  通过Intent可以调用并启动别的应用程序,比如调用拨打电话的程序,便可以使用如下的方法来完成:

  1. /*
  2.   * Function :  调用拨打电话的程序
  3.   * Author   :  博客园-依旧淡然
  4.   */
  5.   public void intentDemo_Call() {
  6.       Intent intent_call = new Intent();                //创建一个意图
  7.       intent_call.setAction(Intent.ACTION_CALL);        //设置意图为打电话
  8.       intent_call.setData(Uri.parse("tel:110"));        //设置电话号码
  9.       startActivity(intent_call);                       //启动意图
  10.   }
复制代码


当然了,因为这里使用到了打电话的功能,我们还需要在AndroidManifest.xml文件中,添加申请打电话的资源权限,具体实现方法如下:

  1.  <!-- 打电话的权限 -->
  2. 2     <uses-permission 
  3.       android:name="android.permission.CALL_PHONE"    />
复制代码

有关Android中的权限请求可以参阅《 Android数据手册02:android.permission权限请求汇总 》。
5.2跳转到另一个Activity

  通过使用Intent不仅可以调用别的应用程序,还可以实现应用程序内部之间Activity的跳转。比如如下的代码便实现了从MainActivity跳转到SecondaryActivity,并向SecondaryActivity中传递了两个数据name和age。

  1. /*
  2.       * Function  :  跳转到SecondaryActivity 
  3.       * Author    :  博客园-依旧淡然
  4.       */
  5.      public void intentDemo_GoToSecondaryActivity() {
  6.          Intent intent_toSecondary = new Intent();                      //创建一个意图
  7.          intent_toSecondary.setClass(this, SecondaryActivity.class);    //指定跳转到SecondaryActivity
  8.          intent_toSecondary.putExtra("name", "jack");                   //设置传递内容name
  9.          intent_toSecondary.putExtra("age", 23);                        //设置传递内容age
  10.          startActivity(intent_toSecondary);                             //启动意图
  11.      }
复制代码

 那么,如何在SecondaryActivity中接收从MainActivity中传过来的内容(name、age)呢?下面的代码给出了一种实现方案。

  1. /*
  2.       * Function  :  接收mainActivity中的intent_toSecondary
  3.       * Author    :  博客园-依旧淡然
  4.       */
  5.      public void acceptIntent() {
  6.          Intent intent_accept = getIntent();           //创建一个接收意图
  7.          Bundle bundle = intent_accept.getExtras();    //创建Bundle对象,用于接收Intent数据
  8.          String name = bundle.getString("name");       //获取Intent的内容name
  9.          int age = bundle.getInt("age");               //获取Intent的内容age
  10.      }
复制代码

5.3发送一个带回调方法的意图

  有时,我们可能需要通过定义在MainActivity中的某一控件来启动SecondaryActivity,并且当SecondaryActivity结束时,返给MainActivity一个执行结果。

  要实现上述的功能,只需要完成以下三步骤即可。


  (1)在MainActivity中实现向SecondaryActivity发送带请求码的意图,具体实现方法如下:


  1. /*
  2.       * Function  :  向SecondaryActivity发送带请求码的意图
  3.       * Author    :  博客园-依旧淡然
  4.       */
  5.      public void intentDemo_request() {
  6.          Intent intent_request = new Intent();                      //创建一个意图
  7.          intent_request.setClass(this, SecondaryActivity.class);    //指定跳转到SecondaryActivity
  8.          startActivityForResult(intent_request, REQUEST_CODE);      //启动带请求码意图
  9.      }
复制代码


(2)在SecondaryActivity中接收intent_request,并向意图中填充要返给MainActivity的内容,最后还需要设置一个返回码。具体的实现方法如下:


  1. /*
  2.       * Function  :  接收mainActivity中的intent_request并返回一个结果码
  3.       * Author    :  博客园-依旧淡然 
  4.       */
  5.      public void acceptIntentAndReturn() {
  6.          Intent intent = getIntent();                           //创建一个接收意图
  7.          intent.putExtra("back", "data of SecondaryActivity");  //设置意图的内容
  8.          setResult(RESULT_CODE, intent);                        //设置结果码
  9.          finish();                                              //结束SecondaryActivity,并返回MainActivity
  10.      }
复制代码
3)当结束SecondaryActivity时,程序将返回到MainActivity界面。此时,MainActivity中的onActivityResult()方法将被回调,而我们要做的就是实现该方法。在本示例中,该方法的具体实现方法如下:

  1. /*
  2.       * Function  :  onActivityResult回调方法
  3.       * Author    :  博客园-依旧淡然
  4.       */
  5.      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  6.          if(requestCode == REQUEST_CODE && resultCode == SecondaryActivity.RESULT_CODE) {
  7.              Bundle bundle = data.getExtras();
  8.              String str = bundle.getString("back");
  9.              Toast.makeText(this, "从SecondaryActivity的返回值为:" + str, Toast.LENGTH_LONG).show();
  10.          }
  11.      }
复制代码

 以上的代码,我们通过判断requestCode和resultCode便可以唯一的确定MainActivity中的调用者和SecondaryActivity中的被调用者,建立起了一一对应的关系。并且,我们通过Bundle对象获取了从SecondaryActivity中返回给MainActivity的内容,并通过Toast进行了输出,如图2所示。

图2 从SecondaryActivity中返回的内容


  由图2可见,从SecondaryActivity中返回的内容正是我们在SecondaryActivity中定义的字符串“data of SecondaryActivity”。


6.总结

  本篇博文主要介绍了Intent的相关概念,以及Intent在Activity中的三种使用方法。有关Intent在Service和Broadcast中的使用方法,将在后续的Service和Broadcast的学习过程中再做介绍。

原文链接:http://www.cnblogs.com/menlsh/archive/2013/03/30/2991111.html

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

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

相关文章

java 程序中打开文件和文件夹

打开文件 //打开工具的路径及名字 String toolsPath "C:/WINDOWS/system32/notepad.exe "; //被打开文件的路径及名字 String fileName "test.txt"; try { Runtime.getRuntime().exec(toolsPathfileName); } catch (IOException e) { // TODO Aut…

php函数可变参数列表,PHP函数可变参数列表的具体实现方法介绍

也许对于PHP初级程序员来说&#xff0c;对于PHP函数并不能完全熟练的掌握。我们今天为大家介绍的PHP函数可变参数列表的实现方法主要是利用func_get_args()、 func_num_args()、func_get_arg()这三个系统函数来实现的&#xff0c;其中func_get_args()函数以数组的形式获得参数列…

程序结束后去哪儿了?

大家好&#xff0c;我是写代码的篮球球痴&#xff0c;转发一篇卓老师的文章&#xff0c;文章中的内容我之前做单片机的时候也有遇到过。推荐给大家看看~简 介&#xff1a; 对于嵌入式系统&#xff0c;如果没有运行RTOS&#xff0c;那么程序开发中的 主函数&#xff08;main()&a…

CodeSmith终极玩法

CodeSmith是一个模仿asp.net运行机制的代码生成器, 运行时分析模板(相当aspx文件)的预编译指令和主体内容, 生成一个继承自CodeSmith.Engine.CodeTemplate(相当于System.Web.UI.Page)或者一个在Inherites预编译指令指定的类(相当于CodeBehind类)的源码, 且把它编译. 然后把这个…

bom与dom

区别 BOM&#xff08;Browser Object Model&#xff09; BOM 即浏览器对象模型&#xff0c;BOM没有相关标准&#xff0c;BOM的最核心对象是window对象。window对象既为javascript访问浏览器提供API&#xff0c;同时在ECMAScript中充当Global对象。BOM和浏览器关系密切&#xff…

Service 的生命周期;两种启动方法和区别

1&#xff1a;startService Service的生命周期&#xff1a;onCreate() --> onStart() -> onDestroy() 停止服务&#xff1a;service.stopService() 2&#xff1a;bindService Service的生命周期 onCreate() --> onBind() --> onUnBind() --> onDestroy() 停止…

用反射简化 asp.net 报表的一点总结

有几个报表, 查询条件都一样&#xff0c;仅仅里面GridView中有几个列区别&#xff0c;以前图快&#xff0c;就把原来Report.aspx文件拷贝一份&#xff0c;改名为Report1.aspx&#xff0c;然后&#xff0c;修改里面的column&#xff0c;然后再由后台库查出数据&#xff0c;填充到…

超轻型的数据库sqlite

很多次看到别人提到这个东西&#xff0c;最近因项目需要看了看&#xff0c;确实好用。总共就两个文件&#xff0c;我想不能再简单了。还是开源的。开发rails也可以用&#xff0c;不错&#xff01;转载于:https://www.cnblogs.com/chenge/archive/2005/06/29/183508.html

有些事不用听别人的

今天在群里跟几个朋友聊天&#xff0c;然后说了自己的想法&#xff0c;最近很多人在说公众号不会有好的发展&#xff0c;写文章也是没有出路的。不过这个是事实。短视频才是可能是出路&#xff0c;短视频是个很大的蛋糕&#xff0c;从表达方式上来说&#xff0c;视频的表达方式…

php读取三维数组,php 读取多维数组方法_PHP教程

php 读取多维数组方法for($i0;$i{for($j0;$j{echo $array[$j][userid];}}因为它是个多维数组,一般用foreach ($arr as $key > $value) {echo "Key: $key; Value: $value\n";}Array ( [0] > Array ( [userid] > 1 [username] > 刘振鹏 [status] > 0 [u…

互斥锁mutex的使用方法

在线程实际运行过程中&#xff0c;我们经常需要多个线程保持同步。这时可以用互斥锁来完成任务&#xff1b;互斥锁的使用过程中&#xff0c;主要有pthread_mutex_init&#xff0c;pthread_mutex_destory&#xff0c;pthread_mutex_lock&#xff0c;pthread_mutex_unlock这几个函…

1000瓶药水,1瓶有毒药,几只小白鼠能够找出毒药

1000瓶药水&#xff0c;1瓶有毒药&#xff0c;服用后一小时毒发&#xff0c;毒药可以无限稀释&#xff0c;那么一小时内用几只小白鼠能够找出毒药&#xff1f; 假如是8瓶药水&#xff0c;3只小白鼠。 0000  0011  0102  0113  1004  1015  1106  1117 每位数表示…

25个优秀的设计机构网站设计案例

今天&#xff0c;我们一起来欣赏网站设计工作室自己的网站。设计公司的网站除了要能够吸引客户以外&#xff0c;还要通过他们自己的网站向客户展示他们的设计理念和风格。这里收集的25个优秀的设计机构网站既有清爽简洁风格的&#xff0c;也有色彩丰富&#xff0c;图文并茂的&a…

windows server 2003 出错提示请求的资源在使用中解决方案

1.杀毒软件造成IIS站点‘请求的资源在使用中’”的消息&#xff0c;如瑞星2005&#xff0c;服务器上使用单机版杀毒一般都不会稳定的。马上把瑞星卸载了&#xff0c;重启机器&#xff0c;一切正常。 2.IUSR_机器名和IWAM_机器名的账号不同步,这个在网上已经有解决方案了只要打开…

一个适用各类场合的Makefile模板

1.写在前面对于Windows下开发&#xff0c;很多IDE都集成了编译器&#xff0c;如Visual Studio&#xff0c;提供了“一键编译”&#xff0c;编码完成后只需一个操作即可完成编译、链接、生成目标文件。Linux开发与Windows不同&#xff0c;Linux下一般用的的gcc/g编译器&#xff…

matlab r2014a错误,MATLAB中的潜在错误使R2014a回归

MATLAB R2014a过去工作得很好w回归但是现在当变量很好并且排名满意时我得到一个错误。X rand([10 3])X 0.8407 0.3517 0.07590.2543 0.8308 0.05400.8143 0.5853 0.53080.2435 0.5497 0.77920.9293 0.9172 0.93400.3500 0.2858 0.12990.1966 0.7572 0.56880.2511 0.7537 0.469…

Android 如何退出整个应用程序?

转载文章&#xff1a;http://blog.csdn.net/sunnyfans/article/details/7688092 Android 怎么退出整个应用程序&#xff1f; 我们在写android应用程序时&#xff0c;经常会遇到想退出当前Acitivity&#xff0c;或者直接退出应用程序.我之前的一般操作是按返回键&#xff0c;或者…

excel拼接数据宏

将sheet2的A2 和 G2 加上 sheet5的A2和B2合一起生成新的sheet--就是将两个sheet的指定列前后拼接一起作为一个新的sheet Sub addwork() Sheets.Add after:Sheets(Sheets.Count) ActiveSheet.Name "临时合并数据" Dim s, sht, shts Dim arr, brr1, br…

关于我曾经做过的一个商业社区的ui框架

1.主页面default2.容器,中间页面process载入模板3.模板:BasePage4,BasePageprotected override void Render(System.Web.UI.HtmlTextWriter writer) {writer.WriteLine("Header");base.Render(writer);writer.WriteLine("Header");}转载于:https://www.cnb…

毕业十年|我的嵌入式AI学习路线(笔记、代码)

嵌入式从业者接下来会有怎样的黄金十年&#xff1f;在物联网和人工智能的促进下&#xff0c;嵌入式在未来的5-10年内会迎来更多的发展机会&#xff0c;一方面嵌入式开发会迎来更多的应用场景&#xff0c;另一方面嵌入式开发的技术体系也会逐渐丰富&#xff0c;从而拓展物联网开…