1. 程式人生 > >[android-telephony]Android_Telephony(基於N&&O版本)模組介紹

[android-telephony]Android_Telephony(基於N&&O版本)模組介紹

1.在啟動系統一些服務的時候會執行一個startOtherServices的方法

frameworks/base/services/java/com/android/server/SystemServer.java

{

    try {

            Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER,"StartServices");

            startBootstrapServices();

            startCoreServices();

            startOtherServices();

        }catch (Throwable ex) {

            Slog.e("System","******************************************");

            Slog.e("System","************ Failure starting system services", ex);

throw ex;

        }finally {

            Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);

        }

}

2.startOtherServices方法內會啟動TelecomLoaderService

mSystemServiceManager.startService(TelecomLoaderService.class);

-------------------------------------------------------------------------------------------------------------------->

frameworks/base/services/core/java/com/android/server/telecom/TelecomLoaderService.java

/**

 * Starts thetelecom component by binding to its ITelecomService implementation. Telecom is setup

 * to run in the system-server process so once it is loaded into memory it will stay running.

 *@hide

 */

publicclass TelecomLoaderServiceextends SystemService {

@Override

publicvoid onBootPhase(int phase) {

if (phase == PHASE_ACTIVITY_MANAGER_READY) {

            registerDefaultAppNotifier();

            registerCarrierConfigChangedReceiver();

            connectToTelecom();

        }

    }

}

3.主要看connectToTelecom

privatevoid connectToTelecom() {

synchronized (mLock) {

if (mServiceConnection !=null) {

//TODO: Is unbinding worth doing or wait for system to rebind?

mContext.unbindService(mServiceConnection);

mServiceConnection =null;

            }

   TelecomServiceConnection serviceConnection =new TelecomServiceConnection();

            Intent intent =new Intent(SERVICE_ACTION);

            intent.setComponent(SERVICE_COMPONENT);

int flags = Context.BIND_IMPORTANT | Context.BIND_FOREGROUND_SERVICE

                    | Context.BIND_AUTO_CREATE;

// Bind to Telecom and register the service

if (mContext.bindServiceAsUser(intent, serviceConnection, flags, UserHandle.SYSTEM)) {

mServiceConnection = serviceConnection;

            }

        }

    }

4.而SERVICE_COMPONENT為

privatestaticfinal ComponentNameSERVICE_COMPONENT =new ComponentName(

"com.android.server.telecom",

"com.android.server.telecom.components.TelecomService");

這樣就綁定了TelecomService服務

5.

------------------------------------------------------------------->

packages/services/Telecomm/src/com/android/server/telecom/components/TelecomService.java

    @Override

public IBinder onBind(Intent intent) {

        Log.d(this,"onBind");

        initializeTelecomSystem(this);

synchronized (getTelecomSystem().getLock()) {

return getTelecomSystem().getTelecomServiceImpl().getBinder();

        }

    }

initializeTelecomSystem裡主要生成一個單例TelecomSystem

if (TelecomSystem.getInstance() == null) {

            TelecomSystem.setInstance(

new TelecomSystem(。。。)...

------------------------------------------------------------------->

TelecomSystem的構造方法內會生成TeleCom的很多例項類並儲存到 TelecomServiceImpl類中

{

mPhoneAccountRegistrar =new PhoneAccountRegistrar(mContext);

 BluetoothManager bluetoothManager =new BluetoothManager(mContext,

new BluetoothAdapterProxy());

  WiredHeadsetManager wiredHeadsetManager =new  WiredHeadsetManager(mContext);

mMissedCallNotifier = missedCallNotifierImplFactory

                .makeMissedCallNotifierImpl(mContext,mPhoneAccountRegistrar);

        DefaultDialerManagerAdapter defaultDialerAdapter =

new TelecomServiceImpl.DefaultDialerManagerAdapterImpl();

mCallsManager =new CallsManager(

….........

mTelecomServiceImpl =new TelecomServiceImpl(...

}

而在mTelecomServiceImpl類中有ITelecomService的例項

privatefinal ITelecomService.StubmBinderImpl =new ItelecomService.Stub()

所以在 TelecomLoaderService繫結完TelecomService後 返回的是mBinderImpl

返回後會通過如下方法新增到系統服務類

ServiceManager.addService(Context.TELECOM_SERVICE, service);

所以上層可以通過mContext.getSystemService(Context.TELECOM_SERVICE)呼叫TelecomServiceImpl類呼叫相關介面

------------------------------------------------------------------->

packages/services/Telecomm/src/com/android/server/telecom/CallsManager.java

在生成TelecomServiceImpl中的時候 有一個很重要的類建立new CallsManager

CallsManager的構造方法內會儲存很多監聽器用來控制撥打電話和來電和CallLog等電話邏輯操作的監聽器

{

mListeners.add(mInCallWakeLockController);

mListeners.add(statusBarNotifier);

mListeners.add(mCallLogManager);

mListeners.add(mPhoneStateBroadcaster);

mListeners.add(mInCallController);

mListeners.add(mCallAudioManager);

mListeners.add(missedCallNotifier);

mListeners.add(mHeadsetMediaButton);

mListeners.add(mProximitySensorManager);

}

{

privatefinal Set<CallsManagerListener>mListeners = Collections.newSetFromMap(

new ConcurrentHashMap<CallsManagerListener, Boolean>(16, 0.9f, 1));

}

------------------------------------------------------------------->

packages/services/Telephony/src/com/android/phone/PhoneApp.java

前面講完了如何啟動TelecomService的流程 現在講一下Telephony流程 在系統載入Telecom.apk的時候 會執行PhoneApp

/**

 * Top-level Application class for the Phone app.

 */

publicclass PhoneAppextends Application {

    PhoneGlobalsmPhoneGlobals;

    TelephonyGlobalsmTelephonyGlobals;

@Override

publicvoid onCreate() {

if (UserHandle.myUserId() == 0) {

// We are running as the primary user, so should bring up the

// global phone state.

mPhoneGlobals =new PhoneGlobals(this);

mPhoneGlobals.onCreate();

mTelephonyGlobals =new TelephonyGlobals(this);

mTelephonyGlobals.onCreate();//和PhoneAccountHandle賬戶管理有關

        }

    }

------------------------------------------------------------------->

這裡主要講下mPhoneGlobals.onCreate方法

frameworks/opt/telephony/src/java/com/android/internal/telephony/PhoneFactory.java

makeDefaultPhone

{

     for (int i = 0; i < numPhones; i++) {

// reads the system properties and makes commandsinterface

// Get preferred network type.

         //先獲取配置的手機支援網路型別

         networkModes[i] = RILConstants.PREFERRED_NETWORK_MODE;

 //intPREFERRED_NETWORK_MODE      =         //SystemProperties.getInt("ro.telephony.default_network",

//            NETWORK_MODE_WCDMA_PREF);

                    Rlog.i(LOG_TAG,"Network Mode set to " + Integer.toString(networkModes[i]));

sCommandsInterfaces[i] = new RIL(context, networkModes[i],

                            cdmaSubscription, i);

                }

//初始化SubscriptionController

SubscriptionController.init(context,sCommandsInterfaces);

// Instantiate UiccController so that all other classes can just

// call getInstance()

//初始化SIM卡框架

sUiccController = UiccController.make(context, sCommandsInterfaces);

//生成Phone物件

for (int i = 0; i < numPhones; i++) {

          Phone phone =null;

int phoneType = TelephonyManager.getPhoneType(networkModes[i]);

if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {

                        phone =new GsmCdmaPhone(context,

sCommandsInterfaces[i],sPhoneNotifier, i,

                                PhoneConstants.PHONE_TYPE_GSM,

                                TelephonyComponentFactory.getInstance());

                    }elseif (phoneType == PhoneConstants.PHONE_TYPE_CDMA) {

                        phone =new GsmCdmaPhone(context,

相關推薦

[android-telephony]Android_Telephony(基於N&&O版本)模組介紹

1.在啟動系統一些服務的時候會執行一個startOtherServices的方法 frameworks/base/services/java/com/android/server/SystemServer.java {     try {             Trace.traceBegin(

解決用Android N編譯版本引起的android.os.FileUriExposedException

          app一般都有檢測新版本自動升級的功能, 一但使用Android NSDK版本來編譯, app啟動安裝新apk的時候會出來FileUriExposedException, 我們需要做的是:  

Android O版本如何在userdebug 版本上remount

[DESCRIPTION] 在需要對image檔案(如system.img)等進行解壓->修改->打包->燒錄後,可能會出現無法開機的現象。 [SOLUTION] 這個問題主要是受到了VERITY的影響。 解決的方法有兩種: 一.在燒

android telephony模組——serviceStateTracker

學習android telephony模組最為重要的是學會處理流程,這是ServiceStateTracker裡面的一小部分的時序圖 serviceStateTracker.java的功能是去獲取網路服務狀態,包括運營商的資訊,資料服務,通話服務,以及網路

Android O版本特性

Android O Oreo重點 電池續航能力、速度和安全,讓使用者更好地控制各種應用程式。 通過對安卓6(棉花糖)、安卓7(牛軋糖)的改進,谷歌正慢慢讓安卓系統向競爭對手蘋果的iOS靠攏,加

Android藍芽開發與藍芽模組進行通訊(基於eclipse)

public class ComminuteActivity extends Activity { private BluetoothReceiver receiver; private BluetoothAdapter bluetoothAdapter; private Lis

Android SDK Manager僅有一個版本的問題

google devtools 多版本 blog system ges 虛擬 eclipse 記事本 搭建好MonkeyRunner的環境之後,建立虛擬器的時候發現SDK的管理器中只有4.3的版本,查閱了一下百度,問題解決如下: (1)在c:\Windows\System3

[轉]關於sdk更新Android SDK Tools 25.3.1版本後使用sdk manager閃退

art 運行 ted studio 令行 最新 pro vdma log 昨天這兩個manager還工作正常,今天更新了一下,發現不可用了,運行avd manager和sdk manager沒反應,搜了好多文章,然後看到了下這篇文章《關於sdk更新Android SDK T

Spring Security 集成 CAS(基於HTTP協議版本)

可能 key 1.3 remove gin repo produce writing monit Spring Security 集成 CAS(基於HTTP協議版本) 近段時間一直研究Spring Security 集成 CAS,網上資料相關資料也很多,不過大都是基於Htt

基於NFS v4版本搭建NFS服務器

基於nfs v4版本搭建nfs服務器基於NFS v4版本搭建NFS服務器1資源規劃作用IP版本NFS服務端192.168.78.1Centos6.5 64位NFS客戶端192.168.78.1Centos6.5 64位 2 NFS服務端安裝配置2.1 安裝rpm包 yum install nfs-u

android studio 開發中啟動android項目報錯sdk版本不一致解決方案

技術分享 發現 依賴 adl 目的 clas studio ima 需要 安卓項目開發中新建項目後再run‘的時候發現報錯com.android.support:appcompat-v7依賴報錯 查看下build.gredle所配置的參數: 打開項目的bui

o(1), o(n), o(logn), o(nlogn)算法復雜度

二分查找 post 數據大小 log 規模 目標 查找 空間復雜度 還要 在描述算法復雜度時,經常用到o(1), o(n), o(logn), o(nlogn)來表示對應算法的時間復雜度, 這裏進行歸納一下它們代表的含義: 這是算法的時空復雜度的表示。不僅僅用於表示時間復雜

java10:基於時間的版本控制

取代 spa 兼容 才會 語言 遞增 如果 靈活 改進 功能發布 從Java 10開始,采用了一種新的嚴格的基於時間的發布模式。 在這個新模型中,Java平臺的主要版本(現稱為功能版本)將每6個月(3月和9月)發布一次。 功能版本將包含語言功能,JVM功能和新的改進的API

Android GreenDao 深查詢 n:m 的關系

適合 oid == sta link png getc 可能 圖片 在我的應用程序這樣設計的關系:和我想選擇至少一個用戶作為一個朋友的所有聊天。 基本上,我想要執行以下查詢:\ SELECT c.* FROM CHAT c, USER u, UserChats uc

springcloud的Hystrix turbine斷路器聚合監控實現(基於springboot2.02版本

events 單個 res source IE lease ans discover www 本文基於方誌朋先生的博客實現:https://blog.csdn.net/forezp/article/details/70233227 一、準本工作 1、工具:Idea,JD

Android Studio配置統一管理依賴版本號引用

ext net image libs 文章 studio depend run o-c 版權聲明:本文為HaiyuKing原創文章,轉載請註明出處! 前言 本Demo采用的是其中一個方案,其他方案請閱讀參考資料《Android Studio中統一管理版本號引用配置》

【書摘】一種基於Git的版本管理方案

功能 前端 需要 bug evel 熱修復 per person feature 本篇摘錄自《前端工程化體系設計與實踐》一書,筆者認為是一套相對合理的方案,建議團隊可以根據實際情況進行調整並增加協作命名規範。 master分支——主分支 存儲已發布版本的源碼,不能在此

Android MediaPlayer SeekTo 在 8.0 版本上優化說明

data overhead from lar ide mes ace chan policy android使用 mediaPlayer 播放video視頻過程中, 當用戶退出當前播放,再從後臺恢復播放時,需要跳轉到之前退出的時間點繼續播放。使用的方法基本都是 SeekTo

o(1), o(n), o(logn), o(nlogn)

目標 可能 時也 並排 表數據 歸納 常見 targe 時空 原文地址:https://blog.csdn.net/Mars93/article/details/75194138 作者:Mars93 在描述算法復雜度時,經常用到o(1), o(n), o(logn), o(

c++ 網絡編程(四)TCP/IP LINUX/windows下 socket 基於I/O復用的服務器端代碼 解決多進程服務端創建進程資源浪費問題

linux系統中 cin 通過 sel print 大小 查看 服務 集合 原文作者:aircraft 原文鏈接:https://www.cnblogs.com/DOMLX/p/9613861.html 好了,繼上一篇說到多進程服務端也是有缺點的,每創建一個