編輯:關於Android編程
Android中集結了大量的系統管家Manager:比如當你要kill一個後台Processes時候,你會用到ActivityManager;再比如你需要用到系統的聲音相關的你需要AudioManager等等。而且獲取這些管家對你來說很簡單,比如獲取一個ActivityManager,你只需要調用當前context的方法getSystemService就可以了:
final ActivityManager am = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE);
首先,我們知道Context是一個描述一個application的全局的資源和信息的。而Context其實是一個abstract的類,所以是不能直接用的,他的實現類其實是ContextImpl,看看androidd對ContextImpl一段原文介紹:
/** * Common implementation of Context API, which provides the base * context object for Activity and other application components. */
從上面的意思我們可以知道:ContextImpl其實就是context的實現,application的組件其實繼承於他的!所以要研究context,就是要研究ContextImpl。說道這裡好像有點跑題了,嘿嘿,下面繼續。
剛才說了,context的方法getSystemService可以獲取android系統當前使用的各個Manager,那我們來ContextImpl看看getSystemService在做什麼。
@Override public Object getSystemService(String name) { ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name); return fetcher == null ? null : fetcher.getService(this); }
這裡我們分兩點來看:
private static final HashMap SYSTEM_SERVICE_MAP = new HashMap();
SYSTEM_SERVICE_MAP存儲的這些ServiceFetcher值是什麼時候初始化的呢?我們後面再說。
(2)我們來看看ServiceFetcher到底是什麼?
/** * Main entrypoint; only override if you don't need caching. */ public Object getService(ContextImpl ctx) { ArrayList cache = ctx.mServiceCache; Object service; synchronized (cache) { if (cache.size() == 0) { // Initialize the cache vector on first access. // At this point sNextPerContextServiceCacheIndex // is the number of potential services that are // cached per-Context. for (int i = 0; i < sNextPerContextServiceCacheIndex; i++) { cache.add(null); } } else { service = cache.get(mContextCacheIndex); if (service != null) { return service; } } service = createService(ctx); cache.set(mContextCacheIndex, service); return service; } } /** * Override this to create a new per-Context instance of the * service. getService() will handle locking and caching. */ public Object createService(ContextImpl ctx) { throw new RuntimeException("Not implemented"); } }很簡單的一個static class,其中只有兩個方法getService和createService: 先來看看createService這個方法:改方法裡面沒有什麼實質的東西,重點我們看看這個方法上面的原文說明:說的很清楚這個方法其實是用來Override的,其目的就是創建一個服務Service. 再來看看getService,從這個方法可以知道:首先是看看ctx.mServiceCache裡面是否已經有了這個我們需要的服務Service,如果還沒有就調用createService來創建一個。 所以,ServiceFetcher很簡單,其實就是對服務Service為方便使用而對其的創建、取用的一個封裝類。 所以重點,我們還來到了是如何創建一個服務Service的。 很快,你就會發現在ContextImpl裡面有一段static代碼,其注冊了所有的服務Service: static { registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() { public Object getService(ContextImpl ctx) { return AccessibilityManager.getInstance(ctx); }}); registerService(ACCOUNT_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { IBinder b = ServiceManager.getService(ACCOUNT_SERVICE); IAccountManager service = IAccountManager.Stub.asInterface(b); return new AccountManager(ctx, service); }}); registerService(ACTIVITY_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler()); }}); ... } 裡面都從新了方法createService來創建新的服務對象。 我們最後看看registerService這個方法做了些什麼? private static void registerService(String serviceName, ServiceFetcher fetcher) { if (!(fetcher instanceof StaticServiceFetcher)) { fetcher.mContextCacheIndex = sNextPerContextServiceCacheIndex++; } SYSTEM_SERVICE_MAP.put(serviceName, fetcher); } SYSTEM_SERVICE_MAP.put(serviceName, fetcher);看到了嗎!其實就是講創建好的 ServiceFetcher 存儲在SYSTEM_SERVICE_MAP這個HashMap裡面了。 最後,我們來看都有那些Manager服務: 1. EntropyService 熵服務,周期性的加載和保存隨機信息。主要是linux開機後,/dev/random的狀態可能是可預知的,這樣一些需要隨機信息的應用程序就可能會有問題。這個無需提供應用程序接口。 2. PowerManagerService –> PowerManager Android 的電源管理也是很重要的一部分。比如在待機的時候關掉不用的設備,待機時屏幕和鍵盤背光的關閉,用戶操作的時候該打開多少設備等等。 3. ActivityManagerService->ActivityManager 這個是整個Android framework框架中最為核心的一個服務,管理整個框架中任務、進程管理, Intent解析等的核心實現。雖然名為Activity的Manager Service,但它管轄的范圍,不只是Activity,還有其他三大組件,和它們所在的進程。也就是說用戶應用程序的生命管理,都是由他負責的。 4. TelephonyRegistry->TelephonyManager 電話注冊、管理服務模塊,可以獲取電話的鏈接狀態、信號強度等等。<可以刪掉,但要看的大概明白> 5. PackageManagerService -> PackageManager 包括對軟件包的解包,驗證,安裝以及升級等等,對於我們現在不能安裝.so文件的問題,應該先從這塊著手分析原因。 6. AccountManagerService -> AccountManager A system service that provides account, password, and authtoken management for all accounts on the device。 7. ContentService -> ContentResolver 內容服務,主要是數據庫等提供解決方法的服務。 8. BatteryService 監控電池充電及狀態的服務,當狀態改變時,會廣播Intent 9. HardwareService 一般是ring和vibrate的服務程序 10. SensorService -> SensorManager 管理Sensor設備的服務,負責注冊client設備及當client需要使用sensor時激活Sensor 11. WindowManagerService -> WindowManager -> PhoneWindowManager 和ActivityManagerService高度粘合 窗口管理,這裡最核心的就是輸入事件的分發和管理。 12. AlarmManagerService -> AlarmManager 鬧鐘服務程序 13. BluetoothService -> BluetoothDevice 藍牙的後台管理和服務程序 14. StatusBarService -> StatusBarManager 負責statusBar上圖標的更新、動畫等等的服務,服務不大。 15. ClipboardService -> ClipboardManager 和其他系統的clipBoard服務類似,提供復制黏貼功過。 16. InputMethodManagerService -> InputMethodManager 輸入法的管理服務程序,包括何時使能輸入法,切換輸入法等等。 17. NetStatService 手機網絡服務 18. ConnectivityService -> ConnectivityManager 網絡連接狀態服務,可供其他應用查詢,當網絡狀態變化時,也可廣播改變。 19. AccessibilityManagerService-> AccessibilityManager 這塊可能要仔細看一下,主要是一些View獲得點擊、焦點、文字改變等事件的分發管理,對整個系統的調試、問題定位等,也需要最這個服務仔細過目一下。 20. NotificationManagerService -> NotificationManager 負責管理和通知後台事件的發生等,這個和statusbar膠黏在一起,一般會在statusbar上添加響應圖標。用戶可以通過這知道系統後台發生了什麼事情。 21. MountService 磁盤加載服務程序,一般要和一個linux daemon程序如vold/mountd等合作起作用,主要負責監聽並廣播device的mount/unmount/bad removal等等事件。 22. DeviceStorageMonitorService 監控磁盤空間的服務,當磁盤空間不足10%的時候會給用戶警告 23. LocationManagerService -> LocationManager 要加入GPS服務等,這部分要細看,現在應用中的navigation沒響應,可以從此處著手看一下 24. SearchManagerService -> SearchManager The search manager service handles the search UI, and maintains a registry of searchable activities. 25. Checkin Service(FallbackCheckinService) 貌似checkin service是google提供的包,沒有源代碼,源碼只有fallbackCheckinService 26. WallpaperManagerService -> WallpaperManager 管理桌面背景的服務,深度定制化桌面系統,需要看懂並擴展<同時要兼容>這部分 27. AudioService -> AudioManager AudioFlinger的上層管理封裝,主要是音量、音效、聲道及鈴聲等的管理 28. HeadsetObserver 耳機插拔事件的監控小循環 29. DockObserver 如果系統有個座子,當手機裝上或拔出這個座子的話,就得靠他來管理了 30. BackupManagerService -> BackupManager 備份服務 31. AppWidgetService -> AppWidgetManager Android可以讓用戶寫的程序以widget的方式放在桌面上,這就是這套管理和服務的接口 上一頁:Android 網絡訪問代理下一頁:android 獲取apk信息 關於Android編程 Android實現Gesture手勢識別用法分析 本文實例分析了Android實現Gesture手勢識別用法。分享給大家供大家參考。具體如下:很高興能在Android1.6的sdk看到手勢識別這一功能,之前一直在想,如何 2015年Android作品集 南周知道 要嚴肅,有知識;要八卦,有內幕。每天一篇,盡享你想知道的和不知道的,我們只想,讓知道成為一種享受。請記住知道,南方周末每日網絡專稿。 1.每天推送一篇你想知道的 Android筆記之:App調試的幾個命令的實踐與分析 在Android的應用開發中,我們會用到各種代碼調試;其實在Android的開發之後,我們可能會碰到一些隨機的問題,如cpu過高,內存洩露等,我們無法簡單的進行代碼調試, Android入門教程 fragment的使用 一 、為什麼要用fragment簡單來講,兩句話- 解決局部刷新問題- 一定程度解決屏幕適配問題二 、什麼是fragmentfragment直譯過來是“碎片& Android編程入門Android技術基礎Android資訊關於Android編程Android開發Android開發環境Android開發實例 相關文章 OPPO Find 5(X909)手動刷入recovery以及卡刷固件教程史上最詳解的華為Ascend G7升級刷機教程三星Galaxy Grand2 G7102安裝第三方recovery教程LG G3全系列機型Android L 5.0升級刷機教程華為P8 EMUI4.0 ROOT教程 華為P8 Android 6.0獲取超級權限方法索尼X Performance官方FTF固件rom包 強刷包下載索尼X Performance強刷官方FTF系統包的具體教程華為榮耀暢玩4C Android5.1 ROOT教程 榮耀暢玩4C獲取Android5.1的root權限努比亞N1官方rom刷機包 nubia N1原版系統升級包下載努比亞N1刷機教程 Nubia N1卡刷升級更新官方系統包努比亞N1 NX541J線刷刷機教程 Nubia N1 NX541J線刷救磚包安卓Android4.0刷機通用教程Android 安卓手機清理釋放內存空間技巧OPPO Find 5 完整使用小技巧 熱門文章 Android之Handler詳解 華為榮耀v8和小米5哪個好 華為榮耀v8和小米5詳細圖文對比 Android分包MultiDex源碼分析 Android.mk 基本應用 Android更新UI的四種方式 Android procrank查看內存使用情況 Android APP--兩個Activity傳遞數據 父Activity啟動子Activity,並且向其傳遞消息,子Activ Android tree應用框架 簡介一個好的Android應用開發框架,可以加快Android開發速度, 掌握CoordinatorLayout 原文鏈接Mastering the Coordinator Layout Android 自定義Activity基類 我們在開發App的時候有時候碰到多個界面有一個共同點的時候,比如,都有相 閱讀排行版 JS與Android互調 Android 實現酷炫的頂部欄 Android動畫之補間動畫(Tween Animation)基礎學習 Android學習筆記--如何修改SeekBar的樣式 android4.0 USB Camera實例(五補充)jpg壓縮 Android中View的炸裂特效實現方法詳解 android讀取assets中Excel表格並顯示 android使用handler ui線程和子線程通訊更新ui示例 Copyright © Android教程網 All Rights Reserved
先來看看createService這個方法:改方法裡面沒有什麼實質的東西,重點我們看看這個方法上面的原文說明:說的很清楚這個方法其實是用來Override的,其目的就是創建一個服務Service. 再來看看getService,從這個方法可以知道:首先是看看ctx.mServiceCache裡面是否已經有了這個我們需要的服務Service,如果還沒有就調用createService來創建一個。
所以,ServiceFetcher很簡單,其實就是對服務Service為方便使用而對其的創建、取用的一個封裝類。 所以重點,我們還來到了是如何創建一個服務Service的。
很快,你就會發現在ContextImpl裡面有一段static代碼,其注冊了所有的服務Service:
static { registerService(ACCESSIBILITY_SERVICE, new ServiceFetcher() { public Object getService(ContextImpl ctx) { return AccessibilityManager.getInstance(ctx); }}); registerService(ACCOUNT_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { IBinder b = ServiceManager.getService(ACCOUNT_SERVICE); IAccountManager service = IAccountManager.Stub.asInterface(b); return new AccountManager(ctx, service); }}); registerService(ACTIVITY_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler()); }}); ... }
SYSTEM_SERVICE_MAP.put(serviceName, fetcher);看到了嗎!其實就是講創建好的 ServiceFetcher 存儲在SYSTEM_SERVICE_MAP這個HashMap裡面了。 最後,我們來看都有那些Manager服務:
1. EntropyService 熵服務,周期性的加載和保存隨機信息。主要是linux開機後,/dev/random的狀態可能是可預知的,這樣一些需要隨機信息的應用程序就可能會有問題。這個無需提供應用程序接口。 2. PowerManagerService –> PowerManager Android 的電源管理也是很重要的一部分。比如在待機的時候關掉不用的設備,待機時屏幕和鍵盤背光的關閉,用戶操作的時候該打開多少設備等等。
3. ActivityManagerService->ActivityManager 這個是整個Android framework框架中最為核心的一個服務,管理整個框架中任務、進程管理, Intent解析等的核心實現。雖然名為Activity的Manager Service,但它管轄的范圍,不只是Activity,還有其他三大組件,和它們所在的進程。也就是說用戶應用程序的生命管理,都是由他負責的。 4. TelephonyRegistry->TelephonyManager 電話注冊、管理服務模塊,可以獲取電話的鏈接狀態、信號強度等等。<可以刪掉,但要看的大概明白>
5. PackageManagerService -> PackageManager 包括對軟件包的解包,驗證,安裝以及升級等等,對於我們現在不能安裝.so文件的問題,應該先從這塊著手分析原因。 6. AccountManagerService -> AccountManager A system service that provides account, password, and authtoken management for all accounts on the device。
7. ContentService -> ContentResolver 內容服務,主要是數據庫等提供解決方法的服務。 8. BatteryService 監控電池充電及狀態的服務,當狀態改變時,會廣播Intent
9. HardwareService 一般是ring和vibrate的服務程序 10. SensorService -> SensorManager 管理Sensor設備的服務,負責注冊client設備及當client需要使用sensor時激活Sensor
11. WindowManagerService -> WindowManager -> PhoneWindowManager 和ActivityManagerService高度粘合 窗口管理,這裡最核心的就是輸入事件的分發和管理。 12. AlarmManagerService -> AlarmManager 鬧鐘服務程序 13. BluetoothService -> BluetoothDevice 藍牙的後台管理和服務程序 14. StatusBarService -> StatusBarManager 負責statusBar上圖標的更新、動畫等等的服務,服務不大。
15. ClipboardService -> ClipboardManager 和其他系統的clipBoard服務類似,提供復制黏貼功過。 16. InputMethodManagerService -> InputMethodManager 輸入法的管理服務程序,包括何時使能輸入法,切換輸入法等等。 17. NetStatService 手機網絡服務 18. ConnectivityService -> ConnectivityManager 網絡連接狀態服務,可供其他應用查詢,當網絡狀態變化時,也可廣播改變。
19. AccessibilityManagerService-> AccessibilityManager 這塊可能要仔細看一下,主要是一些View獲得點擊、焦點、文字改變等事件的分發管理,對整個系統的調試、問題定位等,也需要最這個服務仔細過目一下。 20. NotificationManagerService -> NotificationManager 負責管理和通知後台事件的發生等,這個和statusbar膠黏在一起,一般會在statusbar上添加響應圖標。用戶可以通過這知道系統後台發生了什麼事情。
21. MountService 磁盤加載服務程序,一般要和一個linux daemon程序如vold/mountd等合作起作用,主要負責監聽並廣播device的mount/unmount/bad removal等等事件。
22. DeviceStorageMonitorService 監控磁盤空間的服務,當磁盤空間不足10%的時候會給用戶警告 23. LocationManagerService -> LocationManager 要加入GPS服務等,這部分要細看,現在應用中的navigation沒響應,可以從此處著手看一下
24. SearchManagerService -> SearchManager The search manager service handles the search UI, and maintains a registry of searchable activities. 25. Checkin Service(FallbackCheckinService) 貌似checkin service是google提供的包,沒有源代碼,源碼只有fallbackCheckinService
26. WallpaperManagerService -> WallpaperManager 管理桌面背景的服務,深度定制化桌面系統,需要看懂並擴展<同時要兼容>這部分 27. AudioService -> AudioManager AudioFlinger的上層管理封裝,主要是音量、音效、聲道及鈴聲等的管理
28. HeadsetObserver 耳機插拔事件的監控小循環 29. DockObserver 如果系統有個座子,當手機裝上或拔出這個座子的話,就得靠他來管理了
30. BackupManagerService -> BackupManager 備份服務 31. AppWidgetService -> AppWidgetManager Android可以讓用戶寫的程序以widget的方式放在桌面上,這就是這套管理和服務的接口
本文實例分析了Android實現Gesture手勢識別用法。分享給大家供大家參考。具體如下:很高興能在Android1.6的sdk看到手勢識別這一功能,之前一直在想,如何
南周知道 要嚴肅,有知識;要八卦,有內幕。每天一篇,盡享你想知道的和不知道的,我們只想,讓知道成為一種享受。請記住知道,南方周末每日網絡專稿。 1.每天推送一篇你想知道的
在Android的應用開發中,我們會用到各種代碼調試;其實在Android的開發之後,我們可能會碰到一些隨機的問題,如cpu過高,內存洩露等,我們無法簡單的進行代碼調試,
一 、為什麼要用fragment簡單來講,兩句話- 解決局部刷新問題- 一定程度解決屏幕適配問題二 、什麼是fragmentfragment直譯過來是“碎片&
父Activity啟動子Activity,並且向其傳遞消息,子Activ
簡介一個好的Android應用開發框架,可以加快Android開發速度,
原文鏈接Mastering the Coordinator Layout
我們在開發App的時候有時候碰到多個界面有一個共同點的時候,比如,都有相