zoukankan      html  css  js  c++  java
  • Android之旅-Intent与Intent Filter[上]

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

    一、显式的Intent

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

    例如:

    Java代码  
    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路径的类,有如下几个构造

    Java代码  收藏代码
    1. componentName(String pkg, String cls)  
    2.   
    3. componentName(Context pkg, String cls)  
    4.   
    5. componentName(Context pkg, Class<?> cls)  

    componentName(Parcel in)

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

    Java代码  
    1. setClass(Context packageContext, Class<?> cls )  
    2.   
    3. setClassName(Context packageContext, String className)  
    4.   
    5. setClassName(String packageName, String className )  

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

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

     

    二、隐式的Intent

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

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

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

    例如:

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

    Java代码  
    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属性的用法

    Java代码  收藏代码
    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文件中配置

    Java代码  收藏代码
    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

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

    Java代码  收藏代码
    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. }    

     

  • 相关阅读:
    第二章 搭建Android开发环境
    彻底修改 Windows 系统用户名
    第一章 Android系统移植与驱动开发概述
    返回一个整数数组中最大子数组的和。
    返回一个二维整数数组中最大子数组的和。
    返回一个整数数组中最大的子数组的和。
    四则运算
    关于南方Cass的使用感受
    数据结构-王道2017-第3章 栈和队列-栈和队列的应用
    数据结构-王道2017-第3章 栈和队列-队列
  • 原文地址:https://www.cnblogs.com/android100/p/android-intent.html
Copyright © 2011-2022 走看看