我们都知道,android自5.0以后对一些属性有了比较大的改动,尤其是home键,在应用层已经无法做到屏蔽。今天就来看看如何屏蔽这三个键。
首先,因为不同手机的触发机制不一样,所以对于某些手机,recent键没法屏蔽,已知的有魅族,锤子(少数),鲁比亚(某些)。对于已知测试的手机,home键,back键都能屏蔽。
首先,屏蔽back比较简单,重写onKeyDown就可以了,直接上代码
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) { //重写返回键方法
if (keyCode == KeyEvent.KEYCODE_BACK) {
Toast.makeText(ForceActivity.this, "您点击了back键", Toast.LENGTH_SHORT).show();
return false;
}
return super.onKeyDown(keyCode, event);
}
下面就是屏蔽recent键,这种方法只对部分手机有效
@Override
protected void onPause() { //重写recent键方法
super.onPause();
for (int j = 0; j < 50; j++){
ActivityManager activityManager = (ActivityManager) getApplicationContext()
.getSystemService(Context.ACTIVITY_SERVICE);
activityManager.moveTaskToFront(getTaskId(), 0);
}
}
最后,也是比较麻烦的一个,就是屏蔽home键,这里我采用的是用广播来监听,用户一旦点击了home键,就重新创建一个activity,让这个activity覆盖主界面,从而达到屏蔽home键的目的
如何实现呢?首先,创建一个java文件,命名为HomeReceiver,然后在里面实现监听,代码如下:
package com.example.wei.i_like_study;
import android.app.PendingIntent;
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.widget.Toast;
public class HomeReceiver extends BroadcastReceiver {
static public final String SYSTEM_DIALOG_REASON_KEY = "reason";
static public final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
static public final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
static public final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
static public final String SYSTEM_DIALOG_REASON_ASSIST = "assist";
public void onReceive(Context arg0, Intent arg1) {
String action = arg1.getAction();
if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { //按下Home键会发送ACTION_CLOSE_SYSTEM_DIALOGS的广播
String reason = arg1.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
if (reason != null) {
if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
Intent intent = new Intent(arg0, ForceActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); //点击home键无延时,且不会产生新的activity
PendingIntent pendingIntent = PendingIntent.getActivity(arg0, 0,
intent, 0);
try {
pendingIntent.send();
} catch (PendingIntent.CanceledException e) {
e.printStackTrace();
}
}
}
}
}
}
然后需要在mainfest中注册
最后,在你的代码中进行动态注册
innerReceiver = new HomeReceiver(); //注册广播
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
registerReceiver(innerReceiver, intentFilter);
结束时,应该取消监听
unregisterReceiver(innerReceiver); //取消注册
innerReceiver); //取消注册
好了,就这样,back,recent,home三个键就可以被屏蔽了。
最后,再提一提开机自启动项目。要实现这个,首先同样要监听开机事件。我们在这里新建一个java文件,AutoStartReceiver
然后,对开机后发送的广播进行监听,代码如下:
package com.example.wei.i_like_study;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class AutoStartReceiver extends BroadcastReceiver {
private static final String ACTION = "android.intent.action.BOOT_COMPLETED"; //开机后,系统发送的广播
@Override
public void onReceive(Context context, Intent intent) {
if (ACTION.equals(intent.getAction())||Intent.ACTION_MEDIA_MOUNTED.equals(intent.getAction())){
Intent it = new Intent(context.getApplicationContext(),ForceActivity.class);
it.setAction("android.intent.action.MAIN");
it.addCategory("android.intent.category.LAUNCHER");
it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//context.startActivity(it);
PendingIntent pendingIntent = PendingIntent.getActivity(context.getApplicationContext(), 0,
it, 0);
try {
pendingIntent.send();
} catch (PendingIntent.CanceledException e) {
e.printStackTrace();
}
}
}
}
同样,也需要再mainfest中进行静态注册
-
这样,当开机后,就会执行打开你的软件并进入指定的界面
提醒:不要将这个用于制作流氓软件!做一个有良知的开发者!