以下代码都不完全,数据库代码没加上
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"/>