51.长点击事件
点击或者触摸事件方法的返回值,意义都是一样的:
如果方法返回true,代表事件到这儿就消费掉了、终止掉了;如果是false,代表事件到这儿没有处理完。
如果长点击事件返回值设为false,则点击事件也会响应,为了区别开点击事件和长点击事件的不同响应,可以把长点击事件的返回值设为true。
52.程序加密
写一个看门狗服务,不停的监视当前手机里面运行的应用程序信息。只要发现应用程序加密,就弹出输入密码的界面。为了能够不停的监视用户的操作,要把下面代码放到线程里面的while(true)方法中。所有应用的看门狗服务都是在while(true)方法中的。
创建看门狗服务时,一般设置一个flag,在开启服务时设置flag为true,停止服务时flag为false。while(true)改为while(flag)。锁屏时就没必要继续开启看门狗服务了,所以设置个flag有助于省电。
首先,用am可以获得正在运行的任务栈:
List<RunningTaskInfo> infos = am.getRunningTasks(1);
获得任务栈需要添加权限:GET_TASKS
参数是返回的最大个数。程序加密只判断当前用户所操作的任务栈,所以返回一个就可以了。返回的是当前正在运行的任务栈的列表。最近使用的任务栈在列表的最前面。
然后,用get(0)获得列表的第一个任务栈,即当前用户操作的任务栈,再获得任务栈的栈顶Activity,再获得该Activity所在的包名。也就是当前用户所操作应用程序的包名。
String packname = infos.get(0).topActivity.getPackageName();
得到包名后,判断该包名是否在数据库中,如果在数据库中说明已经加密,弹出输入密码的界面。
可以在设置界面中增加开启停止看门狗服务的设置,也可以写广播监听解屏、锁屏来开启和停止服务。
服务和广播是没有任务栈信息的,在服务或广播中开启Activity,要指定这个Activity运行的任务栈:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
程序内或不同程序之间的通信可以用自定义广播实现,并且自定义广播用的非常多。如输入密码正确时,通知服务暂停保护该应用程序,否则会一直弹出输入密码框。
输入密码的Activity不能放在手机安全卫士的任务栈里,这样会导致界面混乱,所以输入密码的Activity应该设置为单一实例的启动模式。
53.长按Home键不显示记录
有些应用为了保护用户的隐私,在长按Home键时,用户不想让自己玩过的界面显示出来,或者有些界面没必要显示在最近任务列表中,如输入密码的Activity。此时可以在清单文件的相应activity节点下声明:
android:excludeFromRecents="true"
有些特殊的Activity,如:广告平台。不想让它在最近任务列表中显示任何信息的话,都可以做上述设置。