編輯:關於Android編程
intent簡介 Intent對象的組成 顯式Intent與隱式Intent 顯式Intent 隱式Intent
intent用於組件之間的跳轉,它在程序運行時連接兩個組件;intent分為顯式intent和隱式intent,顯式intent常用在本應用之間組件的跳轉,隱式intent常用於在不同應用之間組件的跳轉。通過Intent,你可以向Android提交一個請求,Android會根據Intent的意願來選擇合適的組件來響應請求。這篇文章不會介紹不同應用通過intent之間數據的傳遞,介紹顯式Intent與隱式Intent
Intent對象
目標組件Components 動作(Action) 類別(category) 數據(data) 附加數據(extras) 標志(Flags)這裡介紹顯式Intent和隱式Intent
指定了component屬性的Intent(調用setComponent(ComponentName)或者setClass(Context, Class)來指定)。通過指定具體的組件類,通知應用啟動對應的組件。通過指定目標組件名字,尋找目標組件,一般應用於調用程序和目標組件在同一個應用中的情況;
顯式Intent通過指定組件來直接調用的,Intent中可以通過下面的方式實現顯式Intent
setComponent(ComponentName name)
Component類是Android系統提供的組件封裝類,需要提供包名,類名,context對象 setClassName(String packageName,String classNameInThatPackage)
提供類名和本包中目標組件類名–必須是全類名,包名+類名 setClassName(Context context,String classNameInThatContext)
Context對象和目標組件類名–必須是全類名,包名+類名,setClassName中會創建一個Conponent對象,而Component對象如果傳入的是context對象的話,會通過context.getPackageName()來獲取包名 setClass(Context context,Class classObjectInThatContext)
Context對象和目標組件類類型,與fnew Intent(MainActivity.this,OtherActivity.class);
傳遞的參數一樣
我們經常使用顯式Intent的方式是通過Intent構造函數來創建的,如下所示:
Intent intent=new Intent(MainActivity.this,OtherActivity.class);
查看源代碼可以知道,構造函數內部所做的事情是新創建了一個ComponentName對象,如下圖:
構造函數new了一個ComponentName對象,並賦值給這個mComponent(後面都使用mComponent來指定intent創建出的ComponentName對象)。之後通過startActivity(intent)
來啟動目標組件,當我們不傳遞任何參數創建Intent對象時,就需要我們手動設置ComponentName對象,與上述通過傳遞context對象和Class對象相同,代碼如下:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">
Intent intent=new Intent(MainActivity.this,OtherActivity.class);
ComponentName com=new ComponentName("com.sujz.intent_test","com.sujz.intent_test.OtherActivity"));
intent.setComponent(com)
startActivity(intent);
ComponentName對象傳遞兩個參數,第一參數傳遞的是當前Activity對象所在的包名,第二個參數傳遞的是目標對象的全類名(包名+類名)
setComponentName
方法實際上是給上圖中的mComponent賦值。所以通過setComponentName方法上述方法一樣
setClassName
與setComponent
類似,setClassName
內部會構造一個ComponentName對象,然後賦值給mComponent對象,其他的方法不再贅述。
隱式Intent對象是沒有指定mComponent的Intent,也就是說,在構建Intent的過程中,不會通過Intent intent=new Intent(MainActivity.this,OtherActivity.class);
, setComponent(ComponentName name)``setClassName(String packageName,String classNameInThatPackage)``setClass(Context context,Class classObjectInThatContext)
等方式來指定ComponentName對象,注意是不會,不會,不會,重要的事情說3遍。
當沒有指定mComponent對象時,需要足夠的信息才能夠匹配到目標組件,這些信息包括Action,Category,Data。這3個信息需要當前組件的Intent和目標組件的Intent都配置,只要當兩個組件的3個信息匹配時,才會啟動目標組件,當然也可能會同時匹配到多個目標組件,這時就需要用戶自己去選擇,如下邊的栗子,就是一個Intent匹配到了多個目標組件。這種方式不僅可以啟動本應用中的相關組件,也可以啟動其他應用的相關組件,舉個栗子,當我們的手機中安裝了多個浏覽器時,比如UC,百度等,當我們在某個應用中點擊某個鏈接時,是不是會跳出一個選擇框來讓你選擇使用哪個浏覽器來打開鏈接(如果沒有彈出選擇框,有兩個可能:1.你的手機只有一個浏覽器。2.你之前勾選了默認使用該浏覽器打開鏈接)。好了,栗子舉完了。來說正事,這種方式就是通過隱式Intent來設置的。那我們要怎麼設置來啟動另外一個組件呢?繼續看。
首先我們先將目標組件的Intent設置,剛剛說到我們在匹配時,需要當前組件和目標組件都設置了Intent,目標組件的Intent設置在AndroidManifest.xml中。在這裡我們有兩個應用程序,一個是Intent_test,另一個是Host,現在從Host啟動到Intent_test,也就是說目標組件時Inent_test中的MainActivity1是目標組件,我們需要在AndroidManifest中配置如下:
在目標組件的AndroidManifest中,在該Activity節點下需需要配置intent-filter節點,該節點至少需要配置一個Action和一個Category,action和Category可以有多個,只需要匹配到其中某一個即可,這裡沒有配置Data,也就是說Data可以不配置。主要這裡必須要配置
原因是因為在發送intent請求的組件中默認會配置這一項。
Host中的代碼如下:
Intent intent=new Intent();
intent.setAction("com.sujz.aa");
startActivity(intent);
可能有人會問,這裡沒有配置category,為什麼能匹配到。這是因為android在startActivity(intent)中會設置category。內部會調用intent.addCategory("android.intent.category.DEFAULT");
setAction中需要傳遞目標組件的Intent-filter的action名稱。
你也可以創建自己的category,以上面為例,如下所示,在intent_test中:
在Host中:
Intent intent=new Intent();
intent.setAction("com.sujz.aa");
intent.addCategory("android.intent.category.bb");
startActivity(intent);
不需要intent.addCategory("android.intent.category.DEFAULT");
因為在startActivity(intent);
已經添加了。
好了隱式Intent已經講完了
今天我們就簡單的實現一下城市的排序 讀取我們城市的信息並通過listview展示 首先看一下我們的布局文件 <LinearLayout xmlns:and
基本概念AsyncTask:異步任務,從字面上來說,就是在我們的UI主線程運行的時候,異步的完成一些操作。AsyncTask允許我們的執行一個異步的任務在後台。我們可以將
當我們使用了手機QQ浏覽器一段時間後,就需要清除一下緩存,這樣才能使手機QQ浏覽器使用起來更流暢,同時也節省了一點手機空間。那麼手機QQ浏覽器如何清除緩存呢
做了微信支付,下載了Demo,發現和之前有所改動,v3.0的版本,也許有的朋友還在摸索,這裡我已經成功支付,話不多說,直接進入主題:一、首先要在微信開發平台注冊賬號,新增