个人第二个项目总结: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);                                             //取消注册
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>

这样,当开机后,就会执行打开你的软件并进入指定的界面

 

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

 

 

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Android 中可以通过重写 `onKeyDown()` 方法来监听 back ,`onUserLeaveHint()` 方法来监听 home ,以及通过注册系统广播来监听多任务(最近任务)。 以下是示例代码: 1. 监听 back 在 Service 中重写 `onKeyDown()` 方法,判断 keyCode 是否为 KeyEvent.KEYCODE_BACK,即可监听到 back 的点击事件。 ``` @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { // 处理 back 点击事件 return true; } return super.onKeyDown(keyCode, event); } ``` 2. 监听 home 在 Service 中重写 `onUserLeaveHint()` 方法,即可监听到 home 的点击事件。 ``` @Override public void onUserLeaveHint() { super.onUserLeaveHint(); // 处理 home 点击事件 } ``` 3. 监听多任务(最近任务) 通过注册系统广播 `Intent.ACTION_CLOSE_SYSTEM_DIALOGS`,即可监听到多任务(最近任务)的点击事件。 ``` private BroadcastReceiver mCloseSystemDialogsReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (TextUtils.equals(action, Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); if (TextUtils.equals(reason, SYSTEM_DIALOG_REASON_RECENT_APPS)) { // 处理多任务点击事件 } } } }; private static final String SYSTEM_DIALOG_REASON_KEY = "reason"; private static final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps"; private void registerCloseSystemDialogsReceiver() { IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); registerReceiver(mCloseSystemDialogsReceiver, filter); } private void unregisterCloseSystemDialogsReceiver() { unregisterReceiver(mCloseSystemDialogsReceiver); } ``` 在 Service 的 `onCreate()` 方法中注册广播,`onDestroy()` 方法中注销广播: ``` @Override public void onCreate() { super.onCreate(); registerCloseSystemDialogsReceiver(); } @Override public void onDestroy() { super.onDestroy(); unregisterCloseSystemDialogsReceiver(); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值