博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android菜鸟的成长笔记(8)——Intent与Intent Filter(上)
阅读量:7103 次
发布时间:2019-06-28

本文共 5623 字,大约阅读时间需要 18 分钟。

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文件中配置

一个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文件中配置

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

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

  •               应用程序入口
  •               显示指定数据
  •        指定某块数据将被附加到其他地方
  •               编辑指定数据
  •               从列表中选择某项,并返回所选数据
  •            显示一个Activity选择器
  •        让用户选择数据,并返回所选数据
  •               显示拨号面板
  •               直接向指定用户打电话
  •               向其他人发送数据
  •             向其他人发送消息
  •             应答电话
  •             插入数据
  •             删除数据
  •                运行数据
  •               执行数据同步
  •      用于选择Activity
  •             执行搜索
  •         执行web搜索
  •       工厂测试的入口点

这里仅列出部分更多关于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;		}	}}

转载于:https://www.cnblogs.com/lanzhi/p/6469215.html

你可能感兴趣的文章
树莓派新系统用户配置
查看>>
格式化创建文件系统、内核支持的文件系统、指定卷标、查看超级块信息、文件系统修复...
查看>>
Coding Standard
查看>>
基于Dva.js的Blog SPA实践
查看>>
es6学习笔记-变量析构_v1.0_byKL
查看>>
2017新兴技术企业大会:第二日回顾
查看>>
Coinbase是如何在其加密货币交易平台上应对扩展性挑战的
查看>>
JVM笔记 | Java垃圾回收(GC)
查看>>
(译)一个完整的Django入门指南---第7部分
查看>>
树莓派入门到放弃
查看>>
区块链技术公司 聊区块链与AI结合
查看>>
微服务场景下性能问题排查神器之xrebel
查看>>
微信小程序input组件type属性3个值的作用
查看>>
QQ 机器人平台 Newbe.Mahua 2.1 支持 Websocket
查看>>
【监控文件夹并将增加和删除的文件列表发送邮件完美脚本】-未来星开发开发团队...
查看>>
AndroidStudio无法输出日志的Bug
查看>>
TypeScript基础入门 - 接口 - 函数类型
查看>>
lombok_学习_00_资源帖
查看>>
搜集用 LLVM 创造动态语言的例子
查看>>
第159天:前端知识体系框架
查看>>