手机安全卫士第八天实现的功能:
对第七天进程页面的补充,实现的对进程的清理。
首先第一个实现的是点击一个ListView的item CheckBox的钩钩会发生相应的变化,由于CheckBox是Button的一个子类,所有CheckBox默认是获取item上的焦点的,为了给用户更好的体验(即不用特意点CheckBox,直接点item即可改变CheckBox),所有要使CheckBox失去焦点和点击事件,让用户点击item即可对CheckBox进行改变,所有在CheckBox控件中增加如下属性。
android:focusable="false"
android:clickable="false"
<span style="font-size:14px;"> <CheckBox
android:id="@+id/tv_app_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:paddingRight="5.0dip"
android:focusable="false"
android:clickable="false"
android:button="@drawable/btn_check"
/></span>
然后实现点击item改变CheckBox
<span style="font-size:14px;">if (taskInfo.isChecked()) {
taskInfo.setChecked(false);
holder.tv_app_status.setChecked(false);
} else {
taskInfo.setChecked(true);
holder.tv_app_status.setChecked(true);
}</span>
显示在界面上
<span style="font-size:14px;">if (taskInfo.isChecked()) {
holder.tv_app_status.setChecked(true);
} else {
holder.tv_app_status.setChecked(false);
}</span>
然后给给页面增加4个按钮分别实现了全选,反选,清理,和设置的功能,首先实现全选的功能,首先判断该item是属性用户还是系统的,然后给ChecxBox设置一个true,最后刷新下界面,反选的实现和全选类似,只不过设置的ChecxBox和原来的全部取反而已。
/**
* 全选的按钮
*
* @param view
*/
public void selectAll(View view) {
for (TaskInfo taskInfo : mUserTaskInfos) {
// 判断当前的用户程序是不是自己的程序。如果是自己的程序。那么就把文本框隐藏
if (taskInfo.getPackageName().equals(getPackageName())) {
continue;
}
taskInfo.setChecked(true);
}
for (TaskInfo taskInfo : mSystemTaskInfos) {
taskInfo.setChecked(true);
}
//刷新界面
mTaskManagerAdapter.notifyDataSetChanged();
}
/**
* 反选的按钮
*
* @param view
*/
public void selectOppsite(View view) {
for (TaskInfo taskInfo : mUserTaskInfos) {
if (taskInfo.getPackageName().equals(getPackageName())) {
continue;
}
taskInfo.setChecked(!(taskInfo.isChecked()));
}
for (TaskInfo taskInfo : mSystemTaskInfos) {
taskInfo.setChecked(!(taskInfo.isChecked()));
}
//刷新界面
mTaskManagerAdapter.notifyDataSetChanged();
}
然后实现的是清理进程的功能,清理进程分为清理系统进程和用户进程而且要实现的显示现在存在多少个进程,所有要给TextView每次清理都要设置一个值,清理进程需要使用迭代进行清理,但是在迭代的过程中是不能减少集合的数据的,所有要重新设置一个集合,把要清理的继承添加到集合,然后把新集合进行迭代的时候,使用原来的系统进程和用户进程进行删除,删除之后显示清理了多少个进程和释放了多少内存资源。
/**
* 清理进程
*
* @param view
*/
public void killProcess(View view) {
// 清理的总共的进程个数
int totalCount = 0;
// 清理的进程的大小
int killMem = 0;
// 清理进程的集合
List<TaskInfo> killTaskInfos = new ArrayList<TaskInfo>();
// 想杀死进程。首先必须得到进程管理器
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
/**
* 注意: 当集合在迭代的时候。不能修改集合的大小
*/
for (TaskInfo taskInfo : mUserTaskInfos) {
if (taskInfo.isChecked()) {
killTaskInfos.add(taskInfo);
totalCount++;
killMem += taskInfo.getMemorySize();
}
}
for (TaskInfo taskInfo : mSystemTaskInfos) {
if (taskInfo.isChecked()) {
totalCount++;
killMem += taskInfo.getMemorySize();
killTaskInfos.add(taskInfo);
}
}
for (TaskInfo taskInfo : killTaskInfos) {
if (taskInfo.isUserApp()) {
mUserTaskInfos.remove(taskInfo);
// 杀死进程 参数表示包名
activityManager.killBackgroundProcesses(taskInfo.getPackageName());
} else {
mSystemTaskInfos.remove(taskInfo);
activityManager.killBackgroundProcesses(taskInfo.getPackageName());
}
}
UIUtils.showToast(
TaskManagerActivity.this,
"共清理"
+ totalCount
+ "个进程,释放"
+ Formatter.formatFileSize(TaskManagerActivity.this,
killMem) + "内存");
//mProcessCount 表示总共有多少个进程
//totalCount 当前清理了多少个进程
mProcessCount -= totalCount;
tv_task_process_count.setText("进程:" + mProcessCount + "个");
//
tv_task_memory.setText("剩余/总内存:"
+ Formatter.formatFileSize(TaskManagerActivity.this, mAvailMem + killMem)
+ "/"
+ Formatter.formatFileSize(TaskManagerActivity.this, mTotalMem));
mTaskManagerAdapter.notifyDataSetChanged();
}
然后提供两个选择供用户选择,显示和隐藏系统集成,是否在锁屏后自动清理进程,该页面的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
style="@style/TitleStyle"
android:text="进程管理设置"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<CheckBox
android:id="@+id/cb_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示系统进程"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<CheckBox
android:id="@+id/cb_status_kill_process"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="定时清理进程"/>
</LinearLayout>
</LinearLayout>
//点击按钮跳转到该页面:
<pre name="code" class="java"> /**
* 打开设置界面
*
* @param view
*/
public void openSetting(View view) {
Intent intent = new Intent(this, TaskManagerSettingActivity.class);
startActivity(intent);
}
跳转到设置界面后,分别对两个CheckBix进程监听,一个实现了对系统进程的显示和隐藏,另一个实现了用一个服务+广播 在锁屏后自动清理进程。
public class TaskManagerSettingActivity extends AppCompatActivity {
private CheckBox cbStatus;
private CheckBox cbStatusKillProcess;
private SharedPreferences mPref;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initUI();
}
private void initUI() {
setContentView(R.layout.activity_task_manager_setting);
mPref = getSharedPreferences("config", 0);
cbStatus = (CheckBox) findViewById(R.id.cb_status);
cbStatus.setChecked(mPref.getBoolean("is_show_system", false));
cbStatus.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
mPref.edit().putBoolean("is_show_system", true).commit();
} else {
mPref.edit().putBoolean("is_show_system", false).commit();
}
}
});
cbStatusKillProcess = (CheckBox) findViewById(R.id.cb_status_kill_process);
final Intent intent = new Intent(this, KillProcessService.class);
cbStatusKillProcess.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
startService(intent);
} else {
stopService(intent);
}
}
});
}
@Override
protected void onStart() {
super.onStart();
if (SystemInfoUtils.isServiceRunning(TaskManagerSettingActivity.this, "com.daizhihao.mobilesafe.services.KillProcessService")) {
cbStatusKillProcess.setChecked(true);
} else {
cbStatusKillProcess.setChecked(false);
}
}
}
然后写一个服务实现锁屏后
清理进程
public class KillProcessService extends Service {
private LockScreenReceiver receiver;
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
private class LockScreenReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//获取到进程管理器
ActivityManager activityManager = (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE);
//获取到手机上面所以正在运行的进程
List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo runningAppProcessInfo : appProcesses) {
activityManager.killBackgroundProcesses(runningAppProcessInfo.processName);
}
}
}
@Override
public void onCreate() {
super.onCreate();
receiver = new LockScreenReceiver();
//锁屏的过滤器
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
//注册一个锁屏的广播
registerReceiver(receiver, filter);
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
//当应用程序推出的时候。需要把广播反注册掉
unregisterReceiver(receiver);
//手动回收
receiver = null;
}
}
GitHub下载地址:https://github.com/AndroidDai/mobliesafe/tree/master/MobileSafe