下面我要分享一下这几天看源码中获得正在运行进程的简单流程:

也就是图中所看到的

首先我们看到的是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中显示所有正在运行进程流程分析相关推荐

  1. 【Android】Source Insight 基本用法 ( 导入 Android 源码 | 设置字体 | 显示行号 | 搜索功能 | 快捷键设置 )

    文章目录 一.导入 Android 源码 二.配置字体 三.显示行号 四.Tab 键字符个数 五.搜索功能 六.打开文件列表 七.快捷键设置 在 [Android 系统开发]使用 Source InS ...

  2. android源码编译中的duplicate R.java的问题

    首先是问题的描述:在改好源码之后,想把应用源码放到Android源码中编译, 但是出现: packages/apps/Settings_yfk/gen/com/xzh/settings/R.java: ...

  3. android源码编译jar,在android源码编译中导入第三方jar包

    源码编译,我们可以只留下app的src,res目录和androidmanifest.xml文件,在app的根目录添加一个android.mk文件,还有我们需要导入的jar包,我这里是libjsoup- ...

  4. 如何在Android源码工程中编译fdk-aac

    1 下载fdk-aac源码 https://nchc.dl.sourceforge.net/project/opencore-amr/fdk-aac/fdk-aac-0.1.4.tar.gz 下载完成 ...

  5. android 编译 oserror,jdk/java版本与Android源码编译中的错误

    错误一:javap未指向有效的java版本 Traceback (most recent call last): File"../../base/android/jni_generator/ ...

  6. 【Android源码面试宝典】MMKV从使用到原理分析(二)

    上一章节,我们从使用入手,进行了MMKV的简单讲解,我们通过分析简单的运行时日志,从中大概猜到了一些MMKV的代码内部流程,同时,我们也提出了若干的疑问?还是那句话,带着目标(问题)去阅读一篇源码,那 ...

  7. 编译Android源码卡死,编译Android源码过程中出现的错误

    错误1: Can't locate Switch.pm in @INC (you may need to install the Switch module) (@INC contains: /etc ...

  8. 【Android源码面试宝典】MMKV从使用到原理分析(一)

    去年,我们写过一篇文章,对于android原生提供的key-value存储API SharePreference,进行了从使用到原理的深入分析,同时对其中存在的ANR问题.存取慢等问题,进行了深入的探 ...

  9. linphone android源码,无法在实际设备上运行Linphone-android源代码

    我已经使用git clone下载了Linphone- android源代码.当我将源代码导入eclipse时,没有发现错误.然后我尝试在实际设备上运行应用程序,但是,应用程序无法加载并且崩溃了.这是错 ...

最新文章

  1. ASP.NET 2.0的异步页面刷新真给劲
  2. 营业收入快速增长 Twilio 云通信成就大牛股
  3. sqlbulkcopy是覆盖式更新吗_React 328道最全面试题(持续更新)
  4. 深入研究嵌入式操作系统的绝佳教材
  5. 同学,要不要来挑战双11零点流量洪峰?
  6. 作者:刘大伟(1984-),男,博士,烟台中科网络技术研究所助理研究员。
  7. MySQL对于表中数据的增删改查
  8. vue 图形化设计工具_Vue: Vue-CLI3.0 创建项目
  9. ARM linux的启动部分源代码简略分析【转】
  10. 09 spring-aop
  11. photoshop的页面制作练习2
  12. mysql密码输入多次都不对_mysql 密码不对
  13. Chrome开发者工具插件
  14. python中常见的三种选择结构_循序渐进学Python:三种选择语句
  15. 关于RS485的使用
  16. 60个Vue常见问题汇总及解决方案
  17. 冷却红外成像的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  18. 微信扫码登陆在chrome浏览器失败
  19. Microsoft Visual Studio 2008安装教程
  20. android 手机充电慢,导致手机充电太慢的四大原因及解决方法【图文教程】

热门文章

  1. Deep Learning(深度学习)学习笔记整理系列之LeNet-5卷积参数个人理解
  2. 人生苦短,Let's Go!
  3. Python学习笔记:数据库2
  4. C++类中成员变量的初始化有两种方式
  5. WPS for Linux(ubuntu)字体缺失解决办法(转)
  6. Report20200828螺旋波等离子体推力器HPT模拟放电调试小结
  7. 科大星云诗社动态20210311
  8. 一个网站拿下机器学习优质资源!搜索效率提高 50%
  9. C++中namespace的理解与实践
  10. 大话数据结构与算法:基础篇