• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            life02

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              197 隨筆 :: 3 文章 :: 37 評論 :: 0 Trackbacks

            #

                 摘要:   閱讀全文
            posted @ 2011-12-15 22:28 life02 閱讀(424) | 評論 (0)編輯 收藏

                 摘要:   閱讀全文
            posted @ 2011-12-15 22:25 life02 閱讀(467) | 評論 (0)編輯 收藏

                 摘要:   閱讀全文
            posted @ 2011-12-15 22:13 life02 閱讀(197) | 評論 (0)編輯 收藏

                 摘要:   閱讀全文
            posted @ 2011-12-13 00:33 life02 閱讀(420) | 評論 (0)編輯 收藏

            Android核心分析
             
             

            Android 核心分析 之七------Service深入分析

            上一章我們分析了Android IPC架構,知道了Android服務構建的一些基本理念和原理,本章我們將深入分析Android的服務。Android體系架構中三種意義上服務:

            Native服務

            Android服務

            Init空間的服務,主要是屬性設置,這個IPC是利用Socket來完成的,這個我將在另外一章來討論。

            Navite服務,實際上就是指完全在C++空間完成的服務,主要是指系統一開始初始化,通過Init.rc腳本起來的服務,例如Service Manger service,Zygote service,Media service , ril_demon service等。

            Android服務是指在JVM空間完成的服務,雖然也要使用Navite上的框架,但是服務主體存在于Android空間。Android是二階段初始(Init2)初始化時建立的服務。

            1 Service本質結構

            我們還是從Service的根本意義分析入手,服務的本質就是響應客戶端請求。要提供服務,就必須建立接收請求,處理請求,應答客服端的框架。我想在Android Service設計者也會無時不刻把這個服務本質框圖掛在腦海中。從程序的角度,服務一定要存在一個閉合循環框架和請求處理框架

            分析清楚服務框就必須弄清楚以下的機制及其構成。

            (1)閉合循環結構放置在哪里?

            (2)處理請求是如何分發和管理?

            (3)處理框架是如何建立的?

            (4)概念框架是如何建立的?

            2 Service基本框架分析

            Android設計中,Native Service和Android Service采用了同一個閉合循環框架。這個閉合循環框架放置在Native的C++空間中,,ProcessState@ProcessState.cpp 和IPCThreadState@IPCThreadState.cpp兩個類完成了全部工作。

            在服務框架中,ProcessState是公用的部分,這個公用部分最主要的框架就是閉合循環框架和接收到從Binder來的請求后的處理框架。我們將服務框架用ProcessSate來表示,簡言之:

            (1) addservice

            (2) 建立閉合循環處理框架。

            int main(int argc, char** argv)

            {

            sp<ProcessState> proc(ProcessState::self());

            addService(String16("xxx0"), new xxx0Service());

            addService(String16("xxx1"), new xxx1Service());

            ProcessState::self()->startThreadPool();

            IPCThreadState::self()->joinThreadPool();//閉合循環框架

            }

            2.1 Native Service

            Native Service是在系統Init階段通過Init.rc腳本建立的服務。

            首先來看看一個例子mediaserver@main_mediaserver.cpp的建立過程。

            int main(int argc, char** argv)

            {

            sp<ProcessState> proc(ProcessState::self());

            sp<IServiceManager> sm = defaultServiceManager();

            LOGI("ServiceManager: %p", sm.get());

            AudioFlinger::instantiate();

            MediaPlayerService::instantiate();

            CameraService::instantiate();

            AudioPolicyService::instantiate();

            ProcessState::self()->startThreadPool();

            IPCThreadState::self()->joinThreadPool();

            }

            我們將代碼向下展開了一層,更能看到事物的本質。

            int main(int argc, char** argv)

            {

            sp<ProcessState> proc(ProcessState::self());

            sp<IServiceManager> sm = defaultServiceManager();

            defaultServiceManager()->addService(String16("media.audio_flinger"), new AudioFlinger());

            ProcessState::self()->startThreadPool();

            IPCThreadState::self()->joinThreadPool();

            }

            (1)服務進程建立了ProcessState對象,并將給對象登記在進程的上下文中。

            (2)建立一個新AudioFlinger對象,并將對象登記Service Manager Service中。

            (3)開始就收請求,處理請求,應答這個循環閉合框架。

            2.2 Android Service

            Androids service是系統二階段(Init2)初始化時建立的服務。

            Android的所有服務循環框架都是建立SystemServer@(SystemServer.java)上。在SystemServer.java中看不到循環結構,只是可以看到建立了init2的實現函數,建立了一大堆服務,并AddService到service Manager。

            main() @ com/android/server/SystemServer

            {

            init1();

            }

            Init1()是在Native空間實現的(com_andoird_server_systemServer.cpp)。我們一看這個函數就知道了,原來這個閉合循環處理框架在這里:

            init1->system_init() @System_init.cpp

            在system_init()我們看到了這個久違的循環閉合管理框架。

            {

            Call "com/android/server/SystemServer", "init2"

            …..

            ProcessState::self()->startThreadPool();

            IPCThreadState::self()->joinThreadPool();

            }

            Init2()@SystemServer.java中建立了Android中所有要用到的服務:

            Entropy Service

            Power Manager

            Activity Manager

            Telephony Registry

            Package Manager

            Account Manager

            Content Manager

            System Content Providers

            Battery Service

            Hardware Service

            Alarm Manager

            Init Watchdog

            Sensor Service

            Window Manager

            Bluetooth Service

            statusbar

            Clipboard Service

            Input Method Service

            NetStat Service

            Connectivity Service

            Accessibility Manager

            Notification Manager

            Mount Service

            Device Storage Monitor

            Location Manager

            Search Service

            Checkin Service

            Wallpaper Service

            Audio Service

            Headset Observer

            Backup Service

            AppWidget Service

            3 ProcessState和IPCThreadState

            從宏觀來講,PocessState及其IPCThreadState處于IPC與內核打交道包裝層。前面的章節已經提到,下面我將更詳細的分析。有關IPC的c++空間的實現都是從ProcessState這個對象完成的。

            我們可以得出如下的結論:不管JVM的Binder做了多么復雜的操作,最終還是需要利用ProcessState 這個c++空間的對象把數據傳遞給Binder Driver,接收數據也是通過ProcessState這個對象完成,ProcessState是所有Binder IPC必經的通道。

            ProcessState放置在全局變量gProcess中,每個進程只有一個ProcessState對象,負責打開Binder設備驅動,建立線程池等。而IPCThreadState每個線程有一個,IPCThreadState實例登記在Linux線程程的上下文附屬數據中,主要負責Binder數據讀取,寫入和請求處理框架。IPCThreadSate在構造的時候,獲取進程的ProcessSate并記錄在自己的成員變量mProcess中,通過mProcess可以獲取到Binder的句柄。

            3.1 ProcessState的生命周期

            既然ProcessState是Binder通訊的基礎,那么Process必須在Binder通訊之前建立。客戶端,服務端都必須建立。由于現在重點討論服務端,所以重心放置在服務端。在Android體系中有c++空間的服務,JVM空間的服務,這兩類服務在本質上相同的,只是形式上不同,由于他們都是建立在ProcessState這個基礎上,所以在形式上不同就僅僅表現在對OnTransact的回調處理的不同。

            Native Service

            我們直接可以看到使用sp<ProcessState> proc(ProcessState::self()),建立建立ProcessState,一旦調用ProcessState就建立了,并且這個self將ProcessSate登記在全局變量中。

            Android Service

            建立Android Service服務system_init @System_init.cpp中我們可以看到相同的結構。有一點不同的是所有的Android Service都運行在一個進程中:systemsever進程。

            3.2 Binder Driver包裝 @IPCThreadState

            ProcessSate構造的時候,使用open_binder打開/driver/binder,并將句柄記錄在mDriverFD,在ProcessState中并不使用這個句柄,真正使用這個Binder設備句柄的是IPCThreadState,所有關于Binder的操作放置在IPCThreadState中:

            (1)讀取/寫入:talkWithDriver()@IPCThreadState對ioctl(mProcess->mDriverFD, BINDER_WRITE_READ, &bwr)進行包裝。

            (2)請求處理:executeCommand(...)@ IPCThreadState

            (3)循環結構:joinThreadPool()

            joinThreadPool()

            {

            While(1){

            talkWithDriver(...)

            ...

            executeCommand(...)

            }

            }


            posted @ 2011-12-08 11:38 life02 閱讀(384) | 評論 (0)編輯 收藏

                 摘要:   閱讀全文
            posted @ 2011-12-08 11:37 life02 閱讀(469) | 評論 (0)編輯 收藏

                 摘要: Android軟件開發之獲取通訊錄聯系人信息(十二)http://www.uml.org.cn/mobiledev/201110121.asp   發布于2011-10-12   圖中選中的數據庫 contacts2.db就是系統儲存聯系人的數據庫,我們將它打開看看里面儲存了些什么東東? 打開contacts.db后...  閱讀全文
            posted @ 2011-12-08 11:30 life02 閱讀(2254) | 評論 (0)編輯 收藏

                 摘要:   閱讀全文
            posted @ 2011-12-07 23:27 life02 閱讀(238) | 評論 (0)編輯 收藏

            http://blog.csdn.net/louiswangbing/article/details/6607612

            Intent妙用之編寫自己的android主界面

            眾所周知,android的主界面名為 laucher2,功能強大,會在android啟動之后運行,也是所有其他應用程序的入口程序。那么,如何讓自己的應用程序取代laucher2的位 置,成為android系統的主界面呢?其實說出來很簡單,接下來,我就來為大家揭開這其中的神秘面紗。

            首先,我們來看看一個普通的應用程序的intent聲明:

            1. <intent-filter>  
            2.              <action android:name="android.intent.action.MAIN" />  
            3.              <category android:name="android.intent.category.LAUNCHER" />  
            4.          </intent-filter>  
            是不是看著很眼熟呢?沒錯了,這段代碼是在AndroidManifest.xml中相應activity的intent聲明,相信大家目前縮寫的應用程序的intent聲明無一例外都是這樣的吧。可能很多人都會對著兩行代碼有下面的理解:

            第二行<action android:name="android.intent.action.MAIN" />表示這個activity是當前應用程序的主activity,而第二行表示當前activity在lancher中加載。

            這么理解的卻是沒錯,但事實上,有更加簡單的理解方式。這里請容許我先賣個關子。我們繼續往下看。

            既然是想讓我們自己的應用程序取代laucher的位置,那么我們就來看一下lancher的intent聲明是怎么樣的吧:

            1. <intent-filter>  
            2.         <action android:name="android.intent.action.MAIN" />  
            3.         <category android:name="android.intent.category.HOME"/>  
            4.         <category android:name="android.intent.category.DEFAULT" />  
            5.         <category android:name="android.intent.category.MONKEY" />  
            6.     </intent-filter> 
            當 然,想要看到這段代碼,你必須要有laucher的源代碼。(關于android源代碼的問題,前面的文章已經提到過很多次了,有源代碼真的是件很好的事 情,不管是對應用程序開發者來說還是對底層開發者來說亦或是對android愛好者來說,都會受益匪淺的,所以這里再次建議大家不要僅僅局限于 android sdk和avd的使用來進行應用程序的開發,不管你有沒有時間,下份源代碼總是沒有壞處的。)

            大家看出這兩個intent聲明之間的差別了嗎?沒錯,當出現  <category android:name="android.intent.category.HOME"/>  的時候,我們的應用程序就會變成跟lancher具有相同功能的(當然,我指的僅僅是主界面,laucher的功能是在是太強大了),成為 android系統的主界面,并且,當我們按下Home鍵的時候,會出現一個選擇界面,是不是發現你的應用程序和laucher同時出現在了選擇框中呢? 如果是,那么恭喜你,從功能上來說,你已經實現了。如果沒有看到,請email我louiswangbing@gmail.com。

            但是,所謂一山不容二虎,同時有兩個主界面存在當然不是我們想要的。

            如 果你有android源代碼的話,你甚至可以把laucher刪掉,直接將你自己的應用程序編譯到android系統中,這樣,系統啟動的時候就會直接運 行你的應用程序,而你的應用程序就會堂而皇之地鳩占鵲巢,順理成章的成為系統的主界面,并且當你按下Home鍵的時候,就會跳到你的應用程序的主 activity了!!

            如果你只是一個功能上的追求者,那么看到這里你就可以關掉這個頁面去試試上面的功能了。

            如果你是一個好奇心比較強的人,那么請跟著我繼續往下看。

            剛才我說過,intent聲明的理解問題。事實上,你可以有更好的理解方式,當然,這要建立在你對android系統的啟動進程有一定的了解的基礎上。

            簡 單來說,intent其實就是一個條件過濾器,activity的intent聲明的每一條都可以作為一個過濾條件,條目越多,過濾條件也就越強,定位起 來也就越容易。相信這個原理學過數據庫的朋友理解起來更加容易。你可以將整個android系統中所有的activity都集中起來當成是一個數據庫,而 intent本身就是一條select語句,其中每一項聲明都是一項過濾條件,而過濾之后剩下的,就是將要被調用的activity。當過濾條件足夠強大 或者過濾條件比較特殊的時候,最后剩下的只有一個activity,那么系統會毫不猶豫地啟動它;當過濾條件不足導致過濾之后還剩下比較多的 activity的時候,系統會將滿足這些條件的所有的activity用一個listview列出來讓你選擇。

            相信原理大家都已經很清楚了,那么上面所述的這個功能就很好理解了。沒錯,android在啟動的時候會有一個PackageManager選擇系統中滿足過濾條件:

            1. <action android:name="android.intent.action.MAIN" />  
            2.         <category android:name="android.intent.category.HOME"/>  
            3.         <category android:name="android.intent.category.DEFAULT" />  
            4.         <category android:name="android.intent.category.MONKEY" />  
            的 activity作為系統啟動的第一個activity,也就是主界面,任何一個滿足這個過濾條件的activity都將進入候選名單,如果候選名單中僅 有一人,那么很榮幸,不戰而勝,你就是系統的主界面了;如果候選名單中有多個人(比如剛才說的有laucher和你自己的應用程序),那么就進入殘酷的” 民意選舉“,也就是用戶自己的選擇,你選誰系統就會啟動誰。但和民意選舉不同的是,選舉出來的結果通常會有一定的任期,而這個主界面的選舉任期非常的短, 每當你按下一次Home鍵或者重啟一下系統,系統就會重新安排一次”民意選舉“。如果想要永遠的成為主界面,那么唯一的辦法就是--沒錯,雖然很殘酷,但 不得不說--就是,干掉它......或者和諧一點,你可以讓它活著,但是也必須將它貶為庶民或者是將其發配邊疆,具體的實施手段就是--改掉它的 intent聲明,使其不滿足主界面的這個過濾條件。

            在 整個intent妙用章節中,這一章算是比較特殊的,因為雖然所有的章節運用的原理基本相通,也就是我上面說到的原理,但是后續章節的intent過濾條 件都是可以由用戶自己定義、手動修改的,而唯獨只有這個是不能改的,你只能決定去適應或者不適應這個過濾條件,而不能去改變這個過濾條件,就像你只能去適 應這個社會,卻很難改變它--或許不是不能,而是暫時還能找到途徑......

            有時候真的,生活跟計算機,居然有如此之多的相似之處......


            posted @ 2011-12-07 23:26 life02 閱讀(374) | 評論 (0)編輯 收藏


            http://blog.csdn.net/louiswangbing/article/details/6610936

            Android開發組件——Intent

            Intent提供了一種通用的消息系統,允許你的應用程序與其它的應用程序間傳遞Intent來執行動作和產生事件。通過使用Intent可以激活Android應用的三個核心組件:活動、服務和廣播接收器。

            Intent 的意思是意圖,也就是說App通過Intent向android表達自己的意圖即想干什么,想啟動另一個Activity或者去調用其它的App等 等;Intentfilter反應了App對意圖的響應能力,比如書上的例子撥號程序,在自己的App中聲明一個Intentfilter對這個動作意圖 進行相應,這樣當我們按下撥號鍵時,android就會在所用的Intentfilter中找到合適的App來滿足。

            ¥  Intent的分類

            Ø  顯示意圖

            調用Intent.setComponent()或Intent.setClass()方法明確指定了組件名的Intent為顯示意圖,明確指定了Intent應該傳遞到哪個組件。

            Ø  隱式意圖

            沒有明確指定組件名的Intent為隱式意圖。Android系統會根據隱式意圖中設置的動作、類別、數據找到最適合的組件來處理這個意圖

            ¥  Intent究竟是什么

            我 們可以將Intent看成是Activity通信的標準的。比如Intent中的內容告訴了系統激發Intent的Activity需要什么服務,而服務 者Activity應該滿足的條件。然后就是Android系統的事了,它負責找出符合條件的Activity服務者,并將Intent給 Activity服務者,然后這個Activity根據Intent中剩余的信息做出相應的操作。由上面可知,Intent包含兩部分信息:

            Ø  Activity服務者的信息,這個是給Android用來找到合適Activity的。

            Ø  Activity服務者要做什么操作的信息,這個是給Activity服務者用的。

            ¥  Intent

            Android 中提供了Intent機制來協助應用間的交互與通訊,Intent負責對應用中一次操作的動作、動作涉及數據、附加數據進行描述,Android則根據此 Intent的描述,負責找到對應的組件,將Intent傳遞給調用的組件,并完成組件的調用。Intent不僅可用于應用程序之間,也可用于應用程序內 部的Activity/Service之間的交互。因此,Intent在這里起著一個媒體中介的作用,專門提供組件互相調用的相關信息,實現調用者與被調 用者之間的解耦。

            ¥  Intent的屬性

            Ø  Action

            表示要執行的動作,當然也可以自定義動作,并可定義相應的Activity

            來處理我們的自定義動作。

            Ø  Data

            也就是執行動作要操作的數據。Android中采用指向數據的一個URI

            來表示。如在聯系人應用中,一個指向某聯系人的URI可能為:content://contacts/1。對于不同的動作,其URI數據的類型是不同的(可以設置type屬性指定特定類型數據),如ACTION_EDIT指定Data為文件URI,打電話為tel:URI,訪問網絡為http:URI,而由content provider提供的數據則為content:URIs。

             如果動作字段是ACTION_EDIT,數據字段包含將顯示用于編輯的文

            檔的URI;如果動作時ACTION_CALL。數據字段將是一個tel:URI和將撥  打的號碼;如果動作是ACTION_VIEW,數據字段是一個http:URI,接收活動將被調用去下載和顯示URI指向的數據。

            Ø  Type

            數據類型,顯示指定Intent的數據類型(MIME)。一般Intent的數據

            類型能夠根據數據本身進行判斷,但是通過設置這個屬性,可以強制采用顯式指定的類型而不再進行推導。

            Ø  Category

            被執行動作的附加信息。例如LAUNCHER_CATEGORY表示intent的接

            受 者應該在Launcher中作為頂級應用出現;而ALTERNATIVE_CATEGORY表示當前的Intent是一系列的可選動作中的一個,這些動作 可以在同一數據上執行。Alternative表明,這個Activity可以變成OptionMenu,供其他Activity直接調用。

            Ø  Component

            指定Intent的目標組件的類名稱。通常Android會根據Intent中包含

            的 其它屬性的信息,比如action、data/type、category進行查找,最終找到一個與之匹配的目標組件。但是,如果component這個 屬性有指定的話,將直接使用它指定的組件,而不再執行上述查找過程。指定了這個屬性以后,Intent的其它所有屬性都是可選的。

            Ø  Extra

            是其它所有附加信息的集合。使用extras可以為組件提供擴展信息,

            比如,如果要執行“發送電子郵件”這個動作,可以將電子郵件的標題、正文等保存在extras里,傳給電子郵件發送組件。

            Android需要解析的是那些隱式Intent,通過解析,將Intent映射給可以

            處理此Intent的Activity、IntentReceiver或Service。Intent解析機制主要是通

            過查找已注冊在AndroidManifest.xml中的所有IntentFilter及其中定義的Intent,

            最終找到匹配的Intent。在這個解析過程中,Android是通過Intent的action、

            type、category這三個屬性來進行判斷,判斷方法如下:

            @  如果Intent指定了action,則目標組件的IntentFilter的action列表中就必須包含有這個action,否則就不能匹配。

            @  如果Intent沒有提供type,系統將從data中得到數據類型。和action一樣,目標組件的數據類型列表中必須包含Intent的數據類型,否則不能匹配。

            @  如果Intent中的數據不是content:類型的URI,而且Intent也沒有明確指定它的type,將根據Intent中數據的scheme(比 如http:或者mailto:)進行匹配。同上,Intent的scheme必須出現在目標組件的scheme列表中。

            @  如果Intent指定了一個或多個category,這些類別必須全部出現在組件的類別列表中。比如Intent中包含了兩個類別:LAUNCHER_CATEGORY和ALTERNATIVE_CATEGORY,解析得到的目標組件必須至少包含這兩個類別。

            當匹配一個intent到一個能夠處理數據的組件,通常知道數據的類型(它

            的MIME 類型)和它的URI很重要。例如,一個組件能夠顯示圖像數據,不應該被調用去播放一個音頻文件。

             在許多情況下,數據類型能夠從URI中推測,特別是content:URIs,它表

            示 位于設備上的數據且被內容提供者(content provider)控制。但是類型也能夠顯示地設置,setData()方法指定數據的URI,setType()指定MIME類 型,setDataAndType()指定數據的URI和MIME類型。通過getData()讀取URI,getType()讀取類型。

            ¥  Intent過濾器

            活動、服務、廣播接收者為了告知系統能夠處理哪些隱式Intent,它們

            可 以有一個或多個intent過濾器。每個過濾器描述組件的一種能力,即樂意接收的一組Intent。實際上,它篩掉不想要的Intents,也僅僅是不想 要的隱式Intents。一個顯示Intent總是能夠傳遞到它的目標組件,不管它包含什么;不考慮過濾器。但是一個隱式Intent,僅當它能夠通過組 件的過濾器之一才能夠傳遞給它。

            一個組件能夠做的每一工作有獨立的過濾器,例如,記事本中的NoteEditer活動有兩個過濾器,一個是啟動一個指定的記錄,用戶可以查看和編輯;另一個是啟動一個新的、空的記錄,用戶能夠填充并保存。

            一 個intent過濾器是一個IntentFilter類的實例。因為Android系統在啟動一個組件之前必須知道它的能力,但是intent過濾器通常 不在java代碼中設置,而是在應用程序的清單文件(AndroidManifest.xml)中設置。但是有一個例外,廣播接收者的過濾器通過調用 Context.registerReceiver()動態地注冊,它直接創建一個IntentFilter對象。

            一 個過濾器有對應于Intent對象的動作、數據、種類的字段。過濾器要檢測隱式Intent的所有這三個字段,其中任何一個失敗,Android系統都不 會傳遞Intent給組件。然而,因為一個組件可以有多個Intent過濾器,一個Intent通不過組件的過濾器檢測,其它的過濾器可能通過檢測。

            一個過濾器必須至少包含一個<action>子元素,否則它將阻塞所有的Intents。

            要通過檢測,Intent對象中指定的動作必須匹配過濾器的動作列表中的一個。如果對象或過濾器沒有指定一個動作,結果將如下:

            ?   如果過濾器沒有指定動作,沒有一個Intent將匹配,所有的Intent將檢測失敗,即沒有intent能夠通過過濾器。

            ?   如果Intent對象沒有指定動作,將自動通過檢查(只要過濾器至少有一個過濾器,否則就是上面的情況了)

            對于一個Intent要通過種類檢測,Intent對象中的每個種類必須匹配過

            濾器中的一個。即過濾器能夠列出額外的種類,但是Intent對象中的種類都必須能夠在過濾器中找到,只有一個種類在過濾器列表中沒有,就算種類檢測失敗!

                    因此原則上如果一個Intent對象中沒有種類(即種類字段為空)應該總

            是 通過種類測試,而不管過濾器中有什么種類。但是有個例外,Android對待所有傳遞給Context.startActivity()的隱式 Intent好像它們至少包含”android.intent.category.DEFAULT”(對應CATEGORY_DEFAULT常量)。因 此,活動想要接收隱式Intent必須要在Intent過濾器中包含”android.intent.category.DEFAULT”。

                  Intents對照著Intent過濾器匹配,不僅去發現一個目標組件去激活,而且

            去 發現設備上的組件的其他信息。例如,Android系統填充應用程序啟動列表,最高層屏幕顯示用戶能夠啟動的應用程序:是通過查找所有的包含指定 了”android.intent.action.MAIN”的動作和”android.intent.category.LAUNCHER” 種         類的過濾器的活動,然后在活動列表中顯示這些活動的圖標和標簽。類似的,   它通過查找”android.intent.category.HOME”過濾器的活動發掘主菜單。

            ¥  Intent示例

            要實現兩個Activity的跳轉,我們可以將要跳轉的Activity類名綁定到

            Intent對象中,然后通過startActivity方法激活Intent對象中所指定的Activity,關鍵代碼如下:


            posted @ 2011-12-07 23:25 life02 閱讀(353) | 評論 (0)編輯 收藏

            僅列出標題
            共20頁: First 8 9 10 11 12 13 14 15 16 Last 
            伊人久久精品影院| 狠狠久久亚洲欧美专区| 成人免费网站久久久| 久久天天躁狠狠躁夜夜躁2014| 国内精品久久久久久中文字幕| 久久99精品国产麻豆宅宅| 99久久精品费精品国产一区二区 | 亚洲午夜福利精品久久| 久久久WWW成人| 久久精品国产清自在天天线| 久久久久九国产精品| 武侠古典久久婷婷狼人伊人| 久久99热这里只有精品66| 99久久99久久精品国产片果冻| 一本一本久久A久久综合精品 | 久久SE精品一区二区| 精品综合久久久久久98| 久久久久久久人妻无码中文字幕爆| 亚洲精品乱码久久久久久按摩| 看久久久久久a级毛片| 久久精品一区二区国产| 久久本道伊人久久| 青春久久| 久久婷婷五月综合色奶水99啪| 久久99热精品| 最新久久免费视频| 精品久久久久久国产潘金莲 | 亚洲国产精品婷婷久久| 久久精品a亚洲国产v高清不卡| 亚洲精品乱码久久久久久久久久久久 | 亚洲欧洲久久久精品| 亚洲国产精品无码久久| 久久综合丝袜日本网| 久久精品极品盛宴观看| 久久精品国产福利国产秒| 亚洲精品乱码久久久久久蜜桃| 亚洲国产欧美国产综合久久| 热99re久久国超精品首页| 久久久久久久精品成人热色戒| 久久成人影院精品777| 国产69精品久久久久久人妻精品|