程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Android之旅-Intent與Intent Filter[上]

Android之旅-Intent與Intent Filter[上]

編輯:C#入門知識

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_MAIN              應用程序入口
  • ACTION_VIEW              顯示指定數據
  • ACTION_ATTACH_DATA       指定某塊數據將被附加到其他地方
  • ACTION_EDIT              編輯指定數據
  • ACTION_PICK              從列表中選擇某項,並返回所選數據
  • ACTION_CHOOSER           顯示一個Activity選擇器
  • ACTION_GET_CONTENT       讓用戶選擇數據,並返回所選數據
  • ACTION_DIAL              顯示撥號面板
  • ACTION_CALL              直接向指定用戶打電話
  • ACTION_SEND              向其他人發送數據
  • ACTION_SENDTO            向其他人發送消息
  • ACTION_ANSWER            應答電話
  • ACTION_INSERT            插入數據
  • ACTION_DELETE            刪除數據
  • ACTION_RUN               運行數據
  • ACTION_SYNC              執行數據同步
  • ACTION_PICK_ACTIVITY     用於選擇Activity
  • ACTION_SEARCH            執行搜索
  • ACTION_WEB_SEARCH        執行web搜索
  • ACTION_FACTORY_TEST      工廠測試的入口點

這裡僅列出部分更多關於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, null, null, null, null);    
  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, null, null);    
  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. }    

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved