安卓第十一天筆記-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屬性