一、簡析HAL結構
HAL是一個位于作業系統和驅動程式之上,運行在用戶空間中的服務程式, 目的:對上層應用提供一個統一的查詢硬體設備的介面, 好處:簡化了應用程式查詢硬體的邏輯 注意:HAL所謂的抽象不提供對硬體的實際操作,對硬體的操作仍然由具體的驅動程式來完成,
1.android為什么引入HAL
由于安卓是基于Linux內核進行開發,而linux內核使用GPL許可證,這就要求,使用到這個許可證的軟體,對開源軟體的任何修改擴充都必須開源,如果引入了HAL,就可以讓android系統層和內核靠HAL隔離開,而HAL是遵循APL許可證,這個就不要求,使用了開源軟體的修改必須開源的準則,所以能保證一些開發者的利益,
2.android中HAL運行結構
RIL(Radio Interface Layer 無線通信介面層 HAL Stub運行原理:上層呼叫底層,通過底層HAL提供的函式,而底層在處理完上層請求后或硬體狀態發生變化的時候回呼上層,而通過Runtime提供的callback介面完成, Hal Stub有一種包含關系,也就是HAL里包含了很多Stub,Runtime只要說明請求型別,就可以取得并操作Stub對應的operations方法,其實作都是在hardware.c和hardware.h中,實質是通過dlopen方法加載.so元件,從而呼叫*.so里的符號實作,
二、深入決議通話流程
AndoridTelephony主要包括四個方面的手機通信能力: ServiceState/SIM(網路服務,包好SIM) Call(通話能力) DataCall(移動資料上網能力) SMS/MMS(短信/彩信能力)
1.點擊撥號盤
原理:ActivityManagerService見啟動com.android.dialer包下的DialtactsActivity將啟動com.android.dialer包下的DialtactsActivity 安卓在線代碼https://www.androidos.net.cn/android/10.0.0_r6/xref/packages/apps/Dialer/java/com/android/dialer/app
@DialtactsActivity
.......
## 省略上面的代碼
@Override
protected void onCreate(Bundle savedInstanceState) {
Trace.beginSection(TAG + " onCreate");
LogUtil.enterBlock("DialtactsActivity.onCreate");
super.onCreate(savedInstanceState);
firstLaunch = true;
isLastTabEnabled =
ConfigProviderComponent.get(this).getConfigProvider().getBoolean("last_tab_enabled", false);
........
# 根據layout中的你的id來注冊這個按鈕
FloatingActionButton floatingActionButton = findViewById(R.id.floating_action_button);
floatingActionButton.setOnClickListener(this);
floatingActionButtonController = new FloatingActionButtonController(this, floatingActionButton);
...........
# 查看DialtacksActivity類的onClick方法
private void showDialpadFragment(boolean animate) {
...........
final FragmentTransaction ft = getFragmentManager().beginTransaction();
if (dialpadFragment == null) {
dialpadFragment = new DialpadFragment();
ft.add(R.id.dialtacts_container, dialpadFragment, TAG_DIALPAD_FRAGMENT);
} else {
ft.show(dialpadFragment);
}
..........
setTitle(R.string.launcherDialpadActivityLabel);
}
原來點擊撥號盤浮動按鈕,彈出撥號盤對應的代碼是DialpadFragment.java,地址:https://www.androidos.net.cn/android/10.0.0_r6/xref/packages/apps/Dialer/java/com/android/dialer/dialpadview/DialpadFragment.java
@DialpadFragment
..........
@Override
public void onClick(View view) {
int resId = view.getId();
if (resId == R.id.dialpad_floating_action_button) {
view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
handleDialButtonPressed();
} else if (resId == R.id.deleteButton) {
keyPressed(KeyEvent.KEYCODE_DEL);
} else if (resId == R.id.digits) {
if (!isDigitsEmpty()) {
digits.setCursorVisible(true);
}
} else if (resId == R.id.dialpad_overflow) {
overflowPopupMenu.show();
} else {
LogUtil.w("DialpadFragment.onClick", "Unexpected event from: " + view);
}
}
撥號盤里面的邏輯 未完待續
三、原始碼:
CSDN:https://blog.csdn.net/weixin_44630050 博客園:https://www.cnblogs.com/ruigege0000/ 歡迎關注微信公眾號:傅里葉變換,個人賬號,僅用于技術交流
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/280624.html
標籤:其他
上一篇:【Android】AES加密演算法的Android實作
下一篇:Fragment使用(上)
