使用Intent调用其他活动的方法以及运作流程
2014-08-18 14:28
585 查看
首先做个说明,本文的写作背景是在sdk 4.4的时代下,而我还在猥琐地使用4.0的教材学习Android开发,自然会有很多看起来比较古怪的东西,例如main.xml这种东西,现在已经一分为二,变为activity_main.xml和fragment_main.xml了,为了充分利用好我的过期教材,我在网上找了很多大牛的方法,并最终成功地将4.4改造为4.0,真诚感谢这些大牛们的智慧和分享精神。改造方法我会转在自己的博客上,防止自己失忆了以后也会觉得自己写的内容很奇怪。背景介绍完毕,下面入正题:
Android通过Intent(意图)实现对活动的调用,有如下几种调用方法:
(1)传递一个动作给Intent对象的构造函数来调用另一个活动:
动作"xxx.xxx.OneActivity"也称为组件名称,用来标识所要调用的目标活动/应用程序。这个动作要与androidManifest.xml中对应activity的action一致,也就是说,只有Intent中为"xxx.xxx.OneActivity",而androidManifest.xml中的action也为"xxx.xxx.OneActivity"的时候,才可以匹配上动作名,进而调用相关活动。"xxx.xxx.OneActivity"只是一个动作的名称,实际上,我们把动作名改为类似"something"这种样子也是可以实现调用,只要Intent中的动作与action中的动作可以匹配。习惯上,我们使用包名,这样有助于清晰的表述。
我们还可以通过传入一个动作常量和数据来创建一个Intent对象,如:
(2)通过指定活动的类名修改组件的名称(当要显示的活动与当前活动在同一个项目中时,这种方法才适用),如:
Intent分为implicit(隐藏) Intent和explicit(明确)
Intent两种,上面第一种方法我们可以认为是implicit Intent的调用,第二种方法为explicit Intent的调用。因为第一种方法传入的是动作,而第二种方法则直接传递活动的类。由于第一种方法没有显示地指定要启动哪个Activity(只是指定了一个动作),因此需要在androidManifest.xml中的intent-filter去筛选合适的Activity来调用。对于implicit Intent的使用,在intent-filter中需要有一个android.intent.category.DEFAULT类别,如果没有的话,活动将不能被调用。
我们假设开发这样一个程序:在主界面上有一个按钮,点击按钮,在一个新的活动页面上显示百度首页。我们只给出与本文有关的代码:
androidManifest.xml
<strong>标签中的内容为我们添加的代码,在<activity>中,我们指定新建活动的类为MyBrowserActivity,动作为"my.test.MyBrowser",活动期望的数据类型以及默认的类别。下面的代码是对活动上的按钮的响应函数:
在响应函数中,我们通过向Intent传递动作"my.test.MyBrowser"隐式地调用我们创建的活动,点击按钮后运行结果如下:
如果我们注释掉<category android:name="android.intent.category.DEFAULT" />,再次运行程序,调用浏览器活动时,程序会崩溃,因为程序无法找到要调用的活动。
上面的代码是采用Intent隐式调用的方法调用活动,下面我们对按钮的响应函数做一些修改:
因此,我对Intent调用activity的运作流程做出了如下总结:
上图是我对Intent调用Activity的流程的理解,如有不妥之处,还请大家多多指正。
Android通过Intent(意图)实现对活动的调用,有如下几种调用方法:
(1)传递一个动作给Intent对象的构造函数来调用另一个活动:
startActivity(new Intent("xxx.xxx.OneActivity"));
动作"xxx.xxx.OneActivity"也称为组件名称,用来标识所要调用的目标活动/应用程序。这个动作要与androidManifest.xml中对应activity的action一致,也就是说,只有Intent中为"xxx.xxx.OneActivity",而androidManifest.xml中的action也为"xxx.xxx.OneActivity"的时候,才可以匹配上动作名,进而调用相关活动。"xxx.xxx.OneActivity"只是一个动作的名称,实际上,我们把动作名改为类似"something"这种样子也是可以实现调用,只要Intent中的动作与action中的动作可以匹配。习惯上,我们使用包名,这样有助于清晰的表述。
我们还可以通过传入一个动作常量和数据来创建一个Intent对象,如:
Intent i = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com")); startActivity(i);
(2)通过指定活动的类名修改组件的名称(当要显示的活动与当前活动在同一个项目中时,这种方法才适用),如:
startActivity(new Intent(this, OneActivity.class));
Intent分为implicit(隐藏) Intent和explicit(明确)
Intent两种,上面第一种方法我们可以认为是implicit Intent的调用,第二种方法为explicit Intent的调用。因为第一种方法传入的是动作,而第二种方法则直接传递活动的类。由于第一种方法没有显示地指定要启动哪个Activity(只是指定了一个动作),因此需要在androidManifest.xml中的intent-filter去筛选合适的Activity来调用。对于implicit Intent的使用,在intent-filter中需要有一个android.intent.category.DEFAULT类别,如果没有的话,活动将不能被调用。
我们假设开发这样一个程序:在主界面上有一个按钮,点击按钮,在一个新的活动页面上显示百度首页。我们只给出与本文有关的代码:
androidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="my.test.intents" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" /> <strong> <uses-permission android:name="android.permission.INTERNET"/></strong> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="my.test.intents.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <strong> <activity android:name=".MyBrowserActivity" android:label="@string/app_name" > <intent-filter> <action android:name="my.test.MyBrowser"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="http"/> </intent-filter> </activity></strong> </application> </manifest>
<strong>标签中的内容为我们添加的代码,在<activity>中,我们指定新建活动的类为MyBrowserActivity,动作为"my.test.MyBrowser",活动期望的数据类型以及默认的类别。下面的代码是对活动上的按钮的响应函数:
<strong>public void onClickLaunchMyBrowser(View view){ Intent i = new Intent("my.test.MyBrowser"); i.setData(Uri.parse("http://www.baidu.com")); startActivity(i); }</strong>
在响应函数中,我们通过向Intent传递动作"my.test.MyBrowser"隐式地调用我们创建的活动,点击按钮后运行结果如下:
如果我们注释掉<category android:name="android.intent.category.DEFAULT" />,再次运行程序,调用浏览器活动时,程序会崩溃,因为程序无法找到要调用的活动。
上面的代码是采用Intent隐式调用的方法调用活动,下面我们对按钮的响应函数做一些修改:
public void onClickLaunchMyBrowser(View view){ Intent i = new Intent(this,MyBrowserActivity.class); i.setData(Uri.parse("http://www.baidu.com")); startActivity(i); }同时,仍然注释掉<category android:name="android.intent.category.DEFAULT" />,运行程序,我们发现,点击按钮后,程序可以正确调用我们的浏览器活动。事实上,在explicit intent情况下,我们删掉所有intent-filter元素,只保留如下代码:
... <strong> <activity android:name=".MyBrowserActivity" android:label="@string/app_name" > </activity></strong> ...仍然可以得到我们需要的结果。也就是说,对于explicit Intent情况,我们只需要列出类名,就可以调用我们需要的活动,因为在响应函数中构造Intent的时候,就已经指定了活动的类。
因此,我对Intent调用activity的运作流程做出了如下总结:
上图是我对Intent调用Activity的流程的理解,如有不妥之处,还请大家多多指正。
相关文章推荐
- scrapy一些非常实用资料整理,与其他mongdb、django、redis、solr、tor结合使用以及用Python脚本调用等等方法
- C# 使用 Environment.GetCommandLineArgs 方法 制作*.exe和参数 供其他程序调用
- 使用COM或者OLE的方法调用来控制Excel或者其他Office组件
- DEDE全站评论总数调用以及与使用方法
- 使用HttpClient进行http post/get方法的调用,以及使用dom4j解析xml
- 在C++创建DLL,以及使用C++或者C#分别调用DLL中的方法
- C# 使用 Environment.GetCommandLineArgs 方法 制作*.exe和参数 供其他程序调用
- android语音识别方法一:使用intent调用语音识别程序
- Android中通过Intent调用其他应用的方法
- Handler中post方法的调用流程和使用场景
- android开发(26) 和其他应用交换数据方式一,使用intent指定自定义action调用其他程序里的activity,并获得其返回的结果
- Intent传值问题(非Integer and String 数据类型)以及 intent使用方法
- 关于C#Winform线程调用窗体的使用方法以及窗体的单一显示
- android学习笔记---53_采用网页设计软件界面,以及使用android系统内置的浏览器,利用js调用java方法
- ASP.NET AJAX 以及AJAXPRO使用客户端调用服务器端的方法--初学者学习
- android语音识别方法一:使用intent调用语音识别程序
- csshover.htc 以及简单使用方法(解决IE6下 :hover 在其他标签下无效问题)
- Struts2为应用指定多个配置文件和动态方法调用以及通配符的使用方法
- Android中通过Intent调用其他应用的方法
- android学习笔记---53_采用网页设计软件界面,以及使用android系统内置的浏览器,利用js调用java方法