程序锁的看门狗

以下代码都不完全,数据库代码没加上
1、Activity的checkbox开启服务

public class SettingCenterActivity extends Activity {
private TextView tv_setting_applock;
private CheckBox cb_setting_applock;
private Intent watchdogintent;
private SharedPreferences sp;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        sp=getSharedPreferences("config", Context.MODE_PRIVATE);
        boolean islockserviceopen=sp.getBoolean("islockserviceopen", false);
        setContentView(R.layout.activity_setting_center);

        watchdogintent=new Intent(this,WatchDogService.class);
        cb_setting_applock=(CheckBox) findViewById(R.id.cb_setting_applock);
        tv_setting_applock=(TextView) findViewById(R.id.tv_setting_applock);
        if (islockserviceopen) {
            tv_setting_applock.setText("程序锁服务已经开启");
            cb_setting_applock.setChecked(true);
        }else {
            tv_setting_applock.setText("程序锁服务已经停止");
        }

        cb_setting_applock.setOnCheckedChangeListener(new OnCheckedChangeListener (){

            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {
                if (isChecked) {
                    tv_setting_applock.setText("程序锁服务已经开启");
                    startService(watchdogintent);
                }else {
                    stopService(watchdogintent);//ondestory->flag false->停止子线程
                    tv_setting_applock.setText("程序锁服务已经停止");
                }



            }});
    }

}

2、服务WatchDogService 代码

public class WatchDogService extends Service {

    private AppLockDao dao;
    private List<String> lockapps;
    private ActivityManager am;
    protected String TAG = "WatchDogService";
    private Intent lockappintent;
    private boolean flag;
    private List<String> tempstopapps;
    private MyBinder myBinder;

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return myBinder;
    }

    public class MyBinder extends Binder implements IService {

        @Override
        public void callAPPProtectStart(String packname) {
            appProtectStart(packname);
        }

        @Override
        public void callAPPProtectStop(String packname) {
            appProtectStop(packname);
        }

    }

    public void appProtectStart(String packname) {
        if (tempstopapps.contains(packname)) {
            tempstopapps.remove(packname);// 重新开启对应用的保护
        }

    }

    public void appProtectStop(String packname) {
        tempstopapps.add(packname);// 临时停止保护的packname放进来
    }

    @Override
    public void onCreate() {
        super.onCreate();
        myBinder = new MyBinder();
        dao = new AppLockDao(this);
        tempstopapps = new ArrayList<String>();
        flag = true;
        lockapps = dao.getAllApps();
        lockappintent = new Intent(this, LockScreenActivity.class);
        // 服务是不存在任务栈的,要在服务里面开启activity的话必须来添加这个flag
        lockappintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        new Thread() {
            public void run() {
                // 开启看门狗,是死循环的
                while (flag) {
                    try {
                        // 得到当前正在运行的包名
                        // 返回系统里面的任务栈的信息,taskinfos的集合里面只有一个元素,内容就是当前正在运行的进程对应的任务栈
                        List<RunningTaskInfo> taskinfos = am.getRunningTasks(1);
                        RunningTaskInfo currenttask = taskinfos.get(0);
                        // 获取当前用户可见的activity,所在的程序的包名
                        String packname = currenttask.topActivity
                                .getPackageName();
                        Log.i(TAG, "当前运行" + packname);
                        if (lockapps.contains(packname)) {
                            // 如果当前的应用程序需要临时的被终止保护
                            if (tempstopapps.contains(packname)) {

                                sleep(1000);
                                continue;// return,不能return,不然看门狗就挂掉,所以继续循环
                            }

                            Log.i(TAG, "需要锁定包名" + packname);
                            // 弹出来锁定的界面,让用户输入密码
                            lockappintent.putExtra("packname", packname);
                            startActivity(lockappintent);
                            // 在LockScreenActivity中 得到激活的意图,去拿到这包名 启动
                            // String
                            // packname=getIntent().getStringExtra("packname");

                        } else {
                            // 执行放行
                        }
                        sleep(1000);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

            }
        }.start();
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        flag = false;
    }

}

3、服务当中判断应用被锁,则开启输入密码进入这应用


public class LockScreenActivity extends Activity {
    private TextView tv_app_lock_pwd_name;
    private ImageView iv_app_lock_pwd_icon;
    private EditText et_app_lock_pwd;
    private SharedPreferences sp;
    String realpwd;
    private IService iService;
    private MyConn myconn;
    private String packname ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        myconn=new MyConn();
        sp = getSharedPreferences("config", Context.MODE_PRIVATE);
        realpwd = sp.getString("password", "");

        setContentView(R.layout.activity_app_lock_pwd);
        // 得到激活的意图,去拿到那包名
         packname = getIntent().getStringExtra("packname");

        et_app_lock_pwd = (EditText) findViewById(R.id.et_app_lock_pwd);
        iv_app_lock_pwd_icon = (ImageView) findViewById(R.id.iv_app_lock_pwd_icon);
        tv_app_lock_pwd_name = (TextView) findViewById(R.id.tv_app_lock_pwd_name);
        // 完成界面的初始化
        ApplicationInfo appinfo;
        try {
            appinfo = getPackageManager().getPackageInfo(packname, 0).applicationInfo;
            Drawable appicon = appinfo.loadIcon(getPackageManager());
            String appname = appinfo.loadLabel(getPackageManager()).toString();
            iv_app_lock_pwd_icon.setImageDrawable(appicon);
            tv_app_lock_pwd_name.setText(packname);

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    private void confirm(View v) {
        String password = et_app_lock_pwd.getText().toString().trim();
        if (TextUtils.isEmpty(password)) {
            Toast.makeText(this, "密码不能为空", 1).show();
            return;
        } else if (MD5Ecoder.encode(password).equals(realpwd)) {

//          通知看门狗,临时的对这个程序取消保护
            Intent intent=new Intent(this,WatchDogService.class);
            bindService(intent,  myconn, BIND_AUTO_CREATE);
            iService.callAPPProtectStop(packname);
            finish();
        } else {
            Toast.makeText(this, "密码输入错误", 1).show();
            return;
        }

    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            return true;// 阻止案件时间继续向下分发
        }
        return super.onKeyDown(keyCode, event);
    }
    private class MyConn implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            iService=(IService) service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub

        }

    }
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        unbindService(myconn);
    }

}

4、定义IService接口,主要完成服务与activity通信的接口,在接口里面调用服务里面的方法。

public interface IService {
    public void callAPPProtectStart(String packname);
    public void callAPPProtectStop(String packname);
}

5、清单文件中

   <service android:name="cn.itcast.mobilesafe.service.WatchDogService" >
        </service>
   <activity
            android:name="cn.itcast.mobilesafe.ui.LockScreenActivity"
            android:label="@string/app_lock_pwd" 
            android:launchMode="singleInstance"
            >
        </activity>
           <uses-permission android:name="android.permission.GET_TASKS"/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值