基于android的手机安全卫士实现心得六

现在我们来实现进程管理功能。老规矩,首先来做界面。主界面首先是一个标题栏,下面是来显示进程个数和可用/总内存的,接下来是显示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();


    }
}

到此,进程管理功能就完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值