90程序锁的优化

在程序锁中,当打开一个软件的时候,会短暂的出现软件的界面,然后再出现输入密码的界面,对此需要坐下修改:

第一个地方:

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,锁定第一个应用还可以,当锁定第二个的时候,就不行了,直接进入软件的界面。

时间: 2024-08-03 04:50:54

90程序锁的优化的相关文章

锁的优化及注意事项

"锁"的竞争必然会导致程序的整体性能下降,以下就是为了降低这种辐作用的建议:     1.减小锁持有时间 如果线程持有锁的时间很长,那么相对地,锁的竞争程度也就越激烈.程序开发应该尽可能地减少对某个锁的占有时间,以减少线程间互斥的可能. public synchronized void syncMethod(){ othercode1(); mutextMethod(); othercode2();} 优化后: public void syncMethod2(){ othercode1

Android安全问题 程序锁

导读:本文介绍如何实现对应用加锁的功能,无须root权限 某些人有时候会有这样一种需求,小A下载了个软件,只是软件中的美女过于诱惑与暴露,所以他不想让别人知道这是个什么软件,起码不想让别人打开浏 览.而这款软件又没有锁,任何人都可以打开,肿么办呢?如果打开它的时候需要输入密码,那该多好阿!于是,程序锁这种应用就产生了 程序锁不是最近才有的,很久之前android就有这种apk了 这一期我们来苛刻如何实现程序加锁功能 首先,我们先明确一下我们要做的程序具有什么功能 1可以选择需要加锁的程序 2可以

Synchronized锁性能优化偏向锁轻量级锁升级 多线程中篇(五)

不止一次的提到过,synchronized是Java内置的机制,是JVM层面的,而Lock则是接口,是JDK层面的 尽管最初synchronized的性能效率比较差,但是随着版本的升级,synchronized已经变得原来越强大了 这也是为什么官方建议使用synchronized的原因 毕竟,他是一个关键字啊,这才是亲儿子,Lock,终归差了一点 简单看下,synchronized大致都经过了哪些重要的变革 重量级锁 对于最原始的synchronized关键字,锁被称之为重量级锁 因为底层依赖监

002-多线程-锁-同步锁-synchronized几种加锁方式、Java对象头和Monitor、Mutex Lock、JDK1.6对synchronized锁的优化实现

一.synchronized概述基本使用 为确保共享变量不会出现并发问题,通常会对修改共享变量的代码块用synchronized加锁,确保同一时刻只有一个线程在修改共享变量,从而避免并发问题. synchronized结论: 1.java5.0之前,协调线程间对共享对象的访问的机制只有synchronized和volatile,但是内置锁在功能上存在一些局限性,jdk5增加了Lock以及ReentrantLock. 2.java5.0,增加了一种新的机制:显式锁ReentrantLock,注意它

二分查找实现(Jon Bentley:90%程序员无法正确实现)

二分查找实现(Jon Bentley:90%程序员无法正确实现)作者:July出处:结构之法算法之道引言Jon Bentley:90%以上的程序员无法正确无误的写出二分查找代码.也许很多人都早已听说过这句话,但我还是想引用<编程珠玑>上的如下几段文字:“二分查找可以解决(预排序数组的查找)问题:只要数组中包含T(即要查找的值),那么通过不断缩小包含T 的范围,最终就可以找到它.一开始,范围覆盖整个数组.将数组的中间项与T 进行比较,可以排除一半元素,范围缩小一半.就这样反复比较,反复缩小范围,

正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码

当我在窗体初始化的时候,调用了一个外部的dll,它就不知什么原因的 抛出一个“正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码”的异常,程序就卡掉了,在网上查了查,相关说明如下: .NET2.0中增加了42种非常强大的调试助手,MDA.Loaderlock 是其中之一.Loaderlock检测在一个拥有操作系统loader lock的线程上运行托管代码的情况.这样做有可能会引起死锁,并且有可能在操作系统加载器初始化DLL前被使用. 大致理解:就

c++程序的效率优化初涉

能写出稳定高效的程序一直是程序员所追求的,今天就和大家一起探讨一下关于C++程序优化的几点看法. 由于C/C++语言的复杂性,致使C++编译器隐藏了层层幔布,我们不经意的一条语句都可能是编译器幕后几经周折的结果,在要求程序高效运行的环境下,每一条语句都会让我们慎之又慎,而程序优化又是个十分广泛的话题,包括程序架构设计的优化,语言本身的优化,编程技巧和策略等等,如此大的范围非我能力所及,这里谈的优化就是在实际开发中遇到的问题. 一.  举手之劳的小差别 既然说优化就一定要仔细,不放过任何微小的细节

正试图在 os 加载程序锁内执行托管代码

正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码... 当我在窗体初始化的时候,调用了一个外部的dill时,它就不知什么原因的 抛出一个"正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码"的异常,程序就卡掉了,在网上查了查,相关说明如下: .NET2.0中增加了42种非常强大的调试助手,MDA.Loaderlock 是其中之一.Loaderlock检测在一个拥有操作系统loader

【Java多线程】锁的优化策略

锁的优化策略 编码过程中可采取的锁优化的思路有以下几种: 1:减少锁持有时间 例如:对一个方法加锁,不如对方法中需要同步的几行代码加锁: 2:减小锁粒度 例如:ConcurrentHashMap采取对segment加锁而不是整个map加锁,提高并发性: 3:锁分离 根据同步操作的性质,把锁划分为的读锁和写锁,读锁之间不互斥,提高了并发性. 4:锁粗化 这看起来与思路1有冲突,其实不然.思路1是针对一个线程中只有个别地方需要同步,所以把锁加在同步的语句上而不是更大的范围,减少线程持有锁的时间: 而