程序锁实际上就是一个看门狗的服务,在一个死循环中不停的检查系统程序的运行信息。
这里在设置界面新增一个开启开门狗的控件:
<com.ustc.mobilemanager.ui.SettingItemView
owndefine:title="程序锁设置"
owndefine:desc_on="看门狗已经开启"
owndefine:desc_off="看门狗已经关闭"
android:id="@+id/siv_watchdog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
设置的:
watchdogIntent = new Intent(this, WatchDogService.class);
siv_watchdog.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (siv_watchdog.isChecked()) {
// 变为非选中状态
siv_watchdog.setChecked(false);
stopService(watchdogIntent);
} else {
// 变为选择的状态
siv_watchdog.setChecked(true);
startService(watchdogIntent);
}
}
});
boolean isWatchDogServiceRunning = ServiceUtils.isServiceRunning(
SettingActivity.this,
"com.ustc.mobilemanager.service.WatchDogService");
if (isWatchDogServiceRunning) {
// 变为选择的状态
siv_watchdog.setChecked(true);
} else {
// 变为非选中状态
siv_watchdog.setChecked(false);
}
启动Service,根据Service的运行状态决定CheckBox的勾选。
看门狗的逻辑:
通过ActivityManager的getRunningTasks得到运行的任务栈,取出栈顶的Activity,可以得到他的包名,然后根据包名去数据库查询,如果在数据库中,则跳转到输入密码的界面中。整个放在死循环中进行:
package com.ustc.mobilemanager.service;
import java.util.List;
import com.ustc.mobilemanager.EnterPwdActivity;
import com.ustc.mobilemanager.db.dao.AppLockDao;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
/**
*
* 程序锁的功能后台服务,监视系统程序的运行信息
*
* @author
*
*/
public class WatchDogService extends Service {
private static final String TAG = "WatchDogService";
private ActivityManager am;
private AppLockDao dao;
private boolean flag;
@Override
public void onCreate() {
dao = new AppLockDao(this);
am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
flag = true;
new Thread(new Runnable() {
@Override
public void run() {
while (flag) {
List<RunningTaskInfo> infos = am.getRunningTasks(100);
String packageName = infos.get(0).topActivity
.getPackageName();
Log.i(TAG, "WatchDogService当前用户操作的包名:-->packageName:"
+ packageName);
if (dao.find(packageName)) {
// 当前应用需要保护,弹出来一个输入密码的界面
Intent intent = new Intent(getApplicationContext(),
EnterPwdActivity.class);
// 服务是没有任务栈的,在服务中开启activity,要指定这个activity运行的任务栈
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
try {
Thread.sleep(50);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
super.onCreate();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
flag = false;
super.onDestroy();
}
}
如果程序加锁了,当点击这个程序的时候,则会提示你输入密码: