日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Android RIL 架構(gòu)學(xué)習(xí)總結(jié)

 灬木木的花灬 2015-09-18

 

1.Android RIL 概念     (轉(zhuǎn)自http:///2011/03/08/android-ril-structure-learning-summary.html)

Android RIL是基于telephony 服務(wù)和raido 硬件層的抽象層, 通過研究RIL的代碼可以看到,Android的rild庫(kù)是介于HAL接口與basebandmodem之間,它同樣提供了語(yǔ)音、數(shù)據(jù)、短信、SIM卡管理以及STK應(yīng)用的功能,實(shí)現(xiàn)思路跟微軟的RIL有異曲同工之妙,也是把標(biāo)準(zhǔn)的 GSM27.007中常用的如dial這些做主動(dòng)請(qǐng)求的操作稱之為request,一共75個(gè);另外一類GSM模塊主動(dòng)上報(bào)的例如信號(hào)強(qiáng)度、基站信息等,稱之為unsolicited response,一共17個(gè);開發(fā)模式也是跟微軟RIL開發(fā)差不多,需要針對(duì)不同的GSM模塊進(jìn)行不同的GSM驅(qū)動(dòng)開發(fā),公用的部分google給你做好了,特定的部分需要你自己去定制,這樣做可以大大地提高開發(fā)效率。以下是RIL 交互圖


2.本地代碼 :

 

RIL 支持的本地代碼包括 ril 庫(kù)和守護(hù)進(jìn)程:

hardware/ril/include

hardware/ril/libril

hardware/ril/rild

hardware/ril/reference-ril編譯結(jié)果是

/system/bin/rild :守護(hù)進(jìn)程

/system/lib/libril.so : RIL 的庫(kù)

/system/lib/libreference-ril.so : RIL 參考庫(kù)3.RILInitialization

Android initializes the telephony stack andthe Vendor RIL at startup as described in the sequence below:

(1). RIL daemon reads rild.lib path andrild.libargs system properties to determine the Vendor RIL library to use andany initialization arguments to provide to the Vendor RIL

(2). RIL daemon loads the Vendor RILlibrary and calls RIL_Init to initialize the RIL and obtain a reference to RILfunctions

(3). RIL daemon calls RIL_register on theAndroid telephony stack, providing a reference to the Vendor RIL functions

See the RIL Daemon source code at//device/commands/rild/rild.c for details.

4.rild 執(zhí)行流程

rild 是一個(gè)守護(hù)進(jìn)程,在這里宏RIL_SHLIB 被定義。執(zhí)行的過程為:

獲取參數(shù) -> 打開功能庫(kù) -> 建立事件循環(huán)(線程) -> 執(zhí)行 RIL_Init ->RIL_register 。

  1.    
  2. int main(int argc,  
  3. char **argv)  
  4.    
  5.    {  
  6.    
  7.    /*獲取參數(shù)并解析 */  
  8.    
  9.       dlHandle = dlopen(rilLibPath, RTLD_NOW);  
  10.    
  11.    /*啟動(dòng)線程,進(jìn)入事件循環(huán) */  
  12.    
  13.       RIL_startEventLoop();  
  14.    
  15.       rilInit = (const RIL_RadioFunctions *(*)(const struct RIL_Env *, int,char  
  16.    
  17. **))  
  18.    
  19.                   dlsym(dlHandle,"RIL_Init");  
  20.    
  21.    /*處理參數(shù) */  
  22.    
  23.       funcs = rilInit(&s_rilEnv, argc, rilArgv);  
  24.    
  25.       RIL_register(funcs);  
  26.    
  27.   done:  
  28.    
  29.       while(1) {  
  30.    
  31.           sleep(0x00ffffff);  
  32.    
  33.       }  
  34.    
  35.    }  



5.RIL Interaction

RIL有兩種執(zhí)行流程儲(chǔ):

(1)Solicited commands: 基于RIL lib, 例如 DIAL andHANGUP.

(2)Unsolicited responses: 基于 baseband, 例如CALL_STATE_CHANGED和 NEW_SMS.

5.1 Solicited

以下兩段代碼是請(qǐng)求類接口:

void OnRequest (int request_id, void *data,size_t datalen, RIL_Token t);

void OnRequestComplete (RIL_Token t,RIL_Error e, void *response, size_t responselen);The following diagramillustrates a solicited call in Android.


5.2 Unsolicited

以下代碼是非請(qǐng)求類接口:

void OnUnsolicitedResponse (intunsolResponse, void *data, size_t datalen);The following diagram illustrates anunsolicited call in Android.


6.RIL_Init

使用自定義的RIL lib 時(shí),由于rild通過符號(hào)RIL_Init獲取一組函數(shù)指針并以此與之建立聯(lián)系,因而必須實(shí)現(xiàn)RIL_Init 函數(shù),,RIL_Init 的定義如下:

RIL_RadioFunctions *RIL_Init (RIL_Env* env,int argc, char **argv);RIL_Init should return a RIL_RadioFunctions structurecontaining the handles to the radio functions:

  1. type structure {  
  2.        int RIL_version;  
  3.        RIL_RequestFunc onRequest;  
  4.        RIL_RadioStateRequest onStateRequest;       
  5.        RIL_Supports supports;  
  6.        RIL_Cancel onCancel;  
  7.        RIL_GetVersion getVersion;  
  8. }  


RIL_RadioFunctions;7.接下來分析初始化流程

主入口是rild.c中的main函數(shù),主要完成三個(gè)任務(wù):

(1). 開啟libril.so中的event機(jī)制, 在RIL_startEventLoop中,是最核心的由多路I/O驅(qū)動(dòng)的消息循環(huán)。

(2). 初始化librefrence_ril.so,也就是跟硬件或模擬硬件modem通信的部分(后面統(tǒng)一稱硬件), 通過RIL_Init函數(shù)完成。

(3). 通過RIL_Init獲取一組函數(shù)指針RIL_RadioFunctions, 并通過RIL_register完成注冊(cè),并打開接受上層命令的socket通道。

8.RIL跟上層通訊主要采用兩種方式:

(1)一種是通過Socket發(fā)送與接收消息的方式來實(shí)現(xiàn),

C方面,這個(gè)Socket在ril.cpp里面可以找到它的創(chuàng)建代碼:

  1. s_fdListen =android_get_control_socket(SOCKET_NAME_RIL);JAVA方面,在RIL.java中:  
  2.          s = new LocalSocket();  
  3.          l = new LocalSocketAddress(SOCKET_NAME_RIL,  
  4.                            LocalSocketAddress.Namespace.RESERVED);  


         s.connect(l);(2)還有另外一種方式就是直接通過TCP/IP直接訪問內(nèi)核中的shared memory,進(jìn)行RPC調(diào)用,這種方式主要應(yīng)用在數(shù)據(jù)模式上,一來由于Android的每個(gè)Activity隨時(shí)都會(huì)有可能需要網(wǎng)絡(luò)連接接收發(fā)送數(shù)據(jù),因此必須提供一種實(shí)時(shí)性較高訪問的方式,二來可以提高通訊效率。

參考資料:

http://www./android/mydroid/development/pdk/docs/telephony.html


========================================================

Android 2.2 RIL hardware 部分代碼簡(jiǎn)介

Android源碼中,hardware/ril目錄中包含著RILhardware 底層源碼,該目錄樹如下引用部分,下面將做具體的分析:

|– CleanSpec.mk

|– include

| `– telephony

| |– ril.h

| `– ril_cdma_sms.h

|– libril

| |– Android.mk

| |– MODULE_LICENSE_APACHE2

| |– NOTICE

| |– ril.cpp

| |– ril_commands.h

| |– ril_event.cpp

| |– ril_event.h

| `– ril_unsol_commands.h

|– reference-cdma-sms

| |– Android.mk

| |– reference-cdma-sms.c

| `– reference-cdma-sms.h

|– reference-ril

| |– Android.mk

| |– MODULE_LICENSE_APACHE2

| |– NOTICE

| |– at_tok.c

| |– at_tok.h

| |– atchannel.c

| |– atchannel.h

| |– misc.c

| |– misc.h

| `– reference-ril.c

`– rild

|– Android.mk

|– MODULE_LICENSE_APACHE2

|– NOTICE

|– radiooptions.c

|– rild.c

`– rild.c~

一、目錄hardware/ril/include

 

包含兩個(gè)頭文件: ril.h 和 ril_cdma_sms.h ,其中 ril.h中定義了76個(gè)如下類型的宏:RIL_REQUEST_XXX ,這些宏代表著客戶進(jìn)程可以向Android telephony發(fā)送的命令,包括SIM卡相關(guān)的功能,打電話,發(fā)短信,網(wǎng)絡(luò)信號(hào)查詢等。 ril_cdma_sms.h 則是針對(duì)cdma sms 的擴(kuò)展時(shí)所用到的一些宏和結(jié)構(gòu)體的定義。

二、目錄hardware/ril/libril

該目錄下代碼負(fù)責(zé)與上層客戶進(jìn)程進(jìn)行交互。在接收到客戶進(jìn)程命令后,調(diào)用相應(yīng)函數(shù)進(jìn)行處理,然后將命令響應(yīng)結(jié)果傳回客戶進(jìn)程。在收到來自網(wǎng)絡(luò)端的事件后,也傳給客戶進(jìn)程。

1、文件ril_commands.h:列出了telephony可以接收的命令;每個(gè)命令對(duì)應(yīng)的處理函數(shù);以及命令響應(yīng)的處理函數(shù)。諸如:

   {RIL_REQUEST_GET_SIM_STATUS, dispatchVoid, responseSimStatus},

   {RIL_REQUEST_ENTER_SIM_PIN, dispatchStrings, responseInts},

   {RIL_REQUEST_ENTER_SIM_PUK, dispatchStrings, responseInts},

   {RIL_REQUEST_ENTER_SIM_PIN2, dispatchStrings, responseInts},

   {RIL_REQUEST_ENTER_SIM_PUK2, dispatchStrings, responseInts},

   {RIL_REQUEST_CHANGE_SIM_PIN, dispatchStrings, responseInts},

   ... .. ..2、文件ril_unsol_commands.h:列出了telephony可以接收的事件類型;對(duì)每個(gè)事件的處理函數(shù);諸如:

   {RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED, responseVoid, WAKE_PARTIAL},

   {RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED, responseVoid, WAKE_PARTIAL},

   {RIL_UNSOL_RESPONSE_NETWORK_STATE_CHANGED, responseVoid, WAKE_PARTIAL},

   {RIL_UNSOL_RESPONSE_NEW_SMS, responseString, WAKE_PARTIAL},

   {RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT, responseString,WAKE_PARTIAL},

   {RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM, responseInts, WAKE_PARTIAL},

    .. . . . .3、文件ril_event.h/cpp:處理與事件源(端口,modem等)相關(guān)的功能。ril_event_loop監(jiān)視所有注冊(cè)的事件源,當(dāng)某事件源有數(shù)據(jù)到來時(shí),相應(yīng)事件源的回調(diào)函數(shù)被觸發(fā)(firePending -> ev->func())。

4、文件ril.cpp 功能較為龐大,如下:

1)RIL_register函數(shù):打開監(jiān)聽端口,接收來自客戶進(jìn)程的命令請(qǐng)求 (s_fdListen = android_get_control_socket(SOCKET_NAME_RIL);),當(dāng)與某客戶進(jìn)程連接建立時(shí),調(diào)用 listenCallback函數(shù);創(chuàng)建一單獨(dú)線程監(jiān)視并處理所有事件源 (通過ril_event_loop)

2)listenCallback函數(shù):當(dāng)與客戶進(jìn)程連接建立時(shí),此函數(shù)被調(diào)用。此函數(shù)接著調(diào)用processCommandsCallback處理來自客戶進(jìn)程的命令請(qǐng)求

3)processCommandsCallback函數(shù):具體處理來自客戶進(jìn)程的命令請(qǐng)求。對(duì)每一個(gè)命令,ril_commands.h中都規(guī)定了對(duì)應(yīng)的命 令處理函數(shù)(dispatchXXX),processCommandsCallback會(huì)調(diào)用這個(gè)命令處理函數(shù)進(jìn)行處理。

4)dispatch系列函數(shù):此函數(shù)接收來自客戶進(jìn)程的命令己相應(yīng)參數(shù),并調(diào)用onRequest進(jìn)行處理。

5)RIL_onUnsolicitedResponse函數(shù):將來自網(wǎng)絡(luò)端的事件封裝(通過調(diào)用responseXXX)后傳給客戶進(jìn)程。

6)RIL_onRequestComplete函數(shù):將命令的最終響應(yīng)結(jié)構(gòu)封裝(通過調(diào)用responseXXX)后傳給客戶進(jìn)程。

7)response系列函數(shù):對(duì)每一個(gè)命令,都規(guī)定了一個(gè)對(duì)應(yīng)的response函數(shù)來處理命令的最終響應(yīng);對(duì)每一個(gè)網(wǎng)絡(luò)端的事件,也規(guī)定了一個(gè)對(duì)應(yīng)的 response函數(shù)來處理此事件。response函數(shù)可被onUnsolicitedResponse或者onRequestComplete調(diào)用。

三、目錄hardware/ril/reference-ril

本目錄下代碼主要負(fù)責(zé)與modem(調(diào)制解調(diào)器)進(jìn)行交互。

1、文件reference-ril.c:

此文件核心是兩個(gè)函數(shù):onRequest和onUnsolicited

1) onRequest 函數(shù):在這個(gè)函數(shù)里,對(duì)每一個(gè)RIL_REQUEST_XXX請(qǐng)求,都轉(zhuǎn)化成相應(yīng)的ATcommand,發(fā)送給modem,然后睡眠等待。當(dāng)收到此AT command的最終響應(yīng)后,線程被喚醒,將響應(yīng)傳給客戶進(jìn)程(RIL_onRequestComplete -> sendResponse)。

2) onUnsolicited函數(shù):這個(gè)函數(shù)處理modem從網(wǎng)絡(luò)端收到的各種事件,如網(wǎng)絡(luò)信號(hào)變化,撥入的電話,收到短信等。然后將時(shí)間傳給客戶進(jìn)程(RIL_onUnsolicitedResponse -> sendResponse)。

2、文件atchannel.c:

負(fù)責(zé)向modem讀寫數(shù)據(jù)。其中,寫數(shù)據(jù)(主要是AT command)功能運(yùn)行在主線程中,讀數(shù)據(jù)功能運(yùn)行在一個(gè)單獨(dú)的讀線程中。

函數(shù)at_send_command_full_nolock:運(yùn)行在主線程里面。將一個(gè)AT command命令寫入modem后進(jìn)入睡眠狀態(tài)(使用 pthread_cond_wait或類似函數(shù)),直到modem讀線程將其喚醒。喚醒后此函數(shù)獲得了AT command的最終響應(yīng)并返回。函數(shù)readerLoop運(yùn)行在一個(gè)單獨(dú)的讀線程里面,負(fù)責(zé)從modem中讀取數(shù)據(jù)。讀到的數(shù)據(jù)可分為三種類型:網(wǎng)絡(luò)端傳入的事件;modem對(duì)當(dāng)前AT command的部分響應(yīng);modem對(duì)當(dāng)前AT command的全部響應(yīng)。對(duì)第三種類型的數(shù)據(jù)(AT command的全部響應(yīng)),讀線程喚醒(pthread_cond_signal)睡眠狀態(tài)的主線程。

3、文件at_tok.c 提供AT響應(yīng)的解析函數(shù)

4、misc.c 字面意思雜項(xiàng),里面就提供一個(gè)字符串匹配函數(shù)

四、目錄hardware/ril/rild

該目錄下的代碼主要是為了生成rild 和 radiooptions 的可執(zhí)行文件

1、radiooptions.c 生成radiooptions 的可執(zhí)行文件, radooptions程序僅僅是把命令行參數(shù)傳遞給socket{rild-debug}去處理而已,從而達(dá)到與rild通信,可供調(diào)試時(shí)配置Modem參數(shù)。

2、rild.c 生成 rild 的可執(zhí)行文件有關(guān)rild 進(jìn)程的介紹看 AndroidRIL架構(gòu)學(xué)習(xí)總結(jié)


=================================================

Android 2.2 RIL Java 部分代碼簡(jiǎn)介

Android中,telephony相關(guān)的java代碼主要在下列目錄中:

1.frameworks/base/telephony/java/android/telephony

2.frameworks/base/telephony/java/com/android/internal/telephony

3.frameworks/base/services/java/com/android/server/TelephonyRegistry.java

4. packages/apps/Phone其中,目錄1中的代碼提供Android telephony的公開接口,任何具有權(quán)限的第三方應(yīng)用都可使用,如接口類TelephonyManager。目錄2、3中的代碼提供一系列內(nèi)部接口,目前第三方應(yīng)用還不能使用,當(dāng)前似乎只有packages/apps/Phone能夠使用。目錄4是一個(gè)特殊應(yīng)用,或者理解為一個(gè)平臺(tái)內(nèi)部進(jìn)程。其他應(yīng)用通過intent方式調(diào)用這個(gè)進(jìn)程的服務(wù)。

TelephonyManager

TelephonyManager主要使用兩個(gè)服務(wù)來訪問telephony功能:

1. ITelephony, 提供與telephony 進(jìn)行操作,交互的接口,在packages/apps/Phone中由PhoneInterfaceManager.java實(shí)現(xiàn)。

2. ITelephonyRegistry, 提供登記telephony事件的接口。由frameworks/base/services/java/com/android/server/TelephonyRegistry.java實(shí)現(xiàn)。

interface CommandsInterface

interface CommandsInterface 描述了對(duì)電話的所有操作接口,如命令,查詢狀態(tài),以及電話事件監(jiān)聽等

class BaseCommands是CommandsInterface的直接派生類,實(shí)現(xiàn)了電話事件的處理(發(fā)送message給對(duì)應(yīng)的handler)。

而class RIL又派生自BaseCommands。RIL負(fù)責(zé)實(shí)際實(shí)現(xiàn)CommandsInterface中的接口方法。RIL通過Socket和rild守護(hù)進(jìn)程進(jìn)行通訊。對(duì)于每一個(gè)命令接口方法,如acceptCall,或者狀態(tài)查詢,將它轉(zhuǎn)換成對(duì)應(yīng)的RIL_REQUEST_XXX,發(fā)送給rild。線程 RILReceiver監(jiān)聽socket,當(dāng)有數(shù)據(jù)上報(bào)時(shí),讀取該數(shù)據(jù)并處理。讀取的數(shù)據(jù)有兩種,

1. 電話事件,RIL_UNSOL_xxx, RIL讀取相應(yīng)數(shù)據(jù)后,發(fā)送message給對(duì)應(yīng)的handler (詳見函數(shù)processUnsolicited)

2. 命令的異步響應(yīng)。(詳見函數(shù)processSolicited)

interface Phone

interface Phone描述了對(duì)電話的所有操作接口。 PhoneBase直接從Phone 派生而來。而另外兩個(gè)類,CDMAPhone和GSMPhone,又從PhoneBase派生而來,分別代表對(duì)CDMA 和GSM的操作。

PhoneProxy也從Phone直接派生而來。當(dāng)當(dāng)前不需要區(qū)分具體是CDMAPhone還是GSM Phone時(shí),可使用PhoneProxy。

抽象類Call代表一個(gè)call,有兩個(gè)派生類CdmaCall和GsmCall。

interface PhoneNotifier

interface PhoneNotifier定義電話事件的通知方法

DefaultPhoneNotifier從PhoneNotifier派生而來。在其方法實(shí)現(xiàn)中,通過調(diào)用service ITelephonyRegistry來發(fā)布電話事件。

service ITelephonyRegistey由frameworks/base/services/java/com/android/server/TelephonyRegistry.java實(shí)現(xiàn)。這個(gè)類通過廣播intent,從而觸發(fā)對(duì)應(yīng)的broadcast receiver。

在PhoneApp創(chuàng)建時(shí),sPhoneNotifier = new DefaultPhoneNotifier();…sCommandsInterface = new RIL(context, networkMode,cdmaSubscription);

然后根據(jù)當(dāng)前phone是cdma還是gsm,創(chuàng)建對(duì)應(yīng)的phone,如:sProxyPhone = newPhoneProxy(new GSMPhone(context,sCommandsInterface, sPhoneNotifier));

下面我們來研究一個(gè)電話打出去的流程。

1. TwelveKeyDialer.java, onKeyUp()

2. TwelveKeyDialer.java, placeCall()

3. OutgoingCallBroadcaster.java, onCreate()

sendOrderedBroadcast(broadcastIntent,PERMISSION,

new OutgoingCallReceiver(), null,Activity.RESULT_OK, number, null);

4. OutgoingCallBroadcaster.java,OutgoingCallReceiver

doReceive ->context.startActivity(newIntent);

5. InCallScreen.java, onCreate/onNewIntent

6. InCallScreen.java, placeCall

7. PhoneUtils.java, placeCall

8. GSMPhone.java, dial

9. GsmCallTracker.java, dial

10. RIL.java, dial

RILRequest rr =RILRequest.obtain(RIL_REQUEST_DIAL, result);

send(rr);

下面來研究一個(gè)incoming call的流程:

1. 創(chuàng)建GsmPhone時(shí),mCT = newGsmCallTracker(this);

2. 創(chuàng)建GsmCallTracker時(shí):

cm.registerForCallStateChanged(this,EVENT_CALL_STATE_CHANGE, null); –>

mCallStateRegistrants.add(r);

3. RIL中的RILReceiver線程首先讀取從rild中傳來的數(shù)據(jù):processResponse -> processUnsolicited

4. 對(duì)應(yīng)于incoming call,RIL收到RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED消息,觸發(fā)mCallStateRegistrants中的所有記錄。

5. GsmCallTracker處理EVENT_CALL_STATE_CHANGE,調(diào)用pollCallsWhenSafe

6. 函數(shù)pllCallsWhenSafe 處理:

lastRelevantPoll =obtainMessage(EVENT_POLL_CALLS_RESULT);

cm.getCurrentCalls(lastRelevantPoll);

7. RIL::getCurrentCalls

RILRequest rr =RILRequest.obtain(RIL_REQUEST_GET_CURRENT_CALLS, result);

send(rr);

8. 接著RIL調(diào)用processSolicited處理RIL_REQUEST_GET_CURRENT_CALLS的返回結(jié)果

9. GsmCallTracker的handleMessage被觸發(fā),處理事件EVENT_POLL_CALLS_RESULT,調(diào)用函數(shù)

handlePollCalls

10. handlPollCalls 調(diào)用

phone.notifyNewRingingConnection(newRinging);

11. PhoneApp中創(chuàng)建CallNotifier

12. CallNotifier注冊(cè):

registerForNewRingingConnection ->mNewRingingConnectionRegistrants.addUnique(h, what, obj);

hardware 相關(guān)可以參考:Android2.2 RIL hardware 部分代碼簡(jiǎn)介

======================================================


Android phone app 默認(rèn)啟動(dòng)理解以及對(duì)Java端入口的分析


Android phone app 默認(rèn)的進(jìn)程是com.android.phone ,該進(jìn)程有個(gè)特性,當(dāng)你kill 它時(shí),它會(huì)重新在創(chuàng)建。很多人可能沒弄清為什么,它的運(yùn)行模式和其他app不同呢?以下我將個(gè)人的簡(jiǎn)單認(rèn)識(shí)稍未闡述下:

1、首先PhoneApp.apk 存放于System/app 目錄下,這決定了它擁有超于其他data/app 權(quán)限的能力。顯然是因?yàn)樗邢到y(tǒng)級(jí)的屬性。

2、其次在AndroidManifest.xml 中有以下描述:

   <application android:name="PhoneApp"

                android:persistent="true"

                android:label="@string/dialerIconLabel"

                 android:icon="@drawable/ic_launcher_phone">其中 android:persistent=”true”決定了它必須一只運(yùn)行,官方對(duì)該屬性的說明如下:

android:persistent

   Whether or not the application should remain running at all times —"true" if it should, and "false" if not. The default valueis "false". Applications should not normally set this flag;persistence mode is intended only for certain system applications.

以上兩部分內(nèi)容決定了com.android.phone,該進(jìn)程將一值存在于系統(tǒng)中。

默認(rèn)啟動(dòng)的App,沒有調(diào)用Activity,那它默認(rèn)的Java入口是那里?調(diào)用了什么類包?

Android 的應(yīng)用進(jìn)程都是fork出來的,而且fork出的進(jìn)程是直接進(jìn)入自己的事件循環(huán),拿個(gè)一般的App的啟動(dòng)流程來分析:

1、首先點(diǎn)擊一個(gè)并未啟動(dòng)的應(yīng)用Venus,這時(shí)它會(huì)先f(wàn)ork出一個(gè)進(jìn)程,然后進(jìn)入它自己的事件循環(huán)。

2、進(jìn)入事件循環(huán)的之后做的第一件事并不是為了做響應(yīng)點(diǎn)擊事件的處理,而是檢測(cè)該App是否有Application 的默認(rèn)入口,如上例子中的:android:name=”PhoneApp”就是Application 的入口類包名。有的話檢測(cè)該類是否繼承于Application, 沒有入口的話,進(jìn)入第三步

3、接著響應(yīng)點(diǎn)擊事件,ActivityManager 就找尋該應(yīng)用對(duì)應(yīng)的MainActivity入口,并創(chuàng)建該類.

總結(jié)PhoneApp 的Java端入口

以PhoneApp.java 類內(nèi)容來看

  1. package com.android.phone;  
  2.    
  3. import *****;  
  4.    
  5. /** 
  6.  * Top-level Application class for the Phone app. 
  7.  */  
  8. public class PhoneApp extends Application implements AccelerometerListener.OrientationListener {  
  9.     /* package */ static final String LOG_TAG = "PhoneApp";  
  10.    
  11.     private static PhoneApp sMe;  
  12.    
  13.     public PhoneApp() {  
  14.         sMe = this;  
  15.     }  
  16.    
  17.     static PhoneApp getInstance() {  
  18.         return sMe;  
  19.     }  
  20.    
  21. }  

以上面代碼來看,繼承于Application 的PhoneApp 當(dāng)作了phone進(jìn)程的入口。

   public PhoneApp() {

       sMe = this;

    }該方法說明繼承于Application的類,必須可以被外部實(shí)例, 實(shí)際上在啟動(dòng)過程中,如果有該入口,就是必須先實(shí)例該類的。Android 提供該部分接口,是為了有些應(yīng)用需要常駐內(nèi)存。這些應(yīng)用可能需要提供一些provider或service之類,但這些功能又必須先于Activity而存在,因而提供該入口讓java 的應(yīng)用有個(gè)類似于main函數(shù)的入口,做些初始化的工作。

  

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多