[mobilesafe] 01_通过绑定服务方式——在输入密码成功调用看门狗服务里面方法临时不保护某个应用

Android 4.0

通过绑定服务方式——在输入密码成功调用看门狗服务里面方法临时不保护某个应用

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代表的应用