在锁屏广播中关闭看门狗功能,在屏幕解锁的广播中开启看门狗功能
public
class
WatchDogService
extends
Service {
protected
static
final
String
TAG
=
"WatchDogService"
;
private
ActivityManager
am
;
private
boolean
flags
;
private
AppLockDao
dao
;
private
pauseProtectBroad
ppbreceiver
;
private
ScreenLockReceiver
lockReceiver
;
private
List<String>
tempStopProtectPacknames
;
private
ScreenUnlockReceiver
unlockReceiver
;
@Override
public
IBinder onBind(Intent intent) {
return
new
MyBind();
}
/**
* 3. 创建代理人类继承服务中的Binder ,实现 watchdogInference接口 ; 在代理人 类中实现接口中未实现的方法
*
@author
Administrator
*
*/
public
class
MyBind
extends
Binder
implements
WatchDogInference{
@Override
public
void
getMethod(String pakagename) {
temStopProtect(pakagename);
//调用服务中的方法
}
}
/**
* 1.服务内部的方法,把临时停止保护的应用程序的包名加入到集合里面
*
@param
pakage_name
*/
public
void
temStopProtect(String pakage_name){
tempStopProtectPacknames
.add(pakage_name);
}
/**
* 注册自定义广播事件, 拿到watchdogActivity返回过来的包名,并告诉看门狗该应用暂时不用保护了
*/
public
class
pauseProtectBroad
extends
BroadcastReceiver{
@Override
public
void
onReceive(Context context, Intent intent) {
String pkgname = intent.getStringExtra(
"pkgname"
);
//得到暂停保护的包名
tempStopProtectPacknames
.add(pkgname);
//将包名装进暂停保护的集合中
}
}
/**
* 注册当屏幕锁屏时的广播事件: 从暂时不受密码保护的集合中去掉该包名
*
@author
Administrator
*
*/
private
class
ScreenLockReceiver
extends
BroadcastReceiver{
@Override
public
void
onReceive(Context context, Intent intent) {
//屏幕锁屏
tempStopProtectPacknames
.clear();
flags
=
false
;
}
}
/**
* 屏幕解锁时开启看门狗
*
@author
Administrator
*
*/
private
class
ScreenUnlockReceiver
extends
BroadcastReceiver {
@Override
public
void
onReceive(Context context, Intent intent) {
if
(!
flags
) {
// 屏幕解锁
startWatchDogThread();
}
}
}
/**
* 服务开启时
*/
@Override
public
void
onCreate() {
Log. i(
TAG
,
"开启服务"
);
tempStopProtectPacknames
=
new
ArrayList<String>();
//当服务开启时开启初始化pass集合的广播
ppbreceiver
=
new
pauseProtectBroad();
IntentFilter filter=
new
IntentFilter();
filter.addAction(
"this.activity.not.protected"
);
registerReceiver(
ppbreceiver
, filter);
//当服务开启时开启清空pass集合的广播 锁屏广播
lockReceiver
=
new
ScreenLockReceiver();
IntentFilter lockFilter =
new
IntentFilter();
lockFilter.addAction(Intent.
ACTION_SCREEN_OFF
);
registerReceiver(
lockReceiver
, lockFilter);
//解锁广播
unlockReceiver
=
new
ScreenUnlockReceiver();
IntentFilter unlockFilter =
new
IntentFilter();
unlockFilter.addAction(Intent.
ACTION_SCREEN_ON
);
registerReceiver(
unlockReceiver
, unlockFilter);
dao
=
new
AppLockDao(getApplicationContext());
//1.创建activity管理员
am
=(ActivityManager) getSystemService(
ACTIVITY_SERVICE
);
//2.开启看门狗
startWatchDogThread();
super
.onCreate();
}
/**
* 看门狗功能
*/
private
void
startWatchDogThread() {
//2.看门狗在服务开启时不停的监视着后台正在运行的程序
new
Thread(){
public
void
run() {
flags
=
true
;
while
(
flags
){
//获取正在运行的任务栈 3:可以任意定义,表示近期开启的3个任务栈
List<RunningTaskInfo> runningTasks =
am
.getRunningTasks(3);
//最上层的任务栈: 刚打开的应用程序的任务栈
RunningTaskInfo runningTaskInfo = runningTasks.get(0);
//得到刚刚开启的应用程序的activity的名称
String packageName = runningTaskInfo.
topActivity
.getPackageName();
//判断得到的包名的应用是否在已加锁的数据库中
if
(
dao
.find(packageName)){
if
(!
tempStopProtectPacknames
.contains(packageName)){
//如果暂停保护集合中存在该包名
Log. i(
TAG
,
"弹出提示输入密码的activity"
);
Intent intent=
new
Intent(getApplicationContext(),WatchDogActivity.
class
);
intent.setFlags(Intent.
FLAG_ACTIVITY_NEW_TASK
);
//开启新任务栈
intent.putExtra(
"packageName"
, packageName);
startActivity(intent);
}
try
{
Thread. sleep(50);
}
catch
(InterruptedException e) {
e.printStackTrace();
}
}
}
};
}.start();
}
/**
* 服务销毁时
*/
public
void
onDestroy() {
Log. i(
TAG
,
"关闭服务..."
);
flags
=
false
;
//服务关闭时关闭关门狗
//服务关闭时终止自定义广播
ppbreceiver
.abortBroadcast();
lockReceiver
.abortBroadcast();
unlockReceiver
.abortBroadcast();
};
}