[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 好了,繼上一篇說到多進程服務端也是有缺點的,每創建一個