鱼C论坛

 找回密码
 立即注册
查看: 2918|回复: 16

小白马手机卫士之进程管理

[复制链接]
发表于 2015-1-6 15:55:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
进程管理模块

进程管理的话,也是比较简单的,首先是写一个获取手机正在运行的进程的类,此类中会有区分那个是用户进程哪个是系统进程的方法:

  1. package cn.cbd.mobilesafe.activity.engine;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import cn.cbd.mobilesafe.activity.R;
  5. import cn.cbd.mobilesafe.activity.bean.TaskInfo;
  6. import android.app.ActivityManager;
  7. import android.app.ActivityManager.RunningAppProcessInfo;
  8. import android.content.Context;
  9. import android.content.pm.ApplicationInfo;
  10. import android.content.pm.PackageInfo;
  11. import android.content.pm.PackageManager;
  12. import android.content.pm.PackageManager.NameNotFoundException;
  13. import android.os.Debug.MemoryInfo;
  14. public class TaskInfoProvider {

  15. /**
  16.   * 获取手机中正在运行的进程信息
  17.   * @param context 上下文
  18.   * @return 进程信息的集合
  19.   */
  20. public static List<TaskInfo> getRunningTaskInfos(Context context)
  21. {
  22.   /**
  23.    * 通过ActivityManager获得正在运行的程序的进程
  24.    */
  25.   ActivityManager manager=(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
  26.   List<RunningAppProcessInfo> appProcessInfos=manager.getRunningAppProcesses();
  27.   List<TaskInfo> taskInfos=new ArrayList<TaskInfo>();
  28.   PackageManager pm=context.getPackageManager();
  29.   /**
  30.    * 循环此集合
  31.    */
  32.   for(RunningAppProcessInfo info : appProcessInfos)
  33.   {
  34.    TaskInfo taskInfo=new TaskInfo();
  35.    String packageName=info.processName;  //得到进程的名字
  36.    taskInfo.setPackageName(packageName);
  37.    try
  38.    {
  39.     /**
  40.      * 通过进程的名字得到包的信息--PackageInfo
  41.      * 这样的话就可以得到程序的图标与标签了
  42.      */
  43.     PackageInfo packageInfo=pm.getPackageInfo(packageName, 0);
  44.     taskInfo.setIcon(packageInfo.applicationInfo.loadIcon(pm));
  45.     taskInfo.setName(packageInfo.applicationInfo.loadLabel(pm).toString());
  46.     taskInfo.setUserTask(isUserApp(packageInfo.applicationInfo));
  47.    }
  48.    catch (NameNotFoundException e)
  49.    {
  50.     e.printStackTrace();
  51.     //有些进程没有图标,没有名子
  52.     taskInfo.setIcon(context.getResources().getDrawable(R.drawable.ic_launcher));
  53.     taskInfo.setName(packageName);
  54.    }
  55.    int pid=info.pid;
  56.    MemoryInfo[] memoryInfo=manager.getProcessMemoryInfo(new int[]{pid});
  57.    taskInfo.setMemorySize(memoryInfo[0].getTotalPrivateDirty()*1024);
  58.    taskInfos.add(taskInfo);
  59.   }
  60.   return taskInfos;
  61.    
  62. }
  63.         /**
  64.   * 判断该应用程序是否为用户自定义安装程序
  65.   * @param applicationInfo 当前应用的包信息对象
  66.   * @return true表示用户程序,false表示系统程序
  67.   */
  68. public static boolean isUserApp(ApplicationInfo applicationInfo)
  69. {
  70.   if((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)==1)
  71.   {
  72.    return false;
  73.   }else{
  74.    return true;
  75.   }
  76. }
  77. }

复制代码


然后再写一个类来获取正在运行程序的数量,手机剩余的内存,还有手机的RAM的大小:


  1. import java.io.BufferedReader;
  2. import java.io.File;
  3. import java.io.FileInputStream;

  4. public class ProcessUtil {
  5. /**
  6.   * 获取Android手机中正在运行的程序的数量
  7.   * @param context 上下文
  8.   * @return 正在系统中运行程序的数量
  9.   */
  10. public static int getRunningProcessCount(Context context)
  11. {
  12.   ActivityManager manager=(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
  13.   return manager.getRunningAppProcesses().size();
  14. }

  15. /**
  16.   * 获取当前手机的剩余内存
  17.   * @param context 上下文
  18.   * @return 剩余内存数
  19.   */
  20. public static long getAvailableMemory(Context context)
  21. {
  22.   ActivityManager manager=(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
  23.   MemoryInfo menoryInfo=new MemoryInfo();
  24.   manager.getMemoryInfo(menoryInfo);
  25.   return menoryInfo.availMem;
  26. }

  27. /**
  28.   * 获取手机的RAM的大小
  29.   * @return
  30.   */
  31. public static long getTotalRamSize()
  32. {
  33.   try
  34.   {
  35.    File file=new File("/proc/meminfo");
  36.    FileInputStream fis=new FileInputStream(file);
  37.    BufferedReader br=new BufferedReader(new InputStreamReader(fis));
  38.    
  39.    String result=br.readLine();
  40.    StringBuffer sb=new StringBuffer();
  41.    for(char c : result.toCharArray())
  42.    {
  43.     if(c>='0' && c<='9')
  44.     {
  45.      sb.append(c);
  46.     }
  47.    }
  48.    return Integer.parseInt(sb.toString())*1024;
  49.   }
  50.   catch (IOException e
  51. )
  52.   {
  53.    e.printStackTrace();
  54.    return 0;
  55.   }
  56.   
  57. }

  58. ************************************************************************************************************
  59. 然后就是加载界面的代码了:

  60. package cn.cbd.mobilesafe.activity;
  61. import java.util.ArrayList;
  62. import java.util.List;
  63. import android.app.Activity;
  64. import android.app.ActivityManager;
  65. import android.content.Context;
  66. import android.content.SharedPreferences;
  67. import android.graphics.Color;
  68. import android.graphics.drawable.Drawable;
  69. import android.os.AsyncTask;
  70. import android.os.Bundle;
  71. import android.text.format.Formatter;
  72. import android.view.View;
  73. import android.view.ViewGroup;
  74. import android.widget.AdapterView;
  75. import android.widget.AdapterView.OnItemClickListener;
  76. import android.widget.BaseAdapter;
  77. import android.widget.CheckBox;
  78. import android.widget.ImageView;
  79. import android.widget.LinearLayout;
  80. import android.widget.ListView;
  81. import android.widget.TextView;
  82. import android.widget.Toast;
  83. import cn.cbd.mobilesafe.activity.bean.TaskInfo;
  84. import cn.cbd.mobilesafe.activity.engine.TaskInfoProvider;
  85. import cn.cbd.mobilesafe.activity.util.ProcessUtil;
  86. public class TaskManagerActivity extends Activity {

  87. private TextView tv_task_manager_process_count;
  88. private TextView tv_task_memory_info;
  89. private ListView lv_task_manager;
  90. private LinearLayout ll_task_loading;
  91. private long availaleMemory;
  92. private List<TaskInfo> taskInfos;
  93. private List<TaskInfo> userTaskInfos;
  94. private List<TaskInfo> systemTaskInfos;
  95. private MyAdapter adapter;
  96. /*手机中正在运行的进程数*/
  97. private int runningProcessCount;
  98. @Override
  99. protected void onCreate(Bundle savedInstanceState) {
  100.   
  101.   super.onCreate(savedInstanceState);
  102.   setContentView(R.layout.activity_task_manager);
  103.   
  104.   userTaskInfos=new ArrayList<TaskInfo>();
  105.   systemTaskInfos=new ArrayList<TaskInfo>();
  106.   
  107.   tv_task_manager_process_count=(TextView) findViewById(R.id.tv_task_manager_process_count);
  108.   tv_task_memory_info=(TextView) findViewById(R.id.tv_task_memory_info);
  109.   
  110.   ll_task_loading=(LinearLayout) findViewById(R.id.ll_task_loading);
  111.   availaleMemory=ProcessUtil.getAvailableMemory(this);
  112.   runningProcessCount=ProcessUtil.getRunningProcessCount(this);
  113.   tv_task_manager_process_count.setText("正在运行的进程:"+runningProcessCount+"个");
  114.   tv_task_memory_info.setText("剩余/总内存:"+Formatter.formatFileSize(this,availaleMemory)+"/"+Formatter.formatFileSize(this,ProcessUtil.getTotalRamSize()));
  115.   lv_task_manager=(ListView) findViewById(R.id.lv_task_manager);
  116.   loadingData();
  117.   
  118.   lv_task_manager.setOnItemClickListener(new OnItemClickListener(){
  119.    @Override
  120.    public void onItemClick(AdapterView<?> parent, View view,
  121.      int position, long id) {
  122.     CheckBox cb_checked=(CheckBox) view.findViewById(R.id.cb_taskchecked_status);
  123.    
  124.     /**
  125.      * TaskInfo是一个javaBean里面有:
  126.      * private Drawable icon;
  127.      private String name;
  128.      private String packageName;
  129.      private boolean isUserTask;
  130.      private boolean checked;
  131.      private long memorySize;
  132.      */
  133.     TaskInfo taskInfo=(TaskInfo) lv_task_manager.getItemAtPosition(position);
  134.     //如果选中的条目不是当前应用就设置多先框的值
  135.     if(!taskInfo.getPackageName().equals(getPackageName()))
  136.     {
  137.      if(taskInfo.isChecked())
  138.      {
  139.       taskInfo.setChecked(false);
  140.       cb_checked.setChecked(false);
  141.      }else{
  142.       taskInfo.setChecked(true);
  143.       cb_checked.setChecked(true);
  144.      }
  145.     }
  146.    
  147.    }
  148.    
  149.   });
  150.   
  151.   
  152. }

  153. public void loadingData()
  154. {
  155.   new AsyncTask<Void, Void, Void>(){

  156.    /**
  157.     * 这里用到了异步任务
  158.     */
  159.    @Override
  160.    protected void onPreExecute() {
  161.     ll_task_loading.setVisibility(View.VISIBLE);
  162.     super.onPreExecute();
  163.    }
  164.    
  165.    @Override
  166.    protected Void doInBackground(Void... params) {
  167.     /**
  168.      * 此方法的作用就是判断如果是用户进程的话那就把它放在用户进程的集合里面
  169.      * 否则就放在系统进程的集合里面
  170.      */
  171.     taskInfos=TaskInfoProvider.getRunningTaskInfos(getApplicationContext());
  172.     for(TaskInfo taskInfo : taskInfos)
  173.     {
  174.      if(taskInfo.isUserTask())
  175.      {
  176.       userTaskInfos.add(taskInfo);
  177.      }
  178.      else
  179.      {
  180.       systemTaskInfos.add(taskInfo);
  181.      }
  182.     }
  183.     return null;
  184.    }
  185.    
  186.    @Override
  187.    protected void onPostExecute(Void result) {
  188.    
  189.     /**
  190.      * 最后的时候实例化适配器
  191.      * 添加适配器到listView里面
  192.      */
  193.     ll_task_loading.setVisibility(View.INVISIBLE);
  194.     adapter=new MyAdapter();
  195.     lv_task_manager.setAdapter(adapter);
  196.    
  197.     super.onPostExecute(result);
  198.    }
  199.    
  200.   }.execute();
  201. }

  202. /**
  203.   * 刹死选中的进程
  204.   * @param v
  205.   */
  206. public void killProcess(View v)
  207. {
  208.   List<TaskInfo> killProcessTaskInfos=new ArrayList<TaskInfo>();
  209.   int count=0;
  210.   long memory=0;
  211.   ActivityManager manager=(ActivityManager) getSystemService(ACTIVITY_SERVICE);
  212.   for(TaskInfo taskInfo : userTaskInfos)
  213.   {
  214.    if(taskInfo.isChecked())
  215.    {
  216.     count++;
  217.     memory+=taskInfo.getMemorySize();
  218.     manager.killBackgroundProcesses(taskInfo.getPackageName());
  219.     killProcessTaskInfos.add(taskInfo);
  220.    }
  221.   }
  222.   
  223.   for(TaskInfo taskInfo : systemTaskInfos)
  224.   {
  225.    if(taskInfo.isChecked())
  226.    {
  227.     count++;
  228.     memory+=taskInfo.getMemorySize();
  229.     manager.killBackgroundProcesses(taskInfo.getPackageName());
  230.     killProcessTaskInfos.add(taskInfo);
  231.    }
  232.   }
  233.   Toast.makeText(this, "清理掉了"+count+"个进程\n释放了"+Formatter.formatFileSize(this, memory)+"空间", Toast.LENGTH_SHORT).show();
  234.   
  235.   availaleMemory+=memory;
  236.   runningProcessCount-=count;
  237.   tv_task_manager_process_count.setText("正在运行的进程:"+runningProcessCount+"个");
  238.   tv_task_memory_info.setText("剩余/总内存:"+Formatter.formatFileSize(this,availaleMemory)+"/"+Formatter.formatFileSize(this,ProcessUtil.getTotalRamSize()));
  239.   //从集合中删除被刹死的进程
  240.   for(TaskInfo taskInfo : killProcessTaskInfos)
  241.   {
  242.    if(taskInfo.isUserTask())
  243.    {
  244.     userTaskInfos.remove(taskInfo);
  245.    }else{
  246.     systemTaskInfos.remove(taskInfo);
  247.    }
  248.   }
  249.   //通知数据适配器更新数据
  250.   adapter.notifyDataSetChanged();
  251. }


  252. private class MyAdapter extends BaseAdapter
  253. {
  254.   
  255.   /**
  256.    * 此类是查询列表的适配器
  257.    * 关于此类中的方法的话,在程序管理的那个模块说的很清楚了
  258.    * 这里的话就不一一细说了
  259.    * @author Administrator
  260.    *
  261.    */
  262.   
  263.   @Override
  264.   public boolean isEnabled(int position) {  //判断位置是否是分隔栏的位置
  265.   
  266.    if(position==0 || position==userTaskInfos.size()+1)
  267.    {
  268.     return false;
  269.    }
  270.    else
  271.    {
  272.     return true;
  273.    }
  274.    
  275.   }
  276.   @Override
  277.   public int getCount() {
  278.    /**
  279.     * 此方法的话有必要说明一下
  280.     * 是通过共享数据来对用户进程与系统进程的数量进行控制
  281.     * 如果showSystem是true的话那就是系统进程就返回的是系统进程的数量
  282.     * 否则返回就是用户程序的数量
  283.     */
  284.    SharedPreferences sharedPreferences=getSharedPreferences("config",Context.MODE_PRIVATE);
  285.    boolean showSystem=sharedPreferences.getBoolean("showSystemProcess", false);
  286.    if(showSystem){
  287.     return userTaskInfos.size()+systemTaskInfos.size()+2;
  288.    }else{
  289.     return userTaskInfos.size()+1;
  290.    }
  291.    
  292.    
  293.   }
  294.   @Override
  295.   public Object getItem(int position) {
  296.    
  297.    /**
  298.     * 判断返回的条目是用户进程的还是系统进程的
  299.     */
  300.    if(position==0)
  301.    {
  302.     return null;
  303.    }else if(position<=userTaskInfos.size()){
  304.     return userTaskInfos.get(position-1);
  305.    }else if(position==userTaskInfos.size()+1){
  306.     return null;
  307.    }else{
  308.     return systemTaskInfos.get(position-userTaskInfos.size()-2);
  309.    }
  310.    
  311.   }
  312.   @Override
  313.   public long getItemId(int position) {
  314.    
  315.    return position;
  316.   }
  317.   @Override
  318.   public View getView(int position, View convertView, ViewGroup parent) {
  319.    
  320.    if(position==0)
  321.    {
  322.     TextView tv=new TextView(getApplicationContext());
  323.     tv.setTextColor(Color.BLACK);
  324.        tv.setBackgroundColor(Color.GRAY);
  325.        tv.setText("用户进程:"+userTaskInfos.size()+"个");
  326.     return tv;
  327.    }else if(position<=userTaskInfos.size()){
  328.     View view=View.inflate(getApplicationContext(), R.layout.layout_task_item, null);
  329.     ImageView iv_icon=(ImageView) view.findViewById(R.id.iv_task_icon);
  330.     TextView tv_name=(TextView)view.findViewById(R.id.tv_task_name);
  331.     TextView tv_memory=(TextView)view.findViewById(R.id.tv_task_memory);
  332.     CheckBox cb_checked=(CheckBox) view.findViewById(R.id.cb_taskchecked_status);
  333.        TaskInfo taskInfo=userTaskInfos.get(position-1);
  334.        if(taskInfo.getPackageName().equals(getPackageName()))
  335.        {
  336.         cb_checked.setVisibility(View.INVISIBLE);
  337.        }
  338.        iv_icon.setImageDrawable(taskInfo.getIcon());
  339.        tv_name.setText(taskInfo.getName());
  340.        tv_memory.setText("占用内存:"+Formatter.formatFileSize(getApplicationContext(), taskInfo.getMemorySize()));
  341.        cb_checked.setChecked(taskInfo.isChecked());
  342.        return view;
  343.       
  344.    }else if(position==userTaskInfos.size()+1){
  345.    
  346.     TextView tv=new TextView(getApplicationContext());
  347.     tv.setTextColor(Color.BLACK);
  348.        tv.setBackgroundColor(Color.GRAY);
  349.        tv.setText("系统进程:"+systemTaskInfos.size()+"个");
  350.     return tv;
  351.    }else{
  352.     View view=View.inflate(getApplicationContext(), R.layout.layout_task_item, null);
  353.     ImageView iv_icon=(ImageView) view.findViewById(R.id.iv_task_icon);
  354.     TextView tv_name=(TextView)view.findViewById(R.id.tv_task_name);
  355.     TextView tv_memory=(TextView)view.findViewById(R.id.tv_task_memory);
  356.     CheckBox cb_checked=(CheckBox) view.findViewById(R.id.cb_taskchecked_status);
  357.        TaskInfo taskInfo=systemTaskInfos.get(position-userTaskInfos.size()-2);
  358.        iv_icon.setImageDrawable(taskInfo.getIcon());
  359.        tv_name.setText(taskInfo.getName());
  360.        tv_memory.setText("占用内存:"+Formatter.formatFileSize(getApplicationContext(), taskInfo.getMemorySize()));
  361.        cb_checked.setChecked(taskInfo.isChecked());
  362.        return view;
  363.    }
  364.    
  365.   }
  366.   
  367. }
  368. }

复制代码


QQ截图20150106143332.jpg

评分

参与人数 1荣誉 +8 鱼币 +8 贡献 +5 收起 理由
拈花小仙 + 8 + 8 + 5 热爱鱼C^_^

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-1-6 16:11:46 | 显示全部楼层
@小甲鱼  甲鱼大哥到底怎么回事儿啊! 代码贴上去怎么会出现xml字符标签啊! 好友就是有的时候贴代码的文本框也不能分段!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-6 17:59:03 | 显示全部楼层
玄玄好厉害~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-6 20:35:41 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-6 23:33:40 | 显示全部楼层
学习学习:lol:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-8 15:24:13 | 显示全部楼层
不错啊!支持!:lol:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-8 16:46:14 | 显示全部楼层
咦  移动板块这是要搞起来吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-11 02:25:38 | 显示全部楼层
青玄 发表于 2015-1-6 16:11
@小甲鱼  甲鱼大哥到底怎么回事儿啊! 代码贴上去怎么会出现xml字符标签啊! 好友就是有的时候贴代码的文本 ...

应该是你后期在选中文字添加格式的时候不小心把代码的[code]选进去了。
TAB应该4个空格容易看一些;对于代码比较长的,建议将源文件发成附件的方式哈^_^

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-12 22:48:42 | 显示全部楼层
小甲鱼 发表于 2015-1-11 02:25
应该是你后期在选中文字添加格式的时候不小心把代码的[code]选进去了。
TAB应该4个空格容易看一些;对于 ...

谢谢甲鱼大哥的提醒! 青玄知道了!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-12 22:49:10 | 显示全部楼层

呵呵! 兄弟! 让你见笑了!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-13 01:05:22 | 显示全部楼层
被这牛逼的代码征服了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-13 10:20:27 | 显示全部楼层
相当给力。。。必须支持!!!!!!!!!!!!!!!!!!!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-13 15:47:50 | 显示全部楼层
看强大:shock:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-13 20:28:58 | 显示全部楼层
青玄 发表于 2015-1-12 22:48
谢谢甲鱼大哥的提醒! 青玄知道了!

青玄做得很棒!向你学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-20 18:05:05 | 显示全部楼层
小甲鱼 发表于 2015-1-13 20:28
青玄做得很棒!向你学习

唉! 甲鱼大哥见笑啦! 如今小弟工作了! 可是不但对口,唉! 比较郁闷一些! 好多东西都不会!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-25 05:13:06 | 显示全部楼层
不错的帖子
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-2 17:08:47 | 显示全部楼层
{:1_1:}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-28 02:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表