这两天在手机论坛里面发现好多手机被锁屏软件锁屏了,锁屏效果(模拟器中)如下:
初次接触这个软件,我一直以为是锁定了fastloader,但是问哪些被锁屏的人,他们没有root,也没有刷过机,只是单单的安装了这个软件,所以就得排除锁定loader的方式。
直到后来反编译这个锁屏软件的安装包,才解开它真正实现的原理:
1. 通过锁定home键,锁定返回键,这样单凭按键是无法退出该应用。
2. 用户可能选择强制关机,一旦开机之后,系统就会恢复到桌面应用,而不是本应用,为了开机之后打开本应用,就需要是在应用中注册一个开机完成的广播接受者
广播如下:android:name="android.intent.action.BOOT_COMPLETED"/>,收到该广播后就通过intent打开本应用。
3. 当应用不在前台时,比如如下情况: 手机被锁定了,手机来电了,这时应用就在电话应用的下一个应用,这个时候你可以按下home键,将后台的那个应用侧滑清除掉,
为了保证侧滑不被清楚点,它便在后台开启一个看门狗服务,每150ms检测一下前台应用应用是不是我的应用,如果不是就跳转到我的应用,也就是判断上图中最底下的应用是不是我的锁屏应用,如果是的话,就重新打开我的应用。
应用关键代码如下:
//4.0以上锁定home键
getWindow().setFlags(0x80000000, 0x80000000);
//这个方法是锁定home键,4.0下可用,4.0上对部分机型可用.
getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
//屏蔽返回键
@Override
public void onBackPressed() {
//屏蔽父类的返回处理
//super.onBackPressed();
}
开机广播接受处理:
public class BootBroadcastReceiver extends BroadcastReceiver
{
String action_boot="android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent)
{
/*因为手机刷了MIUI,我不知道能不能自启,如果不能,删除注释符号。*/
if (intent.getAction().equals(action_boot)){
Intent ootStartIntent=new Intent(context, MainActivity.class);
ootStartIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(ootStartIntent);
}
}
}
开门狗代码:
public class killpoccessserve extends Service
{
Context context;
@Override
public IBinder onBind(Intent p1)
{
// TODO: Implement this method
return null;
}
@Override
public void onCreate()
{
context = this;
//Handler线程,接收timertask的message,用于重启应用。
final Handler h = new Handler(new Handler.Callback(){
public boolean handleMessage(Message msg){
ActivityManager am=(ActivityManager)context.getSystemService(context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> runningTasks = am.getRunningTasks(1);
ActivityManager.RunningTaskInfo runningTaskInfo = runningTasks.get(0);
ComponentName topActivity =runningTaskInfo.topActivity;
String packageName =topActivity.getPackageName();
if(packageName.equals("tk.jianmo.study")){//判断是否是本应用
}else{
//不是本应用,启动应用,并kill掉之前的应用
Intent intent=new Intent();
intent.setClass(context,MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
am.killBackgroundProcesses(packageName);
}
return false;
}
});
Timer timer;
TimerTask timertask;
timer = new Timer();
timertask = new TimerTask(){
@Override
public void run(){
h.obtainMessage().sendToTarget();
}
};
timer.schedule(timertask, 0, 150);//0.15秒启动一次timertask,无延迟
}
@Override
public void onStart(Intent intent, int startId){
// TODO: Implement this method
super.onStart(intent, startId);
}
@Override
public void onDestroy()
{
// TODO: Implement this method
super.onDestroy();
}
}
解决办法:软件卸载(以下的解决办法程度递增的)
1. 锁屏软件也是软件,只不过你启动该软件后是手机无法退出该软件,当然不排除你手速够快能在150ms(软件开发者设定,如果1s你就gg了)的时间内卸载该应用。
2. 既然手机是无法退出该应用,那么我们可以借助电脑来卸载该软件,如果手机打开了usb调试,就可以通过手机助手在电脑中卸载安装在手机中的软件,如何没有开启的话,如 果手速够快的话,也可以在150ms时间内,打开usb调试。
3. 甚至有些手机可以远程管理手机应用,甚至是清除数据。
4.手机数据双清。
5.手机刷机。