标签:
在程序锁中,当打开一个软件的时候,会短暂的出现软件的界面,然后再出现输入密码的界面,对此需要坐下修改:
第一个地方:
List<RunningTaskInfo> infos = am.getRunningTasks(1);原来的是100,我们在此只需要得到一个最近运行的task就可以了。
第二个地方:
以前在查询的时候,查询的是数据库,这样比较慢,改之查询内存,修改dao方法:
/** * 查询全部包名 */ public List<String> findAll(){ List<String> protectPacknames = new ArrayList<String>(); boolean result = false; SQLiteDatabase db = helper.getReadableDatabase(); Cursor cursor = db.query("applock", new String[]{"packname"}, null, null, null, null, null); if (cursor.moveToNext()) { protectPacknames.add(cursor.getString(0)); } cursor.close(); db.close(); return protectPacknames; }第三个地方:
在子线程外面定义Intent
第四个地方:
修改线程睡眠的时间为20秒。整体的代码修改后为:
package com.ustc.mobilemanager.service; import java.util.List; import android.app.ActivityManager; import android.app.ActivityManager.RunningTaskInfo; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.IBinder; import android.util.Log; import com.ustc.mobilemanager.EnterPwdActivity; import com.ustc.mobilemanager.db.dao.AppLockDao; /** * * 程序锁的功能后台服务,监视系统程序的运行信息 * * @author * */ public class WatchDogService extends Service { private static final String TAG = "WatchDogService"; private ActivityManager am; private AppLockDao dao; private boolean flag; private InnerReceiver receiver; private String tempStopProtectPackageName; private ScreenOffReceiver offReceiver; private List<String> protectPacknames; private Intent intent; @Override public void onCreate() { offReceiver = new ScreenOffReceiver(); registerReceiver(offReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF)); receiver = new InnerReceiver(); registerReceiver(receiver, new IntentFilter( "com.ustc.mobilemanager.TEMPSTOP")); dao = new AppLockDao(this); am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); flag = true; intent = new Intent(getApplicationContext(), EnterPwdActivity.class); // 服务是没有任务栈的,在服务中开启activity,要指定这个activity运行的任务栈 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); new Thread(new Runnable() { @Override public void run() { while (flag) { @SuppressWarnings("deprecation") List<RunningTaskInfo> infos = am.getRunningTasks(1); String packageName = infos.get(0).topActivity .getPackageName(); // Log.i(TAG, "WatchDogService当前用户操作的包名:-->packageName:" // + packageName); protectPacknames = dao.findAll(); // if (dao.find(packageName)) {//查询数据库太慢了,消耗资源,改成查村内存 if(protectPacknames.contains(packageName)){//查询数据库太慢了,消耗资源,改成查村内存,效率很高 // 判断这个程序是否需要临时的停止保护 if (packageName.equals(tempStopProtectPackageName)) { } else { intent.putExtra("packageName", packageName); startActivity(intent); } } try { Thread.sleep(20); } catch (Exception e) { e.printStackTrace(); } } } }).start(); super.onCreate(); } @Override public IBinder onBind(Intent intent) { return null; } private class InnerReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.i(TAG, "接受到了临时停止保护广播的事件"); tempStopProtectPackageName = intent.getStringExtra("packageName"); } } private class ScreenOffReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { tempStopProtectPackageName = null; } } @Override public void onDestroy() { flag = false; unregisterReceiver(offReceiver); offReceiver = null; unregisterReceiver(receiver); receiver = null; super.onDestroy(); } }这样做的确带来了优化,但是也带来了bug,锁定第一个应用还可以,当锁定第二个的时候,就不行了,直接进入软件的界面。
标签:
原文地址:http://blog.csdn.net/chenfuduo_loveit/article/details/42269763