Android菜鸟的成长笔记(8)——Intent与Intent Filter(上)

原文:[置顶] Android菜鸟的成长笔记(8)——Intent与Intent Filter(上)

Intent代表了Android应用的启动“意图”,Android应用将会根据Intent来启动指定组件,至于到底启动哪个组件,取决于Intent的各个属性。

一、显式的Intent

明确指定了要启动的组件的Intent我们称为显式的Intent

例如:

package com.example.testintent;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
	Button button;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		button = (Button)findViewById(R.id.button1);
		button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				ComponentName comp = new ComponentName(MainActivity.this, SecondActivity.class);
				Intent intent = new Intent();
				intent.setComponent(comp);
				startActivity(intent);
			}
		});
	}
}

注意在manifest文件里注册SecondActivity

Intent的Componet属性需要接收一个ComponentName对象,ComponetName对象其实是一个指定包和要启动的Activity路径的类,有如下几个构造

componentName(String pkg, String cls)

componentName(Context pkg, String cls)

componentName(Context pkg, Class<?> cls)

componentName(Parcel in)

除了这个属性之外Intent还包含了如下三个方法:

setClass(Context packageContext, Class<?> cls )

setClassName(Context packageContext, String className)

setClassName(String packageName, String className )

上面的代码可以简化为如下代码:

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

二、隐式的Intent

没有明确指定要启动的组件的Intent我们称为隐式的Intent

Intent除了上面的Componet属性外还有Action、Category属性

Action代表Intent所要完成的一个抽象动作,而Category则是动作附加的类别信息。

例如:

package com.example.testintent;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
	Button button;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		button = (Button)findViewById(R.id.button1);
		button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				Intent intent = new Intent();
				intent.setAction("com.example.intent.action.TEST_ACTION");
				startActivity(intent);
			}
		});
	}
}

manifest文件中配置

        <activity
            android:name=".SecondActivity">
            <intent-filter >
                <action android:name="com.example.intent.action.TEST_ACTION"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

一个Intent只能指定一个Action属性,可以包含多个Category属性,当程序创建时,默认启动category为DEFAULT的组件。

接下来我们来看看Category属性的用法

public void onClick(View arg0) {
	Intent intent = new Intent();
	intent.setAction("com.example.intent.action.TEST_ACTION");
	intent.addCategory("android.intent.category.TEST_CATEGERY");
	startActivity(intent);
}

manifest文件中配置

        <activity
            android:name=".SecondActivity">
            <intent-filter >
                <action android:name="com.example.intent.action.TEST_ACTION"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.TEST_CATEGERY"/>
            </intent-filter>
        </activity>

可以看出其实是根据Action和Category两个属性共同决定启动哪个Activity的,Category可以有多个,只要满足其中的一个即可。

实际上Intent不仅可以启动我们定义的Activity,也可以启动系统和其他应用的Activity

这里仅列出部分更多关于Action和Category属性请参阅:http://developer.android.com/reference/android/content/Intent.html

三、一个获取通讯录的实例:

package com.example.testintent;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;
import android.support.v4.content.CursorLoader;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
	private static final String TAG = "MainActivity";
	Button button;
	final int PICK_CONTACT = 0;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		button = (Button)findViewById(R.id.button1);
		button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				Intent intent = new Intent();
				intent.setAction(Intent.ACTION_GET_CONTENT);
				intent.setType("vnd.android.cursor.item/phone");
				startActivityForResult(intent, PICK_CONTACT);
			}
		});
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		switch (requestCode) {
			case PICK_CONTACT:
				if(resultCode == Activity.RESULT_OK){
					//获取返回数据
					Uri contactData = data.getData();
					CursorLoader cursorLoader = new CursorLoader(this, contactData, null, null, null, null);
					Cursor cursor = cursorLoader.loadInBackground();
					if(cursor.moveToFirst()){
						String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
						String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
						Log.i(TAG, "姓名:" + name);
						//根据联系人查看详细信息
						Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
									ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
						if(phones.moveToFirst()){
							System.out.println("进来了");
							String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
							Log.i(TAG, "电话:" + phoneNumber);
						}
						//关闭游标
						phones.close();
					}
					//关闭游标
					cursor.close();
				}
				break;

		default:
			break;
		}
	}
}

时间: 2024-09-22 19:45:03

Android菜鸟的成长笔记(8)——Intent与Intent Filter(上)的相关文章

Android菜鸟的成长笔记(9)——Intent与Intent Filter(下)

原文:[置顶] Android菜鸟的成长笔记(9)--Intent与Intent Filter(下) 接着上一篇的内容,下面我们再来看看Intent的Data与Type属性. 一.Data属性与Type属性 Data属性通常用于向Action属性提供操作的数据,Data属性接受一个Uri对象 格式:scheme://host:port/path 例如: content://com.android.contacts/contacts/1 tel:123 其中prot部分被省略了,contacts/

Android菜鸟的成长笔记(6)——剖析源码学自定义主题Theme

原文:Android菜鸟的成长笔记(6)--剖析源码学自定义主题Theme 还记得在Android菜鸟的成长笔记(3)中我们曾经遇到了一个问题吗?"这个界面和真真的QQ界面还有点不同的就是上面的标题myFirstApp,怎么去掉这个标题呢?",当时我直接在AndroidMainfest.xml中添加了一个属性: android:theme="@android:style/Theme.NoTitleBar" 可能有的朋友就会迷惑了,为什么添加了这个属性就可以了.这一篇

Android菜鸟的成长笔记(7)——什么是Activity

原文:[置顶] Android菜鸟的成长笔记(7)--什么是Activity 前面我们做了一个小例子,在分析代码的时候我们提到了Activity,那么什么是Activity呢? Activity是Android应用程序提供交互界面的一个重要组件,也是Android重要组件之一(另外3个是Service.BroadcastReceiver和ContentProvider). 与开发Web应用时建立Servlet类相似,建立自己的Activity也需要继承Activity基类,当然,在不同应用场景下

Android菜鸟的成长笔记(17)—— 再看Android中的Unbounded Service

原文:Android菜鸟的成长笔记(17)-- 再看Android中的Unbounded Service 前面已经写过关于startService(Unbounded Service)的一篇文章:<Android菜鸟的成长笔记(16)--Service简介>本篇将在这一篇的基础上再来看一下startService的用法.先看一段代码: TestService.java package com.example.myfirstapp; import android.app.Service; imp

Android菜鸟的成长笔记(10)——使用Bundle在Activity之间传值

原文:[置顶] Android菜鸟的成长笔记(10)--使用Bundle在Activity之间传值 前面我们了解了如何启动一个Activity,一个Activity在启动另外一个Activity的时候可能会遇到需要传值的需要.Activity之间传值是通过Bundle来实现的. 一.通过Bundle传值介绍 Intent提供了多个重载方法来携带数据 putExtras(Bundle data):向Intent中放入需要的数据包 Bundle getExtras():取出Intent所携带的数据

Android菜鸟的成长笔记(5)——Android系统源代码你下载了吗?

原文:Android菜鸟的成长笔记(5)--Android系统源代码你下载了吗? 在上一篇中我们用Android系统源代码分析了我们前面写的代码,有的朋友可能就会问怎么才能下载到Google官方的源代码呢?下面我们通过Git管理工具来对Android系统源代码进行下载.另外为了方便有的朋友下载,我将下载好的各个版本的源码存放到360云盘,云盘下载链接如下: http://yunpan.cn/QDEkq3uFrbvrI (访问密码:968e) 首先下载Git版本管理工具:下载地址:http://c

Android菜鸟的成长笔记(1)——Android开发环境搭建从入门到精通

原文:Android菜鸟的成长笔记(1)--Android开发环境搭建从入门到精通 今天在博客中看到好多Android的初学者对Android的开发环境的搭建不熟悉而导致不能进行学习,所以我决定自己写一个搭建过程的文章. 一.JDK安装 http://www.oracle.com/index.html  下载地址 选择JavaSE JDK进行下载 下载下来后进行安装(默认步骤安装) 设置环境变量步骤如下: 我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量:    

Android菜鸟的成长笔记(4)——你真的理解了吗?

原文:Android菜鸟的成长笔记(4)--你真的理解了吗? 在上一篇中我们查看了QQ的apk源文件中的布局结构,并仿照QQ完成了我们第一个应用的界面,详细请看<Android菜鸟的成长笔记>专栏.这一篇中我们来具体看看这个界面到底是怎么呈现出来的,具体的原理是什么等问题,下面我们将一步一步的解开留在我们心中的谜团. 有的朋友可能会产生这样的疑问为什么几句代码就能显示这样好看的界面? 其实能让这个界面显示的如此丰富多彩,一半功劳在我们编写的那几句代码,还有一半功劳在我们尊敬的google工程师

Android菜鸟的成长笔记(3)——给QQ登录界面说So Easy

原文:Android菜鸟的成长笔记(3)--给QQ登录界面说So Easy 上一篇:Android菜鸟的成长笔记(2)--第一个Android应用 我们前面已经做了第一个Android应用程序,虽然有点像QQ的登录界面,但是很多地方还是很难看,这一篇咱们来将这个界面做成一个标准的商业界面,并一起来了解Android中的代码运行的原理. 好吧,咱们开始吧,首先启动模拟器,为了让咱们的界面和QQ的登录界面一样我下载了一个QQ的apk文件,下面咱们将这个apk安装到我们的模拟器上,看看效果. 怎么将a