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- ...
随机推荐
- [luoguP1433] 吃奶酪(DP || Dfs)
传送门 深搜加剪纸可A(O(玄学) 1274ms) ——代码 #include <cmath> #include <cstdio> #include <iostream& ...
- [K/3Cloud]进度条控件编程接口
进度条控件编程接口 1.启动进度查询 this.GetControl<ProgressBar>().Start(2) //每2秒查询一次进度 2.汇报进度 在插件中重载 OnQueryP ...
- 又见GCD
Problem Description 有三个正整数a,b,c(0<a,b,c<10^6),其中c不等于b.若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c. Input ...
- POJ 1523 SPF 割点 Tarjan
SPF Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9317 Accepted: 4218 Description C ...
- BZOJ(3) 1051: [HAOI2006]受欢迎的牛
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7365 Solved: 3937[Submit][Sta ...
- Cocos2d-x教程(34)-三维物体OBB碰撞检測算法
欢迎增加Cocos2d-x 交流群:193411763 个中心点.1个旋转矩阵和3个1/2边长(注:一个旋转矩阵包括了三个旋转轴,若是二维的OBB包围盒则是一个中心点,两个旋转轴,两个1/2边长). ...
- 架构师速成6.7-设计开发思路-uml
uml是什么东西?统一建模语言.一门语言.是用来进行软件设计的一门语言. 事实上一门语言的诞生并不伟大,让大多数人都使用才足够伟大. uml就是一门伟大的语言.由于眼下软件设计的唯一语言就是它. UM ...
- Caffe——清晰高效的深度学习(Deep Learning)框架
Caffe(http://caffe.berkeleyvision.org/)是一个清晰而高效的深度学习框架,其作者是博士毕业于UC Berkeley的贾扬清(http://daggerfs.com/ ...
- java中inputstream的使用
java中的inputstream是一个面向字节的流抽象类,其依据详细应用派生出各种详细的类. 比方FileInputStream就是继承于InputStream,专门用来读取文件流的对象,其详细继承 ...
- LeetCode 645. Set Mismatch (集合不匹配)
The set S originally contains numbers from 1 to n. But unfortunately, due to the data error, one of ...