Android筆記六.深入理解Intent和IntentFilter(二)

深入理解Intent和IntentFiler(二) Jiangdg_VIP https://blog.csdn.net/u012637501 在上一篇文章中,我們比較詳細學習瞭Intent的相關知識,現在將學習如何設置Intent對象的這些屬性以及如何使用他們來啟動組件。Intent對象是一組信息,我們可以通過設置其Action、Data、Category屬性來指定啟動哪個組件並完成什麼樣的動作(包含動作所需的數據)。 意圖分為顯示intent和隱式intent。所謂顯示intent,指的是Intent已經明確瞭它將要啟動哪個組件-通過指定Intent對象的Component屬性實現;而隱式intent,指的是Intent不能確定它將要啟動哪個組件(沒有指定Component屬性)-通過AndroidManifest.xml文件中的Intent Filter來對組件進行篩選來確定啟動的組件。 一、顯式intent 顯式意圖,顧名思義,就是指Intent已經明確以我們可瞭它將要啟動哪個組件。由於一個組件類可以通過其所在的包名和類名唯一的確定,所以通過intent的Component屬性來實現。Intent的Component屬性需要接受一個ComponentName對象,其構造函數傳入瞭該組件的包名、類名。 1.顯式intent開發基本思路 (1)創建一個ComponentName對象,用於為意圖指定組件包名、類名

ComponentName comp=new ComponentName(ComponentAttr.this,SecondaryActivity.class);

(2)創建一個Intent對象,並為該對象設置Component屬性

Intent intent=new Intent();
intent.setComponent(comp);

註意:通過使用Intent不同的構造函數,(1)、(2)步驟可以合並為: Intent intent=new Intent(ComponentAttr.this,SecondaryActivity.class); (3)啟動一個類名為SecondaryActivity的Activity組件

startActivity(intent);
或者 startActivityForResult(intent,requestCode);    //關閉啟動的Activity會返回結果

(4)實現被啟動的組件SecondaryActivity類(繼承於Activity) (5)在AndroidManifest.xml添加一個元素,但是無需配置元素

  

            
        

博主筆記1:除瞭上述Intent的setComponent方法,我們還可以利用setClass來指定需要啟動的具體組件 Intent intent=new Intent(); intent.setClass(ComponentAttr.this,SecondaryActivity.class); startActivity(intent);


二、隱式intent 隱式intent,顧名思義,就是沒有指明intent到底要啟動哪個組件。顯式intent可以通過設置其Component屬性實現,而隱式intent就通過Intent Filter來實現。具體的說就是,我們事先設置好意圖啟動組件的相關信息(intent屬性),然後再在其他組件的AndroidManifest.xml文件設置好相應的intent屬性。當組件發出意圖時,Android系統通過查找工程文件AndroidManifest.xml(或者系統級組件)其他組件的相關信息來進行匹配,篩選得到滿足意圖條件的組件。 1.使用Action屬性開發基本思路 Intent是組件之間的通信的載體,組件的通信可以分為應用內部組件之間的通信和應用間的通信。Intent的Action、Category屬性都是一個普通的字符串,其中Action代表Intent索要完成的一個抽象動作,Category屬性用於為Action增加附加的類別信息。 (1)應用內部組件通信-自定義字符串 方式

public final String CUSTOME_ACTION=intent.action.CUSTOME_JIANG;//字符串可以任意
Intent intent=new Intent();        //創建一個Intent對象
intent.setAction(ActionAttr.CUSTOME_ACTION); //註意:ActionAttr為我們創建的類
startActivity(intent);    //啟動一個Activity

(2)與其他應用程序通信-使用系統預定action常量

Intent intent=new Intent();
intent.setAction(Intent.ACTION_CALL); //其中ACTION_CALL為Intent類的靜態成員變量,可以類直接調用
startActivity(intent);

2.使用Action、Category屬性開發基本思路 (1)應用內部組件通信-自定義字符串 方式

public final String CUSTOME_ACTION=intent.action.CUSTOME_JIANG;//字符串可以任意
public final String CUSTOME_CATEGORY=intent.action.CUSTOME_CATEGORY;//字符串可以任意
Intent intent=new Intent();        //創建一個Intent對象
intent.setAction(ActionAttr.CUSTOME_ACTION); //註意:ActionAttr為我們創建的類
intent.addCategory(ActionAttr.CUSTOME_CATEGORY); 
startActivity(intent);    //啟動一個Activity

(2)使用系統預定action、category常量-以下代碼實現當點擊某個按鈕時,通過Intent對象實現返回HOME桌面。

Intent intent=new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);//返回Home桌面 
startActivity(intent);    //啟動一個Activity
註意:這裡無需設置AndroidManifest.xml

如果是實現應用內部組件的通信,除瞭上述(1)(2)步驟,我們還需要完成步: (3)實現需要啟動的Activity,如SecondaryActivity.java,ThirdActivity.java,使其繼承於Activity; (4)在工程AndroidManifest.xml添加元素,並添加相關信息


 

博主筆記2:實際上,我們在開發包含意圖的應用程序中,Action屬性和Category屬性是配合使用的。因為,Android系統會給主動Activity在AndroidManifest.xml中默認一個Action屬性和Category屬性,即: //應用程序入口 另外,還需要註意幾點: 1.Action常量等屬性。如ACTION_CALL是在設置intent時使用,其對應的字符串android.intent.action.CALL在AndroidManifest.xml中使用; 2.當使用Action屬性等的系統預定義常量,與其他應用通信時,隻需要在本應用的AndroidManifest.xml添加相應的權限即可。 3.一個Activity中隻能且必須定義一個Action屬性和一個Category屬性,其中,Category屬性系統會分配其默認常量CATEGORY_DEFAULT


3.源代碼 該實例主要完成2個功能: (1)實現一個按鈕,使用Action屬性和Category屬性啟動一個Activity; (2)實現一個按鈕,用於返回HOME界面 (1).FirstActivity.java:主Activity

package com.example.android_intent_2;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class ActionCateAttr extends Activity {
 //自定義一個action常量org.crazyit.
 public final static String CRAZYIT_ACTION=intent.action.JIANG_ACTION;
 public final static String CRAZYIT_CATEGORY=intent.action.JIANG_CATEGORY;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.first);
  Button btn=(Button)findViewById(R.id.button);
  btn.setOnClickListener(new OnClickListener(){
   @Override
   public void onClick(View v) {
    //創建一個Intent對象
    Intent intent=new Intent();
    intent.setAction(ActionCateAttr.CRAZYIT_ACTION);                 //設置action屬性
    intent.addCategory(ActionCateAttr.CRAZYIT_CATEGORY);    //設置category屬性
    startActivity(intent);
   }});//為btn註冊一個事件監聽器對象

  /*返回桌面按鈕*/
  Button btn1=(Button)findViewById(R.id.home);
  btn1.setOnClickListener(new OnClickListener(){
   @Override
   public void onClick(View v) {
    //創建一個Intent對象
    Intent intent=new Intent();
    intent.setAction(Intent.ACTION_MAIN);	//設置action屬性
    intent.addCategory(Intent.CATEGORY_HOME);//設置category屬性
    startActivity(intent);
   }});//為btn註冊一個事件監聽器對象
 }
}

(2).AndroidManifest.xml



    
   
                
                
            
        
    

(3)在工程中,添加SecondaryActivity.java,ThirdActivity.java繼承於Activity.
(4)效果
3.使用Data、Type屬性開發基本思路 Action屬性為Intent對象描述瞭一個動作,那麼Data屬性就為Intent對象的Action屬性提供瞭操作的數據。Type屬性用於指定該Data所指定Uri對應的MIME類型,這種類型可以是任何自定義的MIME類型,隻要符合abc/xyz格式的字符串即可。這裡需要註意的是,Type屬性和Data屬性一般會出現相互覆蓋的情況,如果希望Intent既有Data屬性也有Type屬性,必須通過setDataAndType()方法來實現。這裡需要註意的是,Data屬性隻接受一個Uri對象,一個Uri對象通常通過如下形式的字符串來表示: Uri字符串格式:scheme://host:port/path 舉例: content://com.android.contacts/contacts/1或tel://18819463209 這裡有兩種情況,一是啟動系統級應用程序;二是,啟動應用內部組件。前者無需配置AndroidManifest.xml中的元素,隻需添加相應權限即可;後者,需要配置AndroidManifest.xml中的元素內容。其中,為組件聲明Data、Type屬性都通過元素,格式如下: //Data屬性的path字符串模板 情況一、啟動系統級應用組件 (1)實現一個Intent對象,並啟動組件

Intent intent=new Intent();                         //創建一個Intent對象
String data=content://com.android.contacts/contacts/1;
Uri uri=Uri.parse(data);                            //將字符串轉換為Uri
intent.setAction(Intent.ACTION_VIEW);  //設置Intent對象Action屬性
intent.setData(uri);                                   //設置Intent對象Data屬性
startActivity(intent); 
或者
Intent intent=new Intent();
intent.setAction(Intent.ACTION_VIEW); 
intent.setData(Uri.parse(content://com.android.contacts/contacts/1));
startActivity(intent); 

(2)在AndroidManifest.xml中添加相應的權限

在Android中讀取電話信息時,要註意加入

在android中使用BroadcastReceiver時

在android中使用有關的文件下載功能時,要使用到的

  

(3)源代碼 該應用程序實現三個按鈕實現三個功能:打開網頁、編輯聯系人、撥打電話 firstActivity.java

package com.android.android_intent_4; 
import android.support.v7.app.ActionBarActivity; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
public class MainActivity extends ActionBarActivity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
/*第一個按鍵功能:打開網頁*/ 
Button btn1=(Button)findViewById(R.id.button1);	
btn1.setOnClickListener(new OnClickListener(){	//為按鈕1註冊一個事件監聽器對象 

@Override 
public void onClick(View v) { 
//1.創建Intent 
Intent intent=new Intent(); 
//2.設置action、data屬性 
String data=https://www.baidu.com; 
Uri uri=Uri.parse(data);	 //將字符串轉化為Uri-通用資源標識 
intent.setAction(Intent.ACTION_VIEW);	//設置intent屬性為系統預定義的Intent.ACTION_VIEW 
intent.setData(uri);	 //為intent設置數據屬性,用於傳遞數據 
//3.啟動Activity 
startActivity(intent); 
}}); 

/*第二個按鍵功能:編輯標識為1的聯系人*/ 
Button btn2=(Button)findViewById(R.id.button2);	
btn2.setOnClickListener(new OnClickListener(){	//為按鈕1註冊一個事件監聽器對象 

@Override 
public void onClick(View v) { 
//1.創建Intent 
Intent intent=new Intent(); 
//2.設置action、data屬性 
intent.setAction(Intent.ACTION_EDIT);	 //設置intent屬性為系統預定義的Intent.ACTION_VIEW 
intent.setData(Uri.parse(content://com.android.contacts/contacts/1));	//為intent設置數據屬性,根據指定的字符解析出Uri對象 
//3.啟動Activity 
startActivity(intent); 
}}); 

/*第三個按鍵功能:撥打電話18819465188*/ 
Button btn3=(Button)findViewById(R.id.button3);	
btn3.setOnClickListener(new OnClickListener(){	//為按鈕1註冊一個事件監聽器對象 
@Override 
public void onClick(View v) { 
//1.創建Intent 
Intent intent=new Intent(); 
//2.設置action、data屬性 
intent.setAction(Intent.ACTION_DIAL);	 //設置intent屬性為系統預定義的Intent.ACTION_VIEW 
intent.setData(Uri.parse(tel:18819465188));	//根據指定的字符解析出Uri對象 
//3.啟動Activity 
startActivity(intent); 
}}); 
} 

} 

效果如下圖:
情況二、啟動應用內部組件 (1)實現一個Intent對象,並啟動組件

Intent intent=new Intent();                         //創建一個Intent對象
String data=lee://www.fkjava.org:8888/mypath;
Uri uri=Uri.parse(data);                            //將字符串轉換為Uri
intent.setAction(Intent.ACTION_VIEW); 
intent.setData(uri);                                   //設置Intent對象Data屬性
startActivity(intent); 
或者
Intent intent=new Intent();
intent.setAction(Intent.ACTION_VIEW); 
intent.setData(Uri.parse(lee://www.fkjava.org:8888/mypath));
startActivity(intent); 

(2)在AndroidManifest.xml中設置元素中的相關內容即可

  

(3)實現其他Activity

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。