您的位置:首页 > 移动开发 > Android开发

使用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对象的构造函数来调用另一个活动:

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的流程的理解,如有不妥之处,还请大家多多指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android Intent Activity
相关文章推荐