个人第二个项目总结:home键,recent键,back键的屏蔽

我们都知道,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中注册
</receiver>
        <receiver android:name=".HomeReceiver" android:exported="true" android:enabled="true"/>

最后,在你的代码中进行动态注册

innerReceiver = new HomeReceiver();                                                        //注册广播
            IntentFilter intentFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
            registerReceiver(innerReceiver, intentFilter);

结束时,应该取消监听

  unregisterReceiver(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中进行静态注册

<receiver android:name=".AutoStartReceiver" android:exported="true" android:enabled="true">
        -<intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>
这样,当开机后,就会执行打开你的软件并进入指定的界面

提醒:不要将这个用于制作流氓软件!做一个有良知的开发者!


猜你喜欢

转载自blog.csdn.net/qq_37820491/article/details/80940582