Android项目实战_手机安全卫士进程管理
###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项目实战_手机安全卫士进程管理的更多相关文章
- Android项目实战_手机安全卫士home界面
# 安全卫士主页面# ###1.GridView控件 1.与ListView的使用方式差不多,也要使用数据适配器,通过设置android:numColumns控制显示几列 2.通过指定android: ...
- Android项目实战_手机安全卫士手机防盗界面
#安全卫士手机防盗# ###1.Activity的任务栈 1.类似一个木桶,每层只能放一个木块,我们放入木块和取出木块的时候只能从最上面开始操作 ###2.Android中的坐标系和android:content(内容),并在子View中添加把手和内容的布局```java <Sli ...
- Android项目实战--手机卫士开发系列教程
<ignore_js_op> banner131010.jpg (71.4 KB, 下载次数: 0) 下载附件 保存到相册 2 分钟前 上传 Android项目实战--手机卫士01- ...
随机推荐
- HDU 2604 矩阵快速幂
题目大意 给定长度为l的只有f,m两种字母 的序列,问不出现fff,fmf的序列个数有多少个 每次的下一个状态都与前一次状态的后两个字母有关 比如我令mm : 0 , mf : 1 , fm : 2 ...
- Codeforces Round #240 (Div. 2) C Mashmokh and Numbers
, a2, ..., an such that his boss will score exactly k points. Also Mashmokh can't memorize too huge ...
- noip模拟赛 密码
题目描述 YJC把核弹发射密码忘掉了……其实是密码被加密了,但是YJC不会解密.密码由n个数字组成,第i个数字被加密成了如下形式:第k小的满足(2^L)|(P-1)且P为质数的P.YJC希望你能帮他算 ...
- Ubuntu 16.04安装Chrome浏览器
一.先有一个hosts能访问Google 参考:http://www.cnblogs.com/EasonJim/p/5999060.html 二.安装方法有两种,如下所示: 1.下载deb包(推荐) ...
- [JavaEE] Create API documents with Swagger
We mainly need to modify our Model and REST endpoint code to enable swagger Document. model/Book.jav ...
- Ajax跨域、Json跨域、Socket跨域和Canvas跨域等同源策略限制的解决方法
同源是指同样的协议.域名.port,三者都同样才属于同域.不符合上述定义的请求,则称为跨域. 相信每一个开发者都曾遇到过跨域请求的情况,尽管情况不一样,但问题的本质都能够归为浏览器出于安全考虑下的同源 ...
- 一个unity3d lightmap问题
上周美术同学在使用unity3d制作lightmap的过程中,发现部分被lightmap影响的模型在移动端上效果与pc端不一致.当时我大概看了下,分析后,得到一个结论是“在移动端上lightmap的h ...
- 5分钟Serverless实践 | 构建无服务器图片鉴黄Web应用
Serverless是什么 Serverless中文译为“无服务器”,最早可以追溯到2012年Ken Fromm发表的<Why The Future Of Software And Apps I ...
- shell 字符串拼接 获取自身文件名 日志记录
shell 字符串拼接 获取自身文件名 日志记录 [root@hadoop2 xiaole_chk_url]# sh a.sh123.loga.sh[root@hadoop2 xiaole_chk_ ...
- POJ 3221 Diamond Puzzle.
~~~~ 题目链接:http://poj.org/problem? id=3221 显然是BFS找最优解.但是终止条件不好写.看到有一仅仅队交上去一直TLE. 比赛完了看题解原来是以目标状态为起点,B ...