###1.设备进程信息获取
获取设备运行进程

ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> runningAppProcessInfos = am.getRunningAppProcesses();

获取设备RAM

MemoryInfo outInfo = new ActivityManager.MemoryInfo();
am.getMemoryInfo(outInfo);
outInfo.availMem;//设备可用RAM
outInfo.totalMem;//设备总RAM

###2.获取进程占用RAM
ActivityManager am = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
MemoryInfo[] processMemoryInfo = am.getProcessMemoryInfo(new int[]{info.pid});
long memSize = processMemoryInfo[0].getTotalPrivateDirty()*1024;

###3.ListView中Item中有CheckBox、Button等的焦点处理
ListView的item布局中有CheckBox、Button等会获取焦点的控件会抢走焦点,造成ListView的item点击事件相应不了

解决方法:控件设置

android:clickable="false"
android:focusable="false"

或者

android:focusable="false"
//descendant 后裔; 后代; (由过去类似物发展来的) 派生物; 弟子;
android:descendantFocusability="blocksDescendants"

###10.ListView中getItemAtPosition()的使用
ListView的getItemAtPosition()方法的返回值即为adapter中getItem()方法返回的对象

###4.清理进程
1.添加权限
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
2.具体实现
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
am.killBackgroundProcesses(String pkgName);

 package com.hb.mobilesafe.activities;

 import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.MemoryInfo;
import android.graphics.Color;
import android.os.Bundle;
import android.text.format.Formatter;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView; import com.hb.demo_mobilesafe.R;
import com.hb.mobilesafe.bean.ProInfo;
import com.hb.mobilesafe.utils.ProgressInfoUtil; public class ProcessManagerActivity extends Activity implements OnClickListener {
private TextView tv_clean,tv_allselect,tv_inverse;
private ListView lv_progress_show;
private TextView tv_progres_ssoft,tv_storage;
private TextView tv_software_count;
private List<ProInfo> infosRun;
private List<ProInfo> userInfo;
private List<ProInfo> sysInfo;
private MyProAdapter adapter;
private ActivityManager am;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_processmanager);
initView();
initDate();
} private void initView() {
tv_clean=(TextView) findViewById(R.id.tv_clean);
tv_allselect=(TextView) findViewById(R.id.tv_allselect);
tv_inverse=(TextView) findViewById(R.id.tv_inverse); tv_progres_ssoft=(TextView) findViewById(R.id.tv_progres_ssoft);
tv_storage=(TextView) findViewById(R.id.tv_storage);
tv_software_count=(TextView) findViewById(R.id.tv_software_count); lv_progress_show=(ListView) findViewById(R.id.lv_progress_show); tv_clean.setOnClickListener(this);
tv_allselect.setOnClickListener(this);
tv_inverse.setOnClickListener(this);
}
private void initDate() { tv_progres_ssoft.setText("运行中的进程:"+getRunpro()+"个");
tv_storage.setText("可用内存/总内存:"+Formatter.formatFileSize(this, getAvimen())
+"/"+Formatter.formatFileSize(this, getTotalMen()));
adapter = new MyProAdapter();
sysInfo = new ArrayList<ProInfo>();
userInfo = new ArrayList<ProInfo>();
new Thread(){
public void run() {
infosRun = ProgressInfoUtil.getInfosRun(ProcessManagerActivity.this);
isSysUserApp();
runOnUiThread(new Runnable() {
public void run() {
lv_progress_show.setAdapter(adapter);
}
});
};
}.start();
lv_progress_show.setOnScrollListener(new OnScrollListener() { @Override
public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if(userInfo!=null && sysInfo !=null){ if(firstVisibleItem==0){
tv_software_count.setVisibility(View.GONE);
}else{ tv_software_count.setVisibility(View.VISIBLE);
}
if(firstVisibleItem <userInfo.size()){
tv_software_count.setText("用户进程:"+userInfo.size());
}else{
tv_software_count.setText("系统进程:"+sysInfo.size());
}
}
}
});
lv_progress_show.setOnItemClickListener(new OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
if(position == 0 || position == userInfo.size()+1){
return;
}else if(position < userInfo.size()+1){ int newPosition=position -1;
boolean isCheck = userInfo.get(newPosition).isCheck();
if(isCheck){ userInfo.get(newPosition).setCheck(false);
}else{ userInfo.get(newPosition).setCheck(true);
}
}else{
int newPosition=position-userInfo.size()-2;
boolean isCheck = sysInfo.get(newPosition).isCheck();
if(isCheck){
sysInfo.get(newPosition).setCheck(false);
}else{ sysInfo.get(newPosition).setCheck(true);
}
}
adapter.notifyDataSetChanged();
}
});
} /**
* 一键清理,全选,反选
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.tv_clean:
am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
Iterator<ProInfo> userIterator = userInfo.iterator();
Iterator<ProInfo> sysIterator = sysInfo.iterator();
while (userIterator.hasNext()) {
ProInfo next = userIterator.next();
if(next.isCheck()){
am.killBackgroundProcesses(next.getAppPackageName());
userIterator.remove();
}
}
while (sysIterator.hasNext()) {
ProInfo next = sysIterator.next();
if(next.isCheck()){
am.killBackgroundProcesses(next.getAppPackageName());
sysIterator.remove();
}
}
adapter.notifyDataSetChanged(); break; case R.id.tv_allselect:
for (ProInfo infos : infosRun) {
if(!"com.hb.demo_mobilesafe".equals(infos.getAppPackageName())){
infos.setCheck(true);
}
}
adapter.notifyDataSetChanged();
break; case R.id.tv_inverse: for (ProInfo infos : infosRun) {
if(infos.isCheck() && !("com.hb.demo_mobilesafe").equals(infos.getAppPackageName())){
infos.setCheck(false);
}else if(!infos.isCheck() && !("com.hb.demo_mobilesafe").equals(infos.getAppPackageName())){
infos.setCheck(true);
} }
adapter.notifyDataSetChanged();
break;
}
}
/**
* 运行中的进程
* @return
*/
private int getRunpro(){
ActivityManager am=(ActivityManager) getSystemService(ACTIVITY_SERVICE);
int size = am.getRunningAppProcesses().size();
return size; }
/**
* 可用内存
*/
private long getAvimen(){
ActivityManager am=(ActivityManager) getSystemService(ACTIVITY_SERVICE);
MemoryInfo outInfo = new MemoryInfo();
am.getMemoryInfo(outInfo);
return outInfo.availMem; }
/**
* 总内存
*/
private long getTotalMen(){
ActivityManager am=(ActivityManager) getSystemService(ACTIVITY_SERVICE);
MemoryInfo outInfo = new MemoryInfo();
am.getMemoryInfo(outInfo);
return outInfo.totalMem; }
/**
* 区分系统应用和用户应用
*/
public void isSysUserApp(){ for (ProInfo proInfo: infosRun) {
boolean sys = proInfo.isSys();
if(sys){
sysInfo.add(proInfo);
}else{
userInfo.add(proInfo); }
}
}
class MyProAdapter extends BaseAdapter{
@SuppressWarnings("null")
@SuppressLint("ViewHolder") @Override
public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder = null;
if(view != null && view instanceof RelativeLayout){
holder=(ViewHolder) view.getTag();
}else{
holder=new ViewHolder();
view = View.inflate(ProcessManagerActivity.this, R.layout.proinfo_item, null);
holder.iv_appIcon=(ImageView) view.findViewById(R.id.iv_pro_icon);
holder.tv_appName=(TextView) view.findViewById(R.id.tv_pro_name);
holder.tv_proSize=(TextView) view.findViewById(R.id.tv_pro_size);
holder.cb_isCheck=(CheckBox) view.findViewById(R.id.cb_ischeak);
view.setTag(holder);
}
if(position == 0){
TextView tv0= new TextView(ProcessManagerActivity.this);
if(userInfo.size()==0){
tv0.setHeight(0);
return tv0;
}
tv0.setClickable(false);
tv0.setTextColor(Color.WHITE);
tv0.setBackgroundColor(Color.GRAY);
tv0.setText("用户进程:"+userInfo.size());
return tv0;
}else if(position ==userInfo.size()+1){
TextView tv1= new TextView(ProcessManagerActivity.this);
tv1.setClickable(false);
tv1.setTextColor(Color.WHITE);
tv1.setBackgroundColor(Color.GRAY);
tv1.setText("系统进程:"+sysInfo.size());
return tv1;
}else if(position <userInfo.size()+1){
int newPosition = position-1;
ProInfo proInfo = userInfo.get(newPosition);
holder.iv_appIcon.setImageDrawable(proInfo.getAppIcon());
holder.tv_appName.setText(proInfo.getAppName());
holder.tv_proSize.setText("进程大小:"+Formatter.formatFileSize(ProcessManagerActivity.this, proInfo.getProSize()));
holder.cb_isCheck.setChecked(proInfo.isCheck());
String appPackageName = proInfo.getAppPackageName();
if(appPackageName.equals(getPackageName())){
holder.cb_isCheck.setVisibility(View.GONE);
}else {
holder.cb_isCheck.setVisibility(View.VISIBLE);
} }else{
int newPosition = position-userInfo.size()-2;
ProInfo proInfo = sysInfo.get(newPosition);
holder.iv_appIcon.setImageDrawable(proInfo.getAppIcon());
holder.tv_appName.setText(proInfo.getAppName());
holder.tv_proSize.setText("进程大小:"+Formatter.formatFileSize(ProcessManagerActivity.this, proInfo.getProSize()));
holder.cb_isCheck.setChecked(proInfo.isCheck());
}
return view;
}
@Override
public int getCount() {
return userInfo.size()+1+sysInfo.size()+1;
} @Override
public Object getItem(int position) {
return null;
} @Override
public long getItemId(int position) {
return 0;
}
}
class ViewHolder{
ImageView iv_appIcon;
CheckBox cb_isCheck;
TextView tv_appName;
TextView tv_proSize;
}
}

xml:

 <?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="match_parent"
android:gravity="center_horizontal" > <TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="46dp"
android:background="#A1FF80"
android:gravity="center_vertical"
android:text="进程管理"
android:textSize="20sp" /> <RelativeLayout
android:id="@+id/rl_size"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/tv_title" > <TextView
android:id="@+id/tv_progres_ssoft"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="运行中的进程:19个"
android:textSize="10sp" /> <TextView
android:id="@+id/tv_storage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="可用内存/总内存:20MB/60MB"
android:textSize="10sp" />
</RelativeLayout> <TextView
android:id="@+id/tv_software_count"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/rl_size"
android:background="#888888"
android:visibility="gone"
android:text="用户进程:5"
android:textColor="#ffffff"
/> <ListView
android:clickable="true"
android:id="@+id/lv_progress_show"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/ll"
android:layout_below="@id/tv_software_count" /> <LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="horizontal"
android:padding="2dip" > <TextView
android:id="@+id/tv_clean"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:background="@drawable/clean_button_selector"
android:textSize="15sp" /> <TextView
android:id="@+id/tv_allselect"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/select_btn_selector"
android:textSize="15sp" /> <TextView
android:id="@+id/tv_inverse"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/inverse_btn_selector"
android:textSize="15sp" />
</LinearLayout> </RelativeLayout>

Android项目实战_手机安全卫士进程管理的更多相关文章

  1. Android项目实战_手机安全卫士home界面

    # 安全卫士主页面# ###1.GridView控件 1.与ListView的使用方式差不多,也要使用数据适配器,通过设置android:numColumns控制显示几列 2.通过指定android: ...

  2. Android项目实战_手机安全卫士手机防盗界面

    #安全卫士手机防盗# ###1.Activity的任务栈 1.类似一个木桶,每层只能放一个木块,我们放入木块和取出木块的时候只能从最上面开始操作 ###2.Android中的坐标系![](http:/ ...

  3. Android项目实战_手机安全卫士splash界面

    - 根据代码的类型组织包结构 1. 界面 com.hb.mobilesafe.activities 2. 服务 com.hb.mobilesafe.services 3. 业务逻辑 com.hb.mo ...

  4. Android项目实战_手机安全卫士程序锁

    ###1.两个页面切换的实现1. 可以使用Fragment,调用FragmentTransaction的hide和show方法2. 可以使用两个布局,设置visibility的VISIABLE和INV ...

  5. Android项目实战_手机安全卫士系统加速

    ## 1.本地数据库自动更新的工作机制1. 开启一个服务,定时访问服务器2. 进行版本对比,如果最新版本比较高,获取需要更新的内容3. 将新内容插入到本地数据库中 ## 2.如何处理横竖屏切换1. 指 ...

  6. Android项目实战_手机安全卫士软件管家

    ###1.应用程序信息的flags 1. int flags = packageInfo.applicationInfo.flags2. 0000 0000 0000 0000 0000 0000 0 ...

  7. Android项目实战_手机安全卫士拦截骚扰

    ###1.骚扰拦截需求分析1.界面1.1 黑名单列表界面1.2 添加黑名单界面2.功能2.1 黑名单的添加.删除2.2 拦截电话2.3 拦截短信 ###2.黑名单数据库的创建1.分析需要的字段id 主 ...

  8. Android项目实战_手机安全卫士流量统计

    ## 1.抽屉控件SlidingDrawer:一定要配置android:handle(把手)和android:content(内容),并在子View中添加把手和内容的布局```java <Sli ...

  9. Android项目实战--手机卫士开发系列教程

    <ignore_js_op> banner131010.jpg (71.4 KB, 下载次数: 0) 下载附件  保存到相册 2 分钟前 上传   Android项目实战--手机卫士01- ...

随机推荐

  1. ACE in Action

    ACE in Action https://cdn.xgqfrms.xyz/web-ide/index.html TinyMCE https://panjiachen.github.io/vue-el ...

  2. [luoguP2896] [USACO08FEB]一起吃饭Eating Together(DP)

    传送门 由于 Di 只有 3 种情况,那么就很简单了 f[i][j][0] 表示前 i 个,且第 i 个变成 j 的 递增序列最小修改次数 f[i][j][1] 表示前 i 个,且第 i 个变成 j ...

  3. noip模拟赛 whzzt-Confidence

    分析:做着感觉像脑筋急转弯一样......因为空间的限制,存不下每一个数,所以用数学方法来解. 设t1=Σai - Σbi = aj - bj,t2=Σi*ai - Σi*bi = j*(aj - b ...

  4. poj 1562 简单深搜

    //搜八个方向即可 #include<stdio.h> #include<string.h> #define N 200 char ma[N][N]; int n,m,vis[ ...

  5. Mysql 练习题 及 答案

    --1.学生表 Student(S,Sname,Sage,Ssex) --S 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表  Course(C,Cname,T ...

  6. Docker Command

    1. #docker inspect id           这个命令给出和容器相关的所有信息(https://www.imooc.com/video/15730) 2. #docker searc ...

  7. java包静态导入,继承

    /** * 静态导入 */package cn.sxt.gao;import cn.sxt.oo.*;//用别的包的类需要导入别的包,表示该包下所有类全部导入import java.util.Date ...

  8. Spring Boot在开发时实现热部署(开发时修改文件保存后自动重启应用)(spring-boot-devtools)

    热部署是什么 大家都知道在项目开发过程中,常常会改动页面数据或者修改数据结构,为了显示改动效果,往往需要重启应用查看改变效果,其实就是重新编译生成了新的Class文件,这个文件里记录着和代码等对应的各 ...

  9. Ubuntu 16.04安装搜索拼音输入法

    Linux下唯一一款大厂出的输入法 1.下载 http://pinyin.sogou.com/linux/?r=pinyin 2.安装 sudo dpkg -i sogoupinyin_2.1.0.0 ...

  10. 网卡MAC地址异常会导致无接受数据包,表现为只有发送没有接收

    遇到一个诡异的问题,一块4口博通千兆网卡中两个正常,两个怎么都没有接受,但是博通的程序网卡自检没有任何问题,最后发现是MAC地址的原因.需要将地址改为正常MAC方可正常通讯. 感觉应该是交换机丢弃了M ...