进程管理Demo

SmartTaskMan功能介绍

实现一个Android系统下的进程管理APP,主要功能有:

1)实现进程的查看,包括进程总数,进程名,pid,uid,以及进程占有的内存,优先级等

2)结束某个进程

3)一键清理正在运行的进程

4)查看当前剩余内存

5)查看某些系统信息

6)查看当前正在运行的任务

7)查看当前正在运行的服务

8)分享给好友

经测试,本APP可以运行在Android 2.3.3 至 Android 4.2 的系统上。

 

 

(1)欢迎界面的实现

 

首先要撰写一个Welcome活动,Welcome.java,实现两个活动间的延迟跳转功能。

 

[java] view plain copy

  1. package cn.edu.neuq.smarttaskman;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.os.Handler;  
  7. //欢迎界面  
  8. public class Welcome extends Activity {  
  9.         @Override  
  10.     public void onCreate(Bundle savedInstanceState) {  
  11.             super.onCreate(savedInstanceState);   
  12.             setContentView(R.layout.start);  
  13.             //延迟0.7秒后执行run方法中的页面跳转  
  14.         new Handler().postDelayed(new Runnable() {            
  15.             @Override  
  16.             public void run() {  
  17.                     Intent intent = new Intent(Welcome.this, MainActivity.class);  
  18.                 startActivity(intent);  
  19.                 Welcome.this.finish();  
  20.             }  
  21.         }, 700);  
  22.     }  
  23.   }  


 

 

 

然后,实现start.xml的布局,最重要的是android:scaleType="centerCrop",确保图片铺满整个View。

还要实现全屏显示,把标题栏和信息栏都去掉,并使Welcome活动在点开图标后首先显示。

AndroidMainfest.xml内部修改如下:

 

 

[html] view plain copy

  1. <activity  
  2.             android:name="cn.edu.neuq.smarttaskman.Welcome"  
  3.             android:label="@string/app_name"   
  4.             android:theme="@android:style/Theme.NoTitleBar.Fullscreen">  
  5.             <intent-filter>  
  6.                 <action android:name="android.intent.action.MAIN" />  
  7.                 <category android:name="android.intent.category.LAUNCHER" />  
  8.             </intent-filter>  
  9. </activity>  

 

 

(2)主界面的实现

 

主界面主要是由一个RelativeLayout嵌套包含上下两个LinearLayout,中间夹着一个ListView实现的,这里不再详述。

下图为主界面,可以看到最上面为标题栏,然后是一个LinearLayout,里面有4个TextView,每个的权重都为1,四个TextView平分一行。

 

 

(3)剩余内存的获取

 

首先要获取ActivityManager类型的系统服务信息,然后获得ActivityManager.MemoryInfo类型的MemoryInfo对象,调用getMemoryInfo(memoryInfo),将可用内存保存到memoryInfo上,最后再进行相应的类型转换即可。

 

[java] view plain copy

  1. public ActivityManager myActivityManager =  
  2. (ActivityManager)getSystemService(Activity.ACTIVITY_SERVICE);  
  3.   public void upDateMemInfo(){     
  4.     ActivityManager.MemoryInfo memoryInfo =  new ActivityManager.MemoryInfo();  
  5.       myActivityManager.getMemoryInfo(memoryInfo) ;    
  6.       long memSize = memoryInfo.availMem ;              
  7.       //字符类型转换   
  8.       leftMemSize = Formatter.formatFileSize(getBaseContext(), memSize);  
  9.       leftMem.setText(leftMemSize);  

 

 

(4)获取正在运行的进程信息

 

 

将进程以ListView的形式显示出来,最重要的是得到进程信息以及创建相应的适配器。

主要是利用了ActivityManager.RunningAppProcessInfo这个类。

 

 

[java] view plain copy

  1. //获得正在运行进程的某些信息  
  2.     public void getRunningProcessInfo(){  
  3.         myActivityManager = (ActivityManager)MainActivity.this.getSystemService(ACTIVITY_SERVICE);   
  4.         proNum.setText(myActivityManager.getRunningAppProcesses().size()+"");  
  5.         arrayListPro = new ArrayList<String>();   
  6.         mRunningPros = myActivityManager.getRunningAppProcesses();  
  7.         for (ActivityManager.RunningAppProcessInfo amPro : mRunningPros){             
  8.               
  9.             // 获得该进程占用的内存  
  10.             int[] myMempid = new int[] {amPro.pid};  
  11.             // 此MemoryInfo位于android.os.Debug.MemoryInfo包中,用来统计进程的内存信息  
  12.             Debug.MemoryInfo[] memoryInfo = myActivityManager.getProcessMemoryInfo(myMempid);             
  13.             // 获取进程占内存信息形如3.14MB  
  14.             double memSize = memoryInfo[0].dalvikPrivateDirty/1024.0;     
  15.             int temp = (int)(memSize*100);  
  16.             memSize = temp/100.0;  
  17.               
  18.             String ProInfo="";  
  19.             ProInfo +="Name:"+ amPro.processName  
  20.                     + "\nID:" + amPro.pid   
  21.                     + "\nMemory:" + memSize + "MB";  
  22.             arrayListPro.add(ProInfo);   
  23.         }  
  24.               
  25.         arrayAdapter = new ArrayAdapter<String> (MainActivity.this, android.R.layout.simple_list_item_1, arrayListPro);   
  26.         proList.setAdapter(arrayAdapter);     
  27.           
  28.   }  


 

 

(5)为按钮绑定监听器

1. 一键清理

[java] view plain copy

  1. Button kill_all = (Button)findViewById(R.id.kill_all);    
  2. kill_all.setOnClickListener(new OnClickListener(){  
  3.     public void onClick(View source){  
  4.         for (ActivityManager.RunningAppProcessInfo amPro : mRunningPros){  
  5.             String processName = amPro.processName;  
  6.             myActivityManager.killBackgroundProcesses(processName);  
  7.         }  
  8.         getRunningProcessInfo();  
  9.         upDateMemInfo();  
  10.         makeToastSimple("一键清理结束,当前可用内存为" + leftMemSize, true);                   }  
  11. });   

 

利用for循环,把所有能杀死的进程全部杀死(系统进程使用killBackgroundProcesses方法杀不死),达到一键清理的目的。

2. 刷新

[java] view plain copy

  1. Button refresh = (Button)findViewById(R.id.refresh);  
  2. refresh.setOnClickListener(new OnClickListener()  
  3. {  
  4.     @Override  
  5.     public void onClick(View source)  
  6.     {  
  7.         getRunningProcessInfo();  
  8.         makeToast("已刷新");  
  9.         upDateMemInfo();                  
  10.     }  
  11. });   

 

(6)为ListView的item绑定监听器

1. 点击产生简单对话框

当用户点击某个ListView的item的时候,就会产生一个对话框,让用户选择是否杀死该进程,如果用户点击了确定,就会先确定是点击了哪一个进程,再根据进程名去杀死该进程。

[java] view plain copy

  1. myActivityManager.killBackgroundProcesses(processName);  
  2.   
  3. proList.setOnItemClickListener(new OnItemClickListener(){  
  4.              public void onItemClick(AdapterView<?> arg0, View arg1,  final int position, long arg3) {     
  5.                  new AlertDialog.Builder(MainActivity.this).setMessage("是否杀死该进程")  
  6.                     .setPositiveButton("确定", new DialogInterface.OnClickListener() {  
  7.                         @Override  
  8.                         public void onClick(DialogInterface dialog, int which) {                              
  9.                             String processName = mRunningPros.get(position).processName;  
  10.                             myActivityManager.killBackgroundProcesses(processName);  
  11.                             getRunningProcessInfo() ;  
  12.                             upDateMemInfo();  
  13.                             makeToastSimple("已杀死进程" + processName, true);  
  14.                         }  
  15.                     }).setNegativeButton("取消",new DialogInterface.OnClickListener(){                            @Override  
  16.                         public void onClick(DialogInterface dialog, int which) {                                    dialog.cancel() ;  
  17.                         }  
  18.                     }).create().show() ;  
  19.                      
  20.                }     
  21.         });  


 

 

2. 长按产生列表对话框

当用户长按某个ListView的item的时候,就会产生一个对话框,这个对话框与上一个不同的是,这个有多个选择,而不是上一种的单选(确定或取消),称之为列表对话框。

 

 

[java] view plain copy

  1. proList.setOnItemLongClickListener(new ListView.OnItemLongClickListener(){  
  2.             @Override  
  3.             public boolean onItemLongClick(AdapterView<?> arg0, final View view, final int position, long arg3) {  
  4.                 final String processName = mRunningPros.get(position).processName;  
  5.                 android.content.DialogInterface.OnClickListener listener1 = new  DialogInterface.OnClickListener(){  
  6.                     public void onClick(DialogInterface dialog, int which) {  
  7.                         if(which==0){  
  8.                             myActivityManager.killBackgroundProcesses(processName);  
  9.                             getRunningProcessInfo() ;  
  10.                             upDateMemInfo();  
  11.                             makeToastSimple("已杀死进程" + processName, true);             
  12.                         }else if (which==1)  
  13.                             check_detail(position);  
  14.                     }  
  15.                 };  
  16.                 new AlertDialog.Builder(MainActivity.this)  
  17.                     .setTitle("操作")  
  18.                     .setItems(R.array.operation,listener1)  
  19.                     .setPositiveButton(R.string.cancel, new DialogInterface.OnClickListener(){  
  20.                         public void onClick(DialogInterface dialog, int which) {  
  21.   <span style="white-space:pre">                            </span>@Override  
  22.                             dialog.cancel() ;  
  23.                         }  
  24.                     }).show();  
  25.                 return true;  
  26.             }  
  27.         });  

 

 

(7)查看详情

[java] view plain copy

  1. public void check_detail(int position){  
  2.         ActivityManager.RunningAppProcessInfo processInfo =    
  3.   mRunningPros.get(position);         
  4.   Intent intent = new Intent(this, detail.class);  
  5.         intent.putExtra("EXTRA_PROCESS_PID", processInfo.pid + "");  
  6.         intent.putExtra("EXTRA_PROCESS_UID", processInfo.uid + "");  
  7.         intent.putExtra("EXTRA_PROCESS_NAME", processInfo.processName);   
  8.         intent.putExtra("EXTRA_PROCESS_IMPORTANCE", processInfo.importance + "");  
  9.         intent.putExtra("EXTRA_PROCESS_IMPORTANCE_REASON_CODE",   
  10.   processInfo.importanceReasonCode + "");     
  11.         intent.putExtra("EXTRA_PROCESS_IMPORTANCE_REASON_PID",   
  12.   processInfo.importanceReasonPid + "");          
  13.         intent.putExtra("EXTRA_PROCESS_LRU", processInfo.lru + "");   
  14.         intent.putExtra("EXTRA_PKGNAMELIST", processInfo.pkgList) ;  
  15.         startActivity(intent);  
  16.     }  

 

 

public static final int importance,参照Android官方文档的说明,

进程的优先级一共有六种,分别是:

 

IMPORTANCE_FOREGROUND, 100

IMPORTANCE_PERCEPTIBLE,130

IMPORTANCE_VISIBLE, 200

IMPORTANCE_SERVICE, 300

IMPORTANCE_BACKGROUND, 400

IMPORTANCE_EMPTY. 500

 

其中IMPORTANCE_PERCEPTIBLE自从API 9才开始引入,其

它的从API 3就开始引入了。级别的数字越小,代表越重要。

 

(8)Menu键

当用户按下物理键盘的menu键时触发,显示菜单列表,依次为“查看正

在运行的任务”,“查看正在运行的服务”等。当用户点击某个菜单时,

相应的就会执行某个函数。

 

 

[java] view plain copy

  1. //以下是按下menu呼出的菜单的添加处理  
  2.     @Override  
  3.     public boolean onCreateOptionsMenu(Menu menu) {   
  4.         menu.add(0, TASK, 0, "查看正在运行的任务");  
  5.         menu.add(0, SERVICE, 0, "查看正在运行的服务");  
  6.         menu.add(0, ABOUT, 0, "关于应用");  
  7.         menu.add(0, INFO, 0, "系统信息");  
  8.         menu.add(0, SHARE, 0, "分享应用");  
  9.         menu.add(0, EXIT, 0, "退出应用");  
  10.         return super.onCreateOptionsMenu(menu);  
  11.     }  
  12.       
  13.     public void show_tasks(){  
  14.         Intent intent = new Intent(this, getTask.class);  
  15.         startActivity(intent);  
  16.     }  
  17.       
  18.     public void show_services(){  
  19.         Intent intent = new Intent(this, getService.class);  
  20.         startActivity(intent);  
  21.     }  
  22.       
  23.     public void about_info(){  
  24.         Intent intent = new Intent(this, about_info.class);  
  25.         startActivity(intent);  
  26.     }  
  27.       
  28.     public void system_info(){  
  29.         Intent intent = new Intent(this, system_info.class);  
  30.         startActivity(intent);  
  31.     }     
  32.       
  33.     public void share(){  
  34.         Intent intent=new Intent(Intent.ACTION_SEND);    
  35.         intent.setType("text/plain");  //纯文本  
  36.         intent.putExtra(Intent.EXTRA_SUBJECT, "分享");    
  37.         intent.putExtra(Intent.EXTRA_TEXT, "我发现了一个好用的Android APP,SmartTaskMan。");    
  38.         startActivity(intent);    
  39.     }  
  40.       
  41.       
  42.       
  43.     @Override  
  44.     public boolean onOptionsItemSelected(MenuItem mi){  
  45.         switch (mi.getItemId()){  
  46.             case TASK:  
  47.                 show_tasks();  
  48.                 break;  
  49.             case SERVICE:  
  50.                 show_services();  
  51.                 break;  
  52.             case ABOUT:  
  53.                 about_info();  
  54.                 break;  
  55.             case INFO:  
  56.                 system_info();  
  57.                 break;  
  58.             case SHARE:  
  59.                 share();  
  60.                 break;  
  61.             case EXIT:  
  62.                 finish();  
  63.                 break;  
  64.         }  
  65.         return true;  
  66.     }  

 

 

(9)分享功能的实现

 

所有可以接收plain类型的应用都响应。将文本发送到可以接收文本的应用中(例如电子邮件)。

 

[java] view plain copy

  1. public void share(){  
  2.         Intent intent=new Intent(Intent.ACTION_SEND);    
  3.         intent.setType("text/plain");  //纯文本  
  4.         intent.putExtra(Intent.EXTRA_SUBJECT, "分享");    
  5.         intent.putExtra(Intent.EXTRA_TEXT, "我发现了一个好用的Android APP,SmartTaskMan。下载地址:....");    
  6.         startActivity(intent);    
  7.     }  

 

 

(10)查看正在运行的任务和服务

 

主要是利用了以下两个类。

ActivityManager.RunningServiceInfo

‚ActivityManager.RunningTaskInfo

原理与查看正在运行的进程相同,这里不再赘述。

 

 

 

ActivityManager.RunningServiceInfo的部分属性:

属性名

数据类型

解释

process

String

服务所在进程名

pid

Int

服务所在进程的id

uid

Int

拥有这个服务的用户id

foreground

Boolean

服务是否在前台

activeSince

Long

服务第一次的启动时间


 

 

ActivityManager.RunningTaskInfo的部分属性:

属性名

数据类型

解释

baseActivity

ComponentName

该任务的应用程序

Id

Int

任务的id

numRunning

Int

任务中所运行的Activity数量,不包括已停止或不延续运行的

numActivities

Int

任务中所运行的Activity数量,包含已停止的

desctiption

CharSequende

任务的当前状态描述

 

 

(11)系统信息

 

系统信息的主界面也是一个ListView,与之前的proList用系统自带的item类型不同,这里每一个item都是自定义的(在system_item.xml文件里面定义)。

 

 

[java] view plain copy

  1. package cn.edu.neuq.smarttaskman;  
  2.   
  3. import android.os.Build;  
  4. import android.os.Bundle;  
  5. import android.app.Activity;  
  6. import android.content.Context;  
  7. import android.view.View;  
  8. import android.view.ViewGroup;  
  9. import android.widget.BaseAdapter;  
  10. import android.widget.ListView;  
  11. import android.widget.TextView;  
  12.   
  13.   
  14. public class system_info extends Activity {  
  15.   
  16.     private ListView mLisview;  
  17.   
  18.     @Override  
  19.     public void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.system);          
  22.         String[][] systemInfo = getSystemInfo();          
  23.         MyAdapter myAdapter = new MyAdapter(getApplicationContext(), systemInfo);  
  24.         mLisview = (ListView)findViewById(R.id.sysList);  
  25.         mLisview.setAdapter(myAdapter);          
  26.     }  
  27.       
  28.     private class MyAdapter extends BaseAdapter{          
  29.         private String[][] systemInfo;        
  30.           
  31.         MyAdapter(Context context,String[][] systemInfo){  
  32.             this.systemInfo = systemInfo;  
  33.         }  
  34.           
  35.         @Override  
  36.         public int getCount() {  
  37.             return systemInfo.length;  
  38.         }  
  39.   
  40.         @Override  
  41.         public Object getItem(int position) {  
  42.             return systemInfo[position];  
  43.         }  
  44.   
  45.         @Override  
  46.         public long getItemId(int position) {  
  47.             // TODO Auto-generated method stub  
  48.             return position;  
  49.         }  
  50.   
  51.         @Override  
  52.         public View getView(int position, View convertView, ViewGroup parent) {  
  53.             convertView = getLayoutInflater().inflate(R.layout.system_item, null);  
  54.             TextView name = (TextView) convertView.findViewById(R.id.name);  
  55.             TextView value = (TextView) convertView.findViewById(R.id.value);             
  56.             name.setText(systemInfo[position][1]);  
  57.             value.setText(systemInfo[position][0]);           
  58.             return convertView;  
  59.         }         
  60.     }  
  61.   
  62.     private String[][] getSystemInfo() {  
  63.         Build mBuild = new Build();  
  64.         String[][] systemInfo = {  
  65.                 {mBuild.BOARD,"主板"},  
  66.                 {mBuild.BRAND,"系统定制商   "},  
  67.                 {mBuild.CPU_ABI,"cpu指令集 "},  
  68.                 {mBuild.DEVICE,"设备参数    "},  
  69.                 {mBuild.DISPLAY," 显示屏参数  "},  
  70.                 {mBuild.FINGERPRINT,"硬件名称"},  
  71.                 {mBuild.HOST,"主机   "},  
  72.                 {mBuild.MANUFACTURER," 硬件制造商    "},  
  73.                 {mBuild.MODEL,"版本   "},  
  74.                 {mBuild.PRODUCT," 手机制造商  "},  
  75.                 {Build.VERSION.RELEASE,"版本字符串格式  "}  
  76.                 };  
  77.         return systemInfo;  
  78.     }  
  79.       
  80. }  

 

 

(12)消息提示

 

利用Toast组件,实现消息提示功能。

 

以下函数是一个简单的toast,只提示文本信息,如本页左图所示。函数接收一个String类型的参数和boolean类型的参数。若sel为true,则显示一个短时间(LENGTH_SHORT)的消息提示框,否则,显示一个长时间{LENGTH_LONG}的消息提示框。

[java] view plain copy

  1. public void makeToastSimple(String str,boolean sel){  
  2.             Toast toast = Toast.makeText(MainActivity.this,str,   
  3.                 sel?Toast.LENGTH_SHORT:Toast.LENGTH_LONG);    
  4.         toast.show();  
  5.   }  

 

以下函数是一个较复杂的toast,不仅提示文本信息,还显示一张图片,如本页右图所示。函数接收一个String类型的参数。这里我利用了该Toast对象的setView方法来改变Toast对象的内容View。

 

  1. public void makeToast(String str){  
  2.             Toast toast = Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT);  
  3.         View toastView = toast.getView();  
  4.         ImageView image = new ImageView(MainActivity.this);  
  5.         image.setImageResource(R.drawable.ic_launcher);  
  6.         LinearLayout ll = new LinearLayout(MainActivity.this);  
  7.         ll.addView(image);  
  8.         ll.addView(toastView);  
  9.         toast.setView(ll);                        
  10.         toast.show();  
  11.     }  

转载于:https://my.oschina.net/hanyh/blog/714348

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值