① 小米平板充電顯示android
小米手機本來就是Android手機。因為小米使用的MIUI就是基於Android系統而來的。
在重啟、開機、刷機等操作的時候,就會出現Android。這個是很正常的情況。
不過如果是屏幕上出現Android,而且一直就是這樣的話,就是說,你的手機系統出問題了。
不是刷機出現問題就是系統故障了。
建議是嘗試強制關機後刷完整的官方ROM。或者尋求小米客服的幫助。
小米手機系統是MIUI系統
什麼是MIUI?
MIUI 基於Android2.3原生系統深度開發擁有智能手機中最好用的電話及簡訊使用體驗針對中國用戶使用習慣,原創特色的全套UI體系。就是基於安卓系統的優化版本,裡面內置了很多我們習慣用的東西,特別是V4系統,就連LBE大師的基本功能都加進了系統,使系統本身就有主動防禦的功能,比較強大
② Android 從點擊應用圖標到界面顯示的過程
[轉] 一篇文章看明白 Android 從點擊應用圖標到界面顯示的過程 (遵循CC 4.0 BY-SA版權協議)
從點擊桌面應用圖標到應用顯示的過程我們再熟悉不過了,下面我們來分析下這個過程都做了什麼。
本文主要對以下問題分析:
如不了解 Android 是如何從開機到 Launcher 啟動的過程,請先閱讀 Android - 系統啟動過程
我們知道 Android 系統啟動後已經啟動了 Zygote,ServiceManager,SystemServer 等系統進程;ServiceManager 進程中完成了 Binder 初始化;SystemServer 進程中 ActivityManagerService,WindowManagerService,PackageManagerService 等系統服務在 ServiceManager 中已經注冊;最後啟動了 Launcher 桌面應用。
其實 Launcher 本身就是一個應用程序,運行在自己的進程中,我們看到的桌面就是 Launcher 中的一個 Activity。
應用安裝的時候,通過 PackageManagerService 解析 apk 的 AndroidManifest.xml 文件,提取出這個 apk 的信息寫入到 packages.xml 文件中,這些信息包括:許可權、應用包名、icon、apk 的安裝位置、版本、userID 等等。packages.xml 文件位於系統目錄下/data/system/packages.xml。
同時桌面 Launcher 會為安裝過的應用生成不同的應用入口,對應桌面上的應用圖標,下面分析點擊應用圖標的到應用啟動的過程。
點擊 Launcher 中應用圖標將會執行以下方法
在 system_server 進程中的服務端 ActivityManagerService 收到 START_ACTIVITY_TRANSACTION 命令後進行處理,調用 startActivity() 方法。
從 Launcher 點擊圖標,如果應用沒有啟動過,則會 fork 一個新進程。創建新進程的時候,ActivityManagerService 會保存一個 ProcessRecord 信息,Activity 應用程序中的AndroidManifest.xml 配置文件中,我們沒有指定 Application 標簽的 process 屬性,系統就會默認使用 package 的名稱。每一個應用程序都有自己的 uid,因此,這里 uid + process 的組合就可以為每一個應用程序創建一個 ProcessRecord。每次在新建新進程前的時候會先判斷這個 ProcessRecord 是否已存在,如果已經存在就不會新建進程了,這就屬於應用內打開 Activity 的過程了。
進程創建成功切換至 App 進程,進入 app 進程後將 ActivityThread 類載入到新進程,並調用 ActivityThread.main() 方法
此時只創建了應用程序的 ActivityThread 和 ApplicationThread,和開啟了 Handler 消息循環機制,其他的都還未創建, ActivityThread.attach(false) 又會最終到 ActivityMangerService 的 attachApplication,這個工程其實是將本地的 ApplicationThread 傳遞到 ActivityMangerService。然後 ActivityMangerService 就可以通過 ApplicationThread 的代理 ApplicationThreadProxy 來調用應用程序 ApplicationThread.bindApplication,通知應用程序的 ApplicationThread 已和 ActivityMangerService 綁定,可以不藉助其他進程幫助直接通信了。此時 Launcher 的任務也算是完成了。
在 system_server 進程中的服務端 ActivityManagerService 收到 ATTACH_APPLICATION_TRANSACTION 命令後進行處理,調用 attachApplication()。
發送送完 SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION 命令,還會發送 BIND_APPLICATION_TRANSACTION 命令來創建 Application。
在 app 進程中,收到 BIND_APPLICATION_TRANSACTION 命令後調用 ActivityThread.bindApplication()。
ApplicationThreadProxy.bindApplication(…) 會傳來這個應用的一些信息,如ApplicationInfo,Configuration 等,在 ApplicationThread.bindApplication 里會待信息封裝成AppBindData,通過
將信息放到應用里的消息隊列里,通過 Handler 消息機制,在 ActivityThread.handleMeaasge 里處理 H.BIND_APPLICATION 的信息,調用 AplicationThread.handleBindApplication。
Instrumentation:
這時 Application 就創建好了,這點很重要,很多資料里說 Application 是在performLaunchActivity() 里創建的,因為 performLaunchActivity() 也有mInstrumentation.newApplication 這個調用,newApplication() 函數中可看出會先判斷是否以及創建了 Application,如果之前已經創建,就返回已創建的 Application 對象。
上面 fork 進程時會發送 SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION 命令,在 app 進程中,收到 SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION 命令後調用 ApplicationThread.scheleLaunchActivity()。
與 Window 進行關聯,具體過程詳見: Activity,Window,View 之間的關系
Activity 的整體啟動流程如圖所示:
③ 如何讓Android設備實現息屏顯示
什麼是息屏顯示?
息屏顯示就是手機在息屏狀態下,屏幕上會顯示當前時間、日期信息,無需點亮手機屏幕即可查看。息屏顯示的原理主要是利用了OLED屏幕像素點自發光的特性,僅顯示時間的像素點發光,功耗相比LCD屏幕要低很多。
玩過Android源碼的同學應該知道,在Settings里有一個開關項:
既然知道主動顯示開關是放在設置裡面的,那不妨先從Settings的源碼看起,首先找到主動顯示對應的Preference,
然後發現在AmbientDisplaySettings里注冊了一些controller,
先關注裡面的兩個:和,看名字大概能知道,第一個與通知有關,應該是上文提到的息屏後來通知才顯示;而第二個就是我們要找的「始終開啟」。
:
分析的源碼發現,AlwaysOn的enable和available狀態都需要通過AmbientDisplayConfiguration 這個類來獲得,並且這個類位於framework中。
簡單介紹下AmbientDisplayConfiguration 中與alwaysOn有關的幾個函數:
alwaysOnAvailable 為true需要同時滿足兩個條件:
alwaysOnEnabled 為true需要同時滿足三個條件:
原來源碼裡面默認把AlwaysOn功能給關閉了,如果想啟用這個功能,需要修改config.xml里的兩個值或者強制alwaysOnAvailable返回true,修改後設置里的主動顯示一欄就會多出一項「始終開啟」可以勾選,這樣一來我們的設備在息屏之後就能自動開啟主動顯示功能了。
以上源碼均取自Android O