Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 安卓第十一天筆記-Intent與inter-filter配置,intentfilter

安卓第十一天筆記-Intent與inter-filter配置,intentfilter

編輯:關於android開發

安卓第十一天筆記-Intent與inter-filter配置,intentfilter


安卓第十一天筆記-Intent與inter-filter配置

Intent與inter-filter配置

1.Intent對象簡述

Android應用中有包含三種重要組件:Activity,Service,BroadcastReceiver(另外還有一個ContextProvider)應用程序采用了一致的方式來啟動它們---都是依靠Intent來啟動的,Intent就是封裝了程序想要啟動的程序的意圖,不僅如些,Intent還可用於與被啟動組件交換信息

Activity:

  startActivity(Intent intent)
     startActivityForResult(Intent intent,int requestCode)

 

Service:

    ComponentName startService(Intent intent)
    boolean bindServcie(Intent intent,ServiceConnection conn,int flags)

 

BroadcastReceiver

   sendBroadcast(Intent intent)
    sendBroadcast(Intent intent,String receiverPremission)
    sendOrderedBroadcast(Intent intent,String receiverPremission,BroadcastReceiver resultReceiver,Handler scheduler,int initiaCode,String initialData,Bundle initiaExtras)
    sendOrderBroadcast(Intent intent,String receiverPermission)
    sendStickyBroadcast(Intent intent),
    sendStickyOrderdBroadcast(Intent intent,BroadcastReceiver resultReceiver,Handler scheduler,int initiaCode,String initialData,Bundle initiaExtras)

 

2.Intent對象的屬性

大致包含:Component,Action,Category,Data,Type,Extra,Flag這7種屬性,其中Component用於明確指定需要啟動的目標組件,而Extra用於攜帶需要交換的數據

3.Component屬性

Intent的Component屬性需要接受一個ComponentName對象,ComponentName包含如下構造器

ComponentName(String pkg,String cls)
//創建PKG據在包下的cls類所對應的組件
ComponentName(Context pkg,String cls)
//創建PKG據在包下的cls類所對應的組件
ComponentName(Context pkg, Class<?> cls)
//創建PKG據在包下的cls類所對應的組件

 

同時還有如下三個方法

setClass(Context packageContext,Class<?> cls)
//設置該 Intent將要啟動的組件對應的類
setClassName(Context packageContext,String className)
//設置該Intent將要啟動的組件對應 的類名,要全路徑
setClassName(String packageContext,String className)
//設置該Intent將要啟動的組件對應 的類名,要全路徑

 

Context代表訪問應用環境信息的接口,而Android應用的包名則作為應用的唯一標識,因此 Android應用的Context對象與該應用的包名有一一對應的關系 Component屬性的Intent已經明確了它將要啟動哪個組件,因此這種Intent也被稱為顯示意圖 常用來啟動同一個應用程序中組件 而沒有指定Componet屬性的Intent被稱為隱式意圖,隱式意圖沒有明克指定去啟動哪個組件,就用將會根據Intent指定的規則去啟動符合條件的組件,具體是哪個不確定

*使用顯示意圖啟動另一個Activity

 /**
 * 顯示意圖打開第二個Activity
 * @param v
 */
public void open02(View v){
     //創建一個Compon對象
    ComponentName comp = new ComponentName(this,SecondActivity.class);

    Intent intent = new Intent();
    //為Intent設置Compon屬性
    intent.setComponent(comp);
    //啟動
    startActivity(intent);
}

 

第二個Activity

tv = (TextView) findViewById(R.id.tv);
    //得到Intento
    Intent intent = getIntent();

    //獲取Componet
    ComponentName comp = intent.getComponent();

    tv.setText("包名" + comp.getPackageName() + ",組件名稱:" + comp.getClassName());

 

更改啟動Intent的寫法

/**
 * 顯示意圖打開第二個Activity
 * @param v
 */
public void open02(View v){


    Intent intent = new Intent();
    //為Intent設置屬性
    intent.setClass(this,SecondActivity.class);
    //啟動
    startActivity(intent);
}

 

下面這種寫法更加簡單明了

4.Action,Category屬性與intent-filter

Action與Category屬性的值都是一個普通的字符串 其中Action代表該Intent所要完成的動作(抽象)而Category剛用於Action增加額外的附加類別信息.通常Action會與Category屬性結合使用

隱式意圖啟動一個Activity

<!--注冊SecondActivity-->
    <activity android:name=".SecondActivity">
        <intent-filter>
            <!--添加動作名稱可以隨便寫-->
            <action android:name="com.hello.SECOND"/>
            <!--類別如果是這個默認DEFAULT可以不寫,但建議寫上-->
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>

 

啟動一個Activity

    Intent intent = new Intent();
    //為Intent設置屬性
    intent.setAction("com.hello.SECOND");
    intent.addCategory("android.intent.category.DEFAULT");
    //啟動
    startActivity(intent);

 

*其中Action與Category都可以有多個值

//獲取Action與Category的值
    String action = intent.getAction();

  Set<String> categories = intent.getCategories();

 

5.指定特定的Action與Category調用系統的Activity

Android系統內部提供了大量的標准的Action與Category常量

*返回桌面

 /*
返回桌面
 */
public void goDesk(View v){
    Intent intent = new Intent();
    //寫字符串
    intent.setAction("android.intent.action.MAIN");
    //寫字符串
    intent.addCategory("android.intent.category.HOME");
    //啟動
    startActivity(intent);

}

 

*使用系統提供好的

    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    startActivity(intent);

 

6.Data Type與intent-filter配置

Data屬性常用於向Action屬性提供操作的數據.Data屬性接收一個URI的對象,一個uri對象通常通過如下字符串的形式

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

*uri字符串滿足以下格式

schema://host:prot/path

content:是schema部分 com.android.contacts是host部分 port是80省略了 /contacts/1是path部分

Type屬性用於指定該Data所指定的URI對應 的MIME類型,這種MIME類型可以是任意任何自定義的MIME類型只要符合ABC/XYZ格式的字符即可

Data屬性與Type屬性關系比較微妙,這兩個屬性相互覆蓋

  • 如果為Intent先設置Data屬性,後設置Type屬性,那麼Type屬性將會覆蓋Data屬性
  • 如果為Intent先設置Type屬性,後設置Data屬性,那麼Data屬性將會覆蓋Type屬性
  • 如果希望Intent即有Data屬性,也有Type屬性則應該調用Intent的setDataAndType()方法

Data屬性

<data
                android:host=""
                android:mimeType=""
                android:path=""
                android:pathPattern=""
                android:pathPrefix=""
                android:port=""
                android:scheme=""
                android:ssp=""
                android:sspPattern=""
                android:sspPrefix=""/>

 

匹配過程:

如果組件的Data元素只指定了android:schema屬性,那麼只要Intent的Data屬性部分與schema部分相同就可啟動

<data android:scheme="abcd"/>
intent.setData(Uri.parse("abcd://"));

 

如果組件指定了schema,host,屬性那麼只要Intent的Data屬性的schema,host,prot部分與之相同就可啟動,可以 沒有port屬性

<data android:scheme="abcd"
                  android:host="www.fkjava.com"
               />
intent.setData(Uri.parse("abcd://www.fkjava.com"));

 

如果目標組件的Data子元素,只有port屬性,沒有host屬性,那麼port屬性不會起作用 如果目標組件的Data子元素只有path屬性,沒有host屬性,那麼path屬性不會起作用

<data android:scheme="abcd"
                  android:host="www.fkjava.com"
                android:port="8888"/>
intent.setData(Uri.parse("abcd://www.fkjava.com:8888"));

 

7.調用系統的應用

2.打電話

 Intent intent = new Intent();
    //為Intent設置屬性
    intent.setAction(Intent.ACTION_CALL);
    //設置data
    intent.setData(Uri.parse("tel://110"));
    //啟動
    startActivity(intent);

 

3.編輯指定的聯系人

 Intent intent = new Intent();
    //為Intent設置屬性
    intent.setAction(Intent.ACTION_EDIT);
    //設置data
    intent.setData(Uri.parse("content://com.android.contacts/contacts/1"));
    //啟動
    startActivity(intent);

 

8.Extra屬性

Extra屬性用於在多個Actiton之間進行數據傳遞,Intent的Extra屬性值應該是一個Bundle對象,Bundle對象就是一個Map對象,使用intent.putExtra(key,value)就可以保存數據

9.FLAG屬性

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved