Intent、IntentFilter

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

一、显式的Intent

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

例如:

  1. package com.example.testintent;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.ComponentName;  
  5. import android.content.Intent;  
  6. import android.os.Bundle;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10.   
  11. public class MainActivity extends Activity {  
  12.     Button button;  
  13.     @Override  
  14.     protected void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.activity_main);  
  17.         button = (Button)findViewById(R.id.button1);  
  18.         button.setOnClickListener(new OnClickListener() {  
  19.               
  20.             @Override  
  21.             public void onClick(View arg0) {  
  22.                 ComponentName comp = new ComponentName(MainActivity.this, SecondActivity.class);  
  23.                 Intent intent = new Intent();  
  24.                 intent.setComponent(comp);  
  25.                 startActivity(intent);  
  26.             }  
  27.         });  
  28.     }  
  29. }  
注意在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 )

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

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

二、隐式的Intent

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

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

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

例如:

  1. package com.example.testintent;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.ComponentName;  
  5. import android.content.Intent;  
  6. import android.os.Bundle;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10.   
  11. public class MainActivity extends Activity {  
  12.     Button button;  
  13.     @Override  
  14.     protected void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.activity_main);  
  17.         button = (Button)findViewById(R.id.button1);  
  18.         button.setOnClickListener(new OnClickListener() {  
  19.               
  20.             @Override  
  21.             public void onClick(View arg0) {  
  22.                 Intent intent = new Intent();  
  23.                 intent.setAction("com.example.intent.action.TEST_ACTION");  
  24.                 startActivity(intent);  
  25.             }  
  26.         });  
  27.     }  
  28. }  
manifest文件中配置
  1. <activity   
  2.     android:name=".SecondActivity">  
  3.     <intent-filter >  
  4.         <action android:name="com.example.intent.action.TEST_ACTION"/>  
  5.         <category android:name="android.intent.category.DEFAULT"/>  
  6.     </intent-filter>  
  7. </activity>  

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

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

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

manifest文件中配置

  1. <activity   
  2.     android:name=".SecondActivity">  
  3.     <intent-filter >  
  4.         <action android:name="com.example.intent.action.TEST_ACTION"/>  
  5.         <category android:name="android.intent.category.DEFAULT"/>  
  6.         <category android:name="android.intent.category.TEST_CATEGERY"/>  
  7.     </intent-filter>  
  8. </activity>  
可以看出其实是根据Action和Category两个属性共同决定启动哪个Activity的,Category可以有多个,只要满足其中的一个即可。

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

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

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

  1. package com.example.testintent;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.database.Cursor;  
  6. import android.net.Uri;  
  7. import android.os.Bundle;  
  8. import android.provider.ContactsContract;  
  9. import android.provider.ContactsContract.Contacts;  
  10. import android.support.v4.content.CursorLoader;  
  11. import android.util.Log;  
  12. import android.view.View;  
  13. import android.view.View.OnClickListener;  
  14. import android.widget.Button;  
  15.   
  16. public class MainActivity extends Activity {  
  17.     private static final String TAG = "MainActivity";  
  18.     Button button;  
  19.     final int PICK_CONTACT = 0;  
  20.     @Override  
  21.     protected void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.         setContentView(R.layout.activity_main);  
  24.         button = (Button)findViewById(R.id.button1);  
  25.         button.setOnClickListener(new OnClickListener() {  
  26.               
  27.             @Override  
  28.             public void onClick(View arg0) {  
  29.                 Intent intent = new Intent();  
  30.                 intent.setAction(Intent.ACTION_GET_CONTENT);  
  31.                 intent.setType("vnd.android.cursor.item/phone");  
  32.                 startActivityForResult(intent, PICK_CONTACT);  
  33.             }  
  34.         });  
  35.     }  
  36.       
  37.     @Override  
  38.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  39.         super.onActivityResult(requestCode, resultCode, data);  
  40.         switch (requestCode) {  
  41.             case PICK_CONTACT:  
  42.                 if(resultCode == Activity.RESULT_OK){  
  43.                     //获取返回数据  
  44.                     Uri contactData = data.getData();  
  45.                     CursorLoader cursorLoader = new CursorLoader(this, contactData, nullnullnullnull);  
  46.                     Cursor cursor = cursorLoader.loadInBackground();  
  47.                     if(cursor.moveToFirst()){  
  48.                         String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));  
  49.                         String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));  
  50.                         Log.i(TAG, "姓名:" + name);  
  51.                         //根据联系人查看详细信息  
  52.                         Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,   
  53.                                     ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, nullnull);  
  54.                         if(phones.moveToFirst()){   
  55.                             System.out.println("进来了");  
  56.                             String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));  
  57.                             Log.i(TAG, "电话:" + phoneNumber);  
  58.                         }  
  59.                         //关闭游标  
  60.                         phones.close();  
  61.                     }  
  62.                     //关闭游标  
  63.                     cursor.close();  
  64.                 }  
  65.                 break;  
  66.   
  67.         default:  
  68.             break;  
  69.         }  
  70.     }  
  71. }  

一、Data属性与Type属性

Data属性通常用于向Action属性 提供操作的数据,Data属性接受一个Uri对象

格式:scheme://host:port/path

例如:

content://com.android.contacts/contacts/1

tel:123

其中prot部分被省略了,contacts/1是path部分。

Type属性用于指定该Data所指定Uri所对应的MIME类型,这种MIME类型可以是自定义的,但是要符合abc/xyz格式。

二、Data属性与Type属性之间的关系

Type属性和Data同时出现会出现覆盖现象,如果要同时设置要使用setDataAndType()方法,举例如下:

  1. //Type属性被Data覆盖  
  2. public void overrideType(View source){  
  3.     Intent intent = new Intent();  
  4.     intent.setType("abc/xyz");  
  5.     intent.setData(Uri.parse("lee://www.baidu.com:80/test"));  
  6. }  
  7. //Data属性被Type覆盖  
  8. public void overrideData(View source){  
  9.     Intent intent = new Intent();  
  10.     intent.setData(Uri.parse("lee://www.baidu.com:80/test"));  
  11.     intent.setType("abc/xyz");  
  12. }  
  13. //同时设置Data和Type  
  14. public void dataAndType(View source){  
  15.     Intent intent = new Intent();  
  16.     intent.setDataAndType(  
  17.             Uri.parse("lee://www.baidu.com:80/test"), "abc/xyz");  
  18. }     
在manifest配置文件中配置Activity的方法如下
  1. <intent-filter>  
  2.     <action android:name="android.intent.action.MAIN" />  
  3.   
  4.     <category android:name="android.intent.category.LAUNCHER" />  
  5.     <data   
  6.         android:mimeType=""  <!-- Type属性 -->  
  7.         android:scheme=""   <!-- scheme部分 -->  
  8.         android:host=""     <!-- host部分 -->  
  9.         android:port=""     <!-- port部分 -->  
  10.         android:path=""     <!-- path部分 -->  
  11.         android:pathPrefix=""   <!-- path前缀 -->  
  12.         android:pathPattern=""/>    <!-- path模版 -->  
  13. </intent-filter>  
三、Data属性与Type属性的匹配方式

Type属性也是用户指定组件匹配的组件,Type是需要严格匹配的。

Data属性则不需要严格匹配,过程如下:

如果指定了android:scheme属性,那么只要Intent的Data属性的scheme部分与android:scheme属性相同就可以启动该组件。

如果制定了android:scheme属性和android:host需要两个属性与Intent的Data部分的该部分相同则启动该组件。

如果定制了android:scheme、android:host、android:port属性则需要与该部分相同才能启动该组件。

...................

四、小练习

  1. Intent intent = new Intent();  
  2. String data = "http://blog.csdn.net/dawanganban";  
  3. Uri uri = Uri.parse(data);  
  4. intent.setAction(Intent.ACTION_VIEW);  
  5. intent.setData(uri);  
  6. startActivity(intent);  
  1. Intent intent = new Intent();  
  2. String data = "content://com.android.contacts/contacts/1";  
  3. Uri uri = Uri.parse(data);  
  4. intent.setData(uri);  
  5. startActivity(intent);  
  1. Intent intent = new Intent();  
  2. String data = "tel:10000";  
  3. Uri uri = Uri.parse(data);  
  4. intent.setData(uri);  
  5. startActivity(intent);  

五、Intent的其他属性

Extra属性:用于在多个Activity之间传递数据,该属性其实是一个Bundle对象,后面在Activity间传值的文章中将会介绍。

Flag属性:一些额外的控制旗标,在后面将会详细介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值