這兩天在手機論壇里面發現好多手機被鎖屏軟件鎖屏了,鎖屏效果(模擬器中)如下:
初次接觸這個軟件,我一直以為是鎖定了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.手機刷機。