现在我们来实现进程管理功能。老规矩,首先来做界面。主界面首先是一个标题栏,下面是来显示进程个数和可用/总内存的,接下来是显示item的,最后一部分是三个button。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/titlebar"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp">
<TextView
android:id="@+id/tv_memory_processmanager"
style="@style/textview12sp"
android:layout_alignParentRight="true"/>
<TextView
android:id="@+id/tv_runningprocess_num"
style="@style/textview12sp"
android:layout_alignParentLeft="true"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="10">
<ListView
android:id="@+id/lv_runningapps"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv_user_runningprocess"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/graye5"
android:padding="5dp"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp">
<Button
android:id="@+id/btn_cleanprocess"
android:layout_width="90dp"
android:layout_height="40dp"
android:layout_alignParentLeft="true"
android:layout_marginLeft="10dp"
android:background="@drawable/cleanprocess_btn_selector"/>
<Button
android:id="@+id/btn_selectall"
android:layout_width="90dp"
android:layout_height="40dp"
android:layout_centerHorizontal="true"
android:background="@drawable/select_all_btn_selector"/>
<Button
android:id="@+id/btn_select_inverse"
android:layout_width="90dp"
android:layout_height="40dp"
android:layout_alignParentRight="true"
android:layout_marginRight="10dp"
android:background="@drawable/inverse_btn_selector"/>
</RelativeLayout>
</LinearLayout>
然后是item布局,图标,name,占用内存,复选框
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/imgv_appicon_processmana"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_alignTop="@+id/tv_appname_prcessmana"
android:layout_alignParentStart="true" />
<TextView
android:id="@+id/tv_appname_prcessmana"
style="@style/textview16sp"
android:layout_width="150dp"
android:layout_alignParentTop="true"
android:maxLines="1"
android:layout_marginLeft="16dp"
android:layout_toRightOf="@+id/imgv_appicon_processmana"
android:layout_margin="5dp"
android:textColor="@color/black"/>
<TextView
android:id="@+id/tv_appmemory_processmana"
style="@style/textview14sp"
android:layout_margin="5dp"
android:layout_below="@+id/tv_appname_prcessmana"
android:layout_toRightOf="@+id/imgv_appicon_processmana"
android:textColor="@color/black"/>
<CheckBox
android:id="@+id/checkbox"
style="@style/wrapcontent"
android:button="@drawable/green_checkbox_selector"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:focusable="false"
android:clickable="false"
android:layout_marginRight="10dp"/>
</RelativeLayout>
然后写逻辑操作,为了方便操作,先写个进程实体类,描述进程各种信息。
package com.yangmiaoqing.example.myassitant;
import android.graphics.drawable.Drawable;
/**
* Created by yangmiaoqing on 2018/4/5.
*/
//实体类,描述进程信息
public class TaskInfo {
public String appName;
public Drawable appIcon;
public String packageName;
public long appMemory;
public boolean isChecked;
public boolean isUserApp;
}
然后是获得运行中进程信息的类
package com.yangmiaoqing.example.myassitant;
import java.util.ArrayList;
import java.util.List;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.drawable.Drawable;
import android.os.Debug.MemoryInfo;
/**
* 任务信息 & 进程信息的解析器
*
* @author Administrator
*
*/
public class TaskInfoParser {
/**
* 获取正在运行的所有的进程的信息。
* @param context 上下文
* @return 进程信息的集合
*/
public static List<TaskInfo> getRunningTaskInfos(Context context) {
ActivityManager am = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
PackageManager pm = context.getPackageManager();
List<RunningAppProcessInfo> processInfos = am.getRunningAppProcesses();
List<TaskInfo> taskInfos = new ArrayList<TaskInfo>();
for (RunningAppProcessInfo processInfo : processInfos) {
String packname = processInfo.processName;
TaskInfo taskInfo = new TaskInfo();
taskInfo.packageName = packname;
MemoryInfo[] memroyinfos = am.getProcessMemoryInfo(new int[]{processInfo.pid});
long memsize = memroyinfos[0].getTotalPrivateDirty()*1024;
taskInfo.appMemory = memsize;
try {
PackageInfo packInfo = pm.getPackageInfo(packname, 0);
Drawable icon = packInfo.applicationInfo.loadIcon(pm);
taskInfo.appIcon = icon;
String appname = packInfo.applicationInfo.loadLabel(pm).toString();
taskInfo.appName = appname;
if((ApplicationInfo.FLAG_SYSTEM&packInfo.applicationInfo.flags)!=0){
//系统进程
taskInfo.isUserApp = false;
}else{
//用户进程
taskInfo.isUserApp = true;
}
} catch (NameNotFoundException e) {
e.printStackTrace();
taskInfo.appName = packname;
taskInfo.appIcon = context.getResources().getDrawable(R.drawable.ic_default);
}
taskInfos.add(taskInfo);
}
return taskInfos;
}
}
adapter类,和软件管理是一个套路
package com.yangmiaoqing.example.myassitant;
import android.content.Context;
import android.content.SharedPreferences;
import android.text.format.Formatter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.util.List;
/**
* Created by yangmiaoqing on 2018/4/5.
*/
public class ProcessManagerAdapter extends BaseAdapter {
private Context context;
private List<TaskInfo> mUsertaskInfos;
private List<TaskInfo> mSystaskInfos;
private SharedPreferences mSP;
public ProcessManagerAdapter(Context context,List<TaskInfo> userTaskInfos,List<TaskInfo> sysTaskInfo){
super();
this.context=context;
this.mUsertaskInfos=userTaskInfos;
this.mSystaskInfos=sysTaskInfo;
mSP=context.getSharedPreferences("config",Context.MODE_PRIVATE);
}
@Override
public int getCount() {
if(mSystaskInfos.size()>0&& mSP.getBoolean("showSystemProcess",true)){
return mUsertaskInfos.size()+mSystaskInfos.size()+2;
}else return mUsertaskInfos.size()+1;
}
@Override
public Object getItem(int position) {
if(position==0||position==mUsertaskInfos.size()+1){
return null;
}else if(position<=mUsertaskInfos.size()){
return mUsertaskInfos.get(position-1);
}else {
return mSystaskInfos.get(position - mUsertaskInfos.size() - 2);
}
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(position==0){
TextView tv=getTextView();
tv.setText("用户进程:"+mUsertaskInfos.size()+"个");
return tv;
}else if(position==mUsertaskInfos.size()+1){
TextView tv=getTextView();
if(mSystaskInfos.size()>0){
tv.setText("系统进程:"+mSystaskInfos.size()+"个");
return tv;
}
}
TaskInfo taskInfo=null;
if(position<=mUsertaskInfos.size()){
taskInfo=mUsertaskInfos.get(position-1);
}else if(mSystaskInfos.size()>0){
taskInfo=mSystaskInfos.get(position-mUsertaskInfos.size()-2);
}
ViewHolder viewHolder=null;
if(convertView!=null&&convertView instanceof RelativeLayout){
viewHolder=(ViewHolder)convertView.getTag();
}else{
convertView=View.inflate(context,R.layout.item_processmanager_list,null);
viewHolder=new ViewHolder();
viewHolder.mAppIconImgv=(ImageView)convertView.findViewById(R.id.imgv_appicon_processmana);
viewHolder.mAppMemoryTV=(TextView)convertView.findViewById(R.id.tv_appmemory_processmana);
viewHolder.mAppNameTV=(TextView)convertView.findViewById(R.id.tv_appname_prcessmana);
viewHolder.mCheckBox=(CheckBox)convertView.findViewById(R.id.checkbox);
convertView.setTag(viewHolder);
}
if(taskInfo!=null){
viewHolder.mAppNameTV.setText(taskInfo.appName);
viewHolder.mAppMemoryTV.setText("占用内存:"+ Formatter.formatFileSize(context,taskInfo.appMemory));
viewHolder.mAppIconImgv.setImageDrawable(taskInfo.appIcon);
if(taskInfo.packageName.equals(context.getPackageName())){
viewHolder.mCheckBox.setVisibility(View.GONE);
}else{
viewHolder.mCheckBox.setVisibility(View.VISIBLE);
}
viewHolder.mCheckBox.setChecked(taskInfo.isChecked);
}
return convertView;
}
private TextView getTextView(){
TextView tv=new TextView(context);
tv.setBackgroundColor(context.getResources().getColor(R.color.graye5));
tv.setPadding(DensityUtil.dip2px(context,5),DensityUtil.dip2px(context,5),DensityUtil.dip2px(context,5),DensityUtil.dip2px(context,5));
tv.setTextColor(context.getResources().getColor(R.color.black));
return tv;
}
static class ViewHolder{
ImageView mAppIconImgv;
TextView mAppNameTV;
TextView mAppMemoryTV;
CheckBox mCheckBox;
}
}
最后是Activity类
package com.yangmiaoqing.example.myassitant;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.Intent;
import android.os.Bundle;
import android.provider.Settings;
import android.text.format.Formatter;
import android.view.View;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* Created by yangmiaoqing on 2018/4/5.
*/
public class ProgressManagerActivity extends Activity implements View.OnClickListener {
private TextView mRunProcessNum;
private TextView mMemoryTV;
private TextView mProcessNumTV;
private ListView mListView;
ProcessManagerAdapter adapter;
private List<TaskInfo>runningTaskInfos;
private List<TaskInfo>userTaskInfos=new ArrayList<>();
private List<TaskInfo>sysTaskInfos=new ArrayList<>();
private ActivityManager manager;
private int runningProcessCount;
private long totalMem;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_progressmanager);
initView();
fillData();
}
@Override
protected void onResume(){
if(adapter!=null)adapter.notifyDataSetChanged();
super.onResume();
}
private void fillData() {
userTaskInfos.clear();
sysTaskInfos.clear();
new Thread(){
public void run(){
runningTaskInfos=TaskInfoParser.getRunningTaskInfos(getApplicationContext());
runOnUiThread(new Runnable() {
@Override
public void run() {
for(TaskInfo taskInfo:runningTaskInfos){
if(taskInfo.isUserApp){
userTaskInfos.add(taskInfo);
}else{
sysTaskInfos.add(taskInfo);
}
}
if(adapter==null){
adapter=new ProcessManagerAdapter(getApplicationContext(),userTaskInfos,sysTaskInfos);
}else{
adapter.notifyDataSetChanged();
}
mListView.setAdapter(adapter);
if(userTaskInfos.size()>0){
mProcessNumTV.setText("用户进程: "+userTaskInfos.size()+"个");
}else{
mProcessNumTV.setText("系统进程: "+sysTaskInfos.size()+"个");
}
}
});
}
}.start();
}
private void initView() {
findViewById(R.id.rl_titlebar).setBackgroundColor(getResources().getColor(R.color.bright_green));
ImageView mLeftImgv=(ImageView)findViewById(R.id.imgv_leftbtn);
mLeftImgv.setOnClickListener(this);
mLeftImgv.setImageResource(R.drawable.back);
ImageView mRightImgv=(ImageView)findViewById(R.id.imgv_rightbtn);
mRightImgv.setImageResource(R.drawable.processmanager_setting_icon);
mRightImgv.setOnClickListener(this);
((TextView)findViewById(R.id.tv_title)).setText("进程管理");
mRunProcessNum=(TextView)findViewById(R.id.tv_runningprocess_num);
mMemoryTV=(TextView)findViewById(R.id.tv_memory_processmanager);
mProcessNumTV=(TextView)findViewById(R.id.tv_user_runningprocess);
runningProcessCount=SystemInfoUtils.getRunningProcessCount(ProgressManagerActivity.this);
mRunProcessNum.setText("运行中的进程: "+runningProcessCount+"个");
long totalAvailMem=SystemInfoUtils.getAvailMem(this);
totalMem=SystemInfoUtils.getTotalMem();
mMemoryTV.setText("可用/总内存"+ Formatter.formatFileSize(this,totalAvailMem)+"/"+Formatter.formatFileSize(this,totalMem));
mListView=(ListView)findViewById(R.id.lv_runningapps);
initListener();
}
private void initListener() {
findViewById(R.id.btn_selectall).setOnClickListener(this);
findViewById(R.id.btn_select_inverse).setOnClickListener(this);
findViewById(R.id.btn_cleanprocess).setOnClickListener(this);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Object object=mListView.getItemAtPosition(position);
if(object!=null & object instanceof TaskInfo){
TaskInfo info=(TaskInfo) object;
if(info.packageName.equals(getPackageName())){
return;
}
info.isChecked=!info.isChecked;
adapter.notifyDataSetChanged();
}
}
});
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if(firstVisibleItem>=userTaskInfos.size()+1){
mProcessNumTV.setText("系统进程: "+sysTaskInfos.size()+"个");
}else{
mProcessNumTV.setText("用户进程: "+userTaskInfos.size()+"个");
}
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.imgv_leftbtn:
finish();
break;
case R.id.imgv_rightbtn:
//startActivity(new Intent(this,ProcessManagerAdapter.class));
break;
case R.id.btn_selectall:
selectAll();
break;
case R.id.btn_select_inverse:
inverse();
break;
case R.id.btn_cleanprocess:
cleanProcess();
break;
}
}
private void cleanProcess() {
manager=(ActivityManager)getSystemService(ACTIVITY_SERVICE);
int count=0;
long saveMemory=0;
List<TaskInfo>killedtaskInfos=new ArrayList<>();
for(TaskInfo info:userTaskInfos){
if(info.isChecked){
count++;
saveMemory+=info.appMemory;
manager.killBackgroundProcesses(info.packageName);
killedtaskInfos.add(info);
}
}
for(TaskInfo info:sysTaskInfos){
if(info.isChecked){
count++;
saveMemory+=info.appMemory;
manager.killBackgroundProcesses(info.packageName);
killedtaskInfos.add(info);
}
}
for(TaskInfo info:killedtaskInfos){
if(info.isUserApp){
userTaskInfos.remove(info);
}else{
sysTaskInfos.remove(info);
}
}
runningProcessCount-=count;
mRunProcessNum.setText("运行中的进程: "+runningProcessCount);
mMemoryTV.setText("可用/总内存: "+Formatter.formatFileSize(this,SystemInfoUtils.getAvailMem(this))+"/"+Formatter.formatFileSize(this,totalMem));
Toast.makeText(this,"清理了"+count+"个进程,释放了"+Formatter.formatFileSize(this,saveMemory)+"内存",Toast.LENGTH_LONG).show();
mProcessNumTV.setText("用户进程: "+userTaskInfos.size()+"个");
adapter.notifyDataSetChanged();
}
private void inverse() {
for(TaskInfo taskInfo:userTaskInfos){
if(taskInfo.packageName.equals(getPackageName())){
continue;
}
boolean checked=taskInfo.isChecked;
taskInfo.isChecked=!checked;
}
for(TaskInfo taskInfo:sysTaskInfos){
boolean checked=taskInfo.isChecked;
taskInfo.isChecked=!checked;
}
adapter.notifyDataSetChanged();
}
private void selectAll() {
for(TaskInfo taskInfo: userTaskInfos){
if(taskInfo.packageName.equals(getPackageName())){
continue;
}
taskInfo.isChecked=true;
}
for(TaskInfo taskInfo: sysTaskInfos){
taskInfo.isChecked=true;
}
adapter.notifyDataSetChanged();
}
}
到此,进程管理功能就完成了。