餐饮门户网站源码,世界做诡异的地方网站,wordpress怎么查看主题,wordpress 分类目录 别名1.Intent的实现过程 在Android中#xff0c;Intent不仅可用于应用程序之间的交互#xff0c;也可用于应用程序内部的Activity/Service之间的交互。 Intent负责对应用中一次操作进行描述#xff0c;描述内容包括动作以及动作所涉及的数据#xff0c;Android中的In…1.Intent的实现过程 在Android中Intent不仅可用于应用程序之间的交互也可用于应用程序内部的Activity/Service之间的交互。 Intent负责对应用中一次操作进行描述描述内容包括动作以及动作所涉及的数据Android中的Intent机制则根据此描述找到对应的组件将Intent传递给该被调用组件完成对组件的一次调用。 这便是Intent的实现过程可见在Intent中提供了组件互相调用的相关信息实现了调用者与被调用者之间的解耦。 2.Intent的应用场合 归纳起来Intent的应用场合主要有以下三种 2.1启动一个Activity 1Activity.startActivity(Intent intent); //启动一个Activity 2Activity.startActivityForResult(Intent intent, int requestCode); //启动一个带请求码的Activity当该Activity结束时将回调原Activity的onActivityResult()方法并返回一个结果码。 2.2启动一个Service 1Context.startService(Intent service); 2Context.bindService(Intent service, ServiceConnection conn, int flags); 2.3启动一个Broadcast 1sendBroadcast(Intent intent); sendBroadcastAsUser(Intent intent, UserHandle user); 2sendStickyBroadcast(Intent intent); sendStickyBroadcastAsUser(Intent intent, UserHandle user); 3sendOrderedBroadcast(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可以调用并启动别的应用程序比如调用拨打电话的程序便可以使用如下的方法来完成 /* * Function : 调用拨打电话的程序 * Author : 博客园-依旧淡然 */ public void intentDemo_Call() { Intent intent_call new Intent(); //创建一个意图 intent_call.setAction(Intent.ACTION_CALL); //设置意图为打电话 intent_call.setData(Uri.parse(tel:110)); //设置电话号码 startActivity(intent_call); //启动意图 } 复制代码当然了因为这里使用到了打电话的功能我们还需要在AndroidManifest.xml文件中添加申请打电话的资源权限具体实现方法如下!-- 打电话的权限 -- 2 uses-permission android:nameandroid.permission.CALL_PHONE / 复制代码有关Android中的权限请求可以参阅《
Android数据手册02android.permission权限请求汇总
》。 5.2跳转到另一个Activity 通过使用Intent不仅可以调用别的应用程序还可以实现应用程序内部之间Activity的跳转。比如如下的代码便实现了从MainActivity跳转到SecondaryActivity并向SecondaryActivity中传递了两个数据name和age。 /* * Function : 跳转到SecondaryActivity * Author : 博客园-依旧淡然 */ public void intentDemo_GoToSecondaryActivity() { Intent intent_toSecondary new Intent(); //创建一个意图 intent_toSecondary.setClass(this, SecondaryActivity.class); //指定跳转到SecondaryActivity intent_toSecondary.putExtra(name, jack); //设置传递内容name intent_toSecondary.putExtra(age, 23); //设置传递内容age startActivity(intent_toSecondary); //启动意图 } 复制代码那么如何在SecondaryActivity中接收从MainActivity中传过来的内容name、age呢下面的代码给出了一种实现方案。 /* * Function : 接收mainActivity中的intent_toSecondary * Author : 博客园-依旧淡然 */ public void acceptIntent() { Intent intent_accept getIntent(); //创建一个接收意图 Bundle bundle intent_accept.getExtras(); //创建Bundle对象用于接收Intent数据 String name bundle.getString(name); //获取Intent的内容name int age bundle.getInt(age); //获取Intent的内容age } 复制代码5.3发送一个带回调方法的意图 有时我们可能需要通过定义在MainActivity中的某一控件来启动SecondaryActivity并且当SecondaryActivity结束时返给MainActivity一个执行结果。 要实现上述的功能只需要完成以下三步骤即可。 1在MainActivity中实现向SecondaryActivity发送带请求码的意图具体实现方法如下 /* * Function : 向SecondaryActivity发送带请求码的意图 * Author : 博客园-依旧淡然 */ public void intentDemo_request() { Intent intent_request new Intent(); //创建一个意图 intent_request.setClass(this, SecondaryActivity.class); //指定跳转到SecondaryActivity startActivityForResult(intent_request, REQUEST_CODE); //启动带请求码意图 } 复制代码2在SecondaryActivity中接收intent_request并向意图中填充要返给MainActivity的内容最后还需要设置一个返回码。具体的实现方法如下 /* * Function : 接收mainActivity中的intent_request并返回一个结果码 * Author : 博客园-依旧淡然 */ public void acceptIntentAndReturn() { Intent intent getIntent(); //创建一个接收意图 intent.putExtra(back, data of SecondaryActivity); //设置意图的内容 setResult(RESULT_CODE, intent); //设置结果码 finish(); //结束SecondaryActivity并返回MainActivity } 复制代码3当结束SecondaryActivity时程序将返回到MainActivity界面。此时MainActivity中的onActivityResult()方法将被回调而我们要做的就是实现该方法。在本示例中该方法的具体实现方法如下/* * Function : onActivityResult回调方法 * Author : 博客园-依旧淡然 */ protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode REQUEST_CODE resultCode SecondaryActivity.RESULT_CODE) { Bundle bundle data.getExtras(); String str bundle.getString(back); Toast.makeText(this, 从SecondaryActivity的返回值为 str, Toast.LENGTH_LONG).show(); } } 复制代码以上的代码我们通过判断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