編輯:關於android開發
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)
大致包含:Component,Action,Category,Data,Type,Extra,Flag這7種屬性,其中Component用於明確指定需要啟動的目標組件,而Extra用於攜帶需要交換的數據
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); }
下面這種寫法更加簡單明了
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();
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);
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屬性關系比較微妙,這兩個屬性相互覆蓋
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"));
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);
Extra屬性用於在多個Actiton之間進行數據傳遞,Intent的Extra屬性值應該是一個Bundle對象,Bundle對象就是一個Map對象,使用intent.putExtra(key,value)就可以保存數據
Popwindow仿微信右上角菜單,popwindow仿菜單MenuPopwindow: 1 package com.cloudeye.android.cloud
Android之QQ登錄界面,android登錄界面 首先過程中碰到的幾個問題: 1、對 EditText 進行自定義背景 2、運行時自動 EditText 自動獲得焦點
android onCreate中獲取view寬高為0的多種解決方法 這個問題大家肯定遇到過不止一次,其實很簡單,解決它也很容易,但是咱們追求的畢竟不是解決它,而是找
說說如何用ListView實現自適應的表格。GridView比ListView更容易實現自適應的表