通过绑定服务方式——在输入密码成功调用看门狗服务里面方法临时不保护某个应用
1、当受保护的程序密码输入成功后,如何才能通知看门狗服务,不再监视这个输入正确密码的应用 分析:这也就是Activity和Service之间的通信问题 Service和外界通信/通讯问题,Service通信/通讯 解决1:发送自定义广播事件 在Activity自定义广播事件,发送广播;在Service中注册接收该自定义广播事件,当输入正确密码后,应该发送一条临时不保护该应用的自定义广播事件,Service收到该广播事件后,临时不保护该应用。 a) EnterPasswordActivity中发送自定义广播事件 // 解决1:1、发送自定义广播
Intent intent = new Intent();
intent.setAction("cn.zengfansheng.cancel");
intent.putExtra("packagename", packagename);
sendBroadcast(intent);// 发送自定义广播b) WatchDogService中接收广播事件 IntentFilter screenFilter = new IntentFilter();
screenFilter.addAction(Intent.ACTION_SCREEN_OFF);// 屏幕锁屏广播
registerReceiver(screenOffReceiver, screenFilter);/**
* 1、临时取消保护应用的广播接收者
* @author hacket
*/
private class CancelProtectApplication extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// 1、 得到临时要取消保护的应用程序的包名
String packagename = intent.getStringExtra("packagename");
// 2、然后将其加入临时不受保护的List集合中去
tempNoProtectAppPackageName.add(packagename);
}
}
|
解决2:绑定服务(Activity和Service进行绑定) 在看门狗服务里面,定义一个方法,此方法就是临时停止对某个应用的保护,通过接口暴露出去, 在Activity中,在onCreate()时,绑定服务(会返回一个Binder对象),在onDestroy()方法中,取消绑定服务;当输入正确密码后,调用Service中临时不保护某个程序的方法,临时取消对某个应用的保护。 a) WatchDogService定义一个方法:临时停止对某个应用的保护 /**
* 4、临时不保护某个指定包名的应用
* @param packageName 临时不受保护的应用的包名
*/
private void tempNoProtectAppPackageName(String packageName){
tempNoProtectAppPackageName.add(packageName);
}b) WatchDogService定义一个代理人,用来和外界进行通信的接口,实现IService,用来向外暴露,来提供调用服务内部的方法 /**
*5、代理人:用来连接Activity和Service之间进行通信的中间人
* @author hacket
*/
private class MyBinder extends Binder implements IService{//public class Binder implements IBinder
@Override
public void stopProtect(String packageName) {
tempNoProtectAppPackageName(packageName);
}
}c) WatchDogService返回代理人 @Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}d) EnterPasswordActivity中onCreate()方法中,绑定服务 // 3)绑定服务
Intent service = new Intent(this, WatchDogService.class);
conn = new MyServiceConnection();
int flags = BIND_AUTO_CREATE;// 一般用不到,自动创建,服务不在时,创建服务。
bindService(service, conn, flags);e) EnterPasswordActivity中onDestroy()方法中,停止绑定 // 4)onDestroy()时,停止绑定服务
@Override
protected void onDestroy() {
super.onDestroy();
if (conn != null) {// 停止服务绑定
unbindService(conn);
}
}f) EnterPasswordActivity中MyServiceConnection /**
* 3、用来接收服务绑定和开启的信息类
* Receives information as the service is started and stopped.
* @author hacket
*/
private class MyServiceConnection implements ServiceConnection {
// 1、服务绑定好
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iService = (IService) service;
}
// 2、服务失去绑定后
@Override
public void onServiceDisconnected(ComponentName name) {
}
}g)在输入密码成功后,调用看门狗方法,临时不保护某个应用 iService.stopProtect(packagename);// 临时不保护packagename代表的应用 |
|
|