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

简介: 原文: [置顶] Android菜鸟的成长笔记(8)——Intent与Intent Filter(上) Intent代表了Android应用的启动“意图”,Android应用将会根据Intent来启动指定组件,至于到底启动哪个组件,取决于Intent的各个属性。

原文: [置顶] 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;
		}
	}
}


目录
相关文章
|
21天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
4月前
|
Android开发 开发者
Android基础知识:什么是Intent?有哪些类型的Intent?
Android基础知识:什么是Intent?有哪些类型的Intent?
71 0
|
22天前
|
Unix Linux Shell
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
在Linux环境下交叉编译Android所需的FFmpeg so库,首先下载`android-ndk-r21e`,然后解压。接着,上传FFmpeg及相关库(如x264、freetype、lame)源码,修改相关sh文件,将`SYSTEM=windows-x86_64`改为`SYSTEM=linux-x86_64`并删除回车符。对x264的configure文件进行修改,然后编译x264。同样编译其他第三方库。设置环境变量`PKG_CONFIG_PATH`,最后在FFmpeg源码目录执行配置、编译和安装命令,生成的so文件复制到App工程指定目录。
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
|
7月前
|
存储 SQL 人工智能
Android Activity启动流程一:从Intent到Activity创建
Android Activity启动流程一:从Intent到Activity创建
|
2天前
|
定位技术 Android开发
Intent在Android中的几种用法
Intent在Android中的几种用法
|
3天前
|
Java Android开发
Android桌面快捷方式图标生成与删除 使用Intent与launcher交互
Android桌面快捷方式图标生成与删除 使用Intent与launcher交互
|
7天前
|
安全 Linux Android开发
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
该文介绍了如何在Linux服务器上交叉编译Android的FFmpeg库以支持HTTPS视频播放。首先,从GitHub下载openssl源码,解压后通过编译脚本`build_openssl.sh`生成64位静态库。接着,更新环境变量加载openssl,并编辑FFmpeg配置脚本`config_ffmpeg_openssl.sh`启用openssl支持。然后,编译安装FFmpeg。最后,将编译好的库文件导入App工程的相应目录,修改视频链接为HTTPS,App即可播放HTTPS在线视频。
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
|
19天前
|
存储 Java API
Android系统 文件访问权限笔记
Android系统 文件访问权限笔记
55 1
|
10月前
|
Android开发
关于Android中intent传值问题
关于Android中intent传值问题
63 0
|
5月前
|
Android开发
Android Studio App开发入门之在活动之间传递消息(附源码 超详细必看)(包括显示和隐式Intent,向上一个和下一个Activity发送数据)
Android Studio App开发入门之在活动之间传递消息(附源码 超详细必看)(包括显示和隐式Intent,向上一个和下一个Activity发送数据)
54 0