android源码settings中显示所有正在运行进程流程分析
下面我要分享一下這幾天看源碼中獲得正在運行進程的簡單流程:
也就是圖中所看到的
首先我們看到的是settings下的application(應用程序)下的manageApplication(管理應用程序)下的頁面,那么要了解其流程,我們就得到源碼中去分析:
那么我們到源碼下的package/app/Settings/src/com/Android/settings下去找相關代碼,首先我們根據名稱大概可以找到ApplicationSettings.java文件,這個顯而易見
并且它加載了application_settings.xml文件,當然在application_settings.xml文件中我們也能找到管理應用程序的組件:
<PreferenceScreen
??????????? android:title="@string/manageapplications_settings_title"
??????????? android:summary="@string/manageapplications_settings_summary">
??????? <intent android:action="android.intent.action.MAIN"
??????????????? android:targetPackage="com.android.settings"
??????????????? android:targetClass="com.android.settings.ManageApplications" />
??? </PreferenceScreen>
但是在ApplicationSettings.java文件中卻找不到關于管理應用程序的組件的相關代碼和實現的功能,因此我們再去找下有那個文件是管理應用程序相關代碼和實現的功能,
當然我們能找到,那就是ManagerApplication.java文件,從圖形界面中我們可以看到在頂端是由一個TabHost,所以我們就到文件中去找這個TabHost:
因此我們在Oncreate方法中找到了:
?????????????????????? ................
?mStorageChartLabel = (TextView)mListContainer.findViewById(R.id.storageChartLabel);
??????? mUsedStorageText = (TextView)mListContainer.findViewById(R.id.usedStorageText);
??????? mFreeStorageText = (TextView)mListContainer.findViewById(R.id.freeStorageText);
??????? mRunningProcessesView = (RunningProcessesView)mRootView.findViewById(
??????????????? R.id.running_processes);
??????? final TabHost tabHost = getTabHost();
??????? tabHost.addTab(tabHost.newTabSpec(TAB_DOWNLOADED)
??????????????? .setIndicator(getString(R.string.filter_apps_third_party),
??????????????????????? getResources().getDrawable(R.drawable.ic_tab_download))
??????????????? .setContent(this));
??????? tabHost.addTab(tabHost.newTabSpec(TAB_ALL)
??????????????? .setIndicator(getString(R.string.filter_apps_all),
??????????????????????? getResources().getDrawable(R.drawable.ic_tab_all))
??????????????? .setContent(this));
??????? tabHost.addTab(tabHost.newTabSpec(TAB_SDCARD)
??????????????? .setIndicator(getString(R.string.filter_apps_onsdcard),
??????????????????????? getResources().getDrawable(R.drawable.ic_tab_sdcard))
??????????????? .setContent(this));
??????? tabHost.addTab(tabHost.newTabSpec(TAB_RUNNING)
??????????????? .setIndicator(getString(R.string.filter_apps_running),
??????????????????????? getResources().getDrawable(R.drawable.ic_tab_running))
??????????????? .setContent(this));
??????? tabHost.setCurrentTabByTag(defaultTabTag);
??????? tabHost.setOnTabChangedListener(this);
???????????????????? .......................
在界面中其實是由菜單鍵的,這我們知道,因此在其中我們可以找到?onCreateOptionsMenu(Menu menu) 方法創建菜單,onPrepareOptionsMenu準備菜單
以及相應菜單方法onOptionsItemSelected(MenuItem item) ,而在相應菜單中當我們是點擊正在運行的子TabHost時,它的菜單項有兩個,一個是顯示service,一個是顯示
緩存的進程:
???????????????????????????? .............................
else if (menuId == SHOW_RUNNING_SERVICES) {
??????????? mRunningProcessesView.mAdapter.setShowBackground(false);
??????? } else if (menuId == SHOW_BACKGROUND_PROCESSES) {
??????????? mRunningProcessesView.mAdapter.setShowBackground(true);
??????? }
???????????????????????? .....................................
因為主要將的是獲取正在運行的進程,所以其它三個子TabHost就不講了,感興趣的自己去分析吧,
那么顯然這兩個子菜單顯示的不一樣,但是無論點擊那一個子菜單都會調用setShowBackground(。。。)方法。當menuId == SHOW_RUNNING_SERVICES時顯示的是
service,那么我們就跟蹤代碼下
去,mRunningProcessesView.mAdapter.setShowBackground(false),調用RunningProcessView.java中的setShowBackground(boolean showBackground) 方法
在setShowBackground中又調用了refreshItems()方法,我們看一看 :
void refreshItems() {
?? ????? //mState.getCurrentBackgroundItems() is get cache process
?? ??? ??? ?//mState.getCurrentMergedItems() is get services?? ??? ?
??????????? ArrayList<RunningState.MergedItem> newItems =
??????????????? mShowBackground ? mState.getCurrentBackgroundItems()
??????????????????????? : mState.getCurrentMergedItems();
?? ??? ??
?? ??? ? //for(int i=0;i< mState.mBackgroundItems.size();i++)
?? ??? ??? ??? // Log.i("processName","processName"+ mState.mBackgroundItems.get(i));
?? ???? // Log.i("number","number="+ mState.getCurrentBackgroundItems().size());
??????????? if (mItems != newItems) {
??????????????? mItems = newItems;
??????????? }
??????????? if (mItems == null) {
??????????????? mItems = new ArrayList<RunningState.MergedItem>();
??????????? }
??????? }
根據mShowBackground的值,也就是mRunningProcessesView.mAdapter.setShowBackground(false)中傳下來的這個boolean值來判斷是顯示service還是
進程。
mState.getCurrentBackgroundItems()是得到緩存進程的列表,而mState.getCurrentMergedItems() 是得到services的列表,并且他們都是來自RunningStatus.java:
???????????? ..................................
? ArrayList<MergedItem> getCurrentMergedItems() {
??????? synchronized (mLock) {
??????????? return mMergedItems;
??????? }
??? }
??? ArrayList<MergedItem> getCurrentBackgroundItems() {
??????? synchronized (mLock) {
??????????? return mBackgroundItems;
??????? }
??????????????? .................................
那么我就來看一看怎樣得到mMergedItems和mBackgroundItems的兩個list:
我們可以發現在一開是就定義了
ArrayList<MergedItem> mMergedItems = new ArrayList<MergedItem>();
?ArrayList<MergedItem> mBackgroundItems = new ArrayList<MergedItem>();
而且在private boolean update(Context context, ActivityManager am) 方法中去得到它們(具體的在這個方法中,自己仔細分析吧,我自己有也看得暈暈的):
在private boolean update(Context context, ActivityManager am) 方法中有得到當前的正在運行的服務和進程:
..........................
List<ActivityManager.RunningServiceInfo> services?
??????????????? = am.getRunningServices(MAX_SERVICES);
.............................
.............................
?List<ActivityManager.RunningAppProcessInfo> processes
??????????????? = am.getRunningAppProcesses();
........................
那么在這里就必須要提一下ActivityManager了(framework/base/core/java/android/app/ActivityManager.java):
ActivityManager是android框架的一個重要部分,它負責一新ActivityThread進程創建,Activity生命周期的維護,
它提供了我們管理Activity的一些基本的方法
如下:
??????? public void testgetRecentTasks()
??????????????? //獲取最近的應用,最后啟動的排前
??????? public void testgetRunningTasks()
??????????????? //獲取當前運行的Activity應用
??????? public void testgetRunningServices()
??????????????? //獲取當前運行的service應用
??????? public void testgetRunningAppProcesses()
??????????????? //獲取所用系統運行的進程
當然我們所講的獲取系統運行的進程和運行的service應用都是來自ActivityManager這個類中的方法,而且在長按home鍵顯示最近使用的應用程序也是
使用ActivityManager類中的獲取最近使用的應用程序getRecentTasks()方法。
原文地址:http://blog.csdn.net/xiaxiangnanxp1989/article/details/8290944
總結
以上是生活随笔為你收集整理的android源码settings中显示所有正在运行进程流程分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android中的ClassLoader
- 下一篇: android settings源代码分