class InnerRecevier extends BroadcastReceiver {
        final String SYSTEM_DIALOG_REASON_KEY = "reason";
        final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
        final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
                String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
                if (reason != null) {
                    if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
                        Toast.makeText(MainActivity.this, "Home键被监听", Toast.LENGTH_SHORT).show();
                    } else if (reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
                        Toast.makeText(MainActivity.this, "多任务键被监听", Toast.LENGTH_SHORT).show();



在Activity中的onCreate()方法中注册广播,代码如下:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //创建广播
        InnerRecevier innerReceiver = new InnerRecevier();
        //动态注册广播
        IntentFilter intentFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
        //启动广播
        registerReceiver(innerReceiver, intentFilter);

这样的话,就ok了。这种方式能对home键与多任务键实现全盘监听,但你无法去屏蔽系统的行为。

二、重写onKeyDown()监听、屏蔽back键、home键

在Activity中重写onKeyDown(),代码如下:

  @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            Toast.makeText(MainActivity.this, "返回键无效", Toast.LENGTH_SHORT).show();
            return true;//return true;拦截事件传递,从而屏蔽back键。
        if (KeyEvent.KEYCODE_HOME == keyCode) {
            Toast.makeText(getApplicationContext(), "HOME 键已被禁用...", Toast.LENGTH_SHORT).show();
            return true;//同理
        return super.onKeyDown(keyCode, event);



在Activity中onCreate()中添加代码,代码如下:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //在setContentView之前添加,未添加的话home键监听无效,设置窗体属性
        this.getWindow().setFlags(0x80000000, 0x80000000);
        setContentView(R.layout.activity_main);
                    以下两种方法可以完美解决监听back键,home键,多任务键(最近任务键)。一、使用注册广播监听home键、多任务键演示图  创建一个广播代码如下:    class InnerRecevier extends BroadcastReceiver {        final String SYSTEM_DIALOG_REASON_KEY = "reason";        final Str
class InnerRecevier extends BroadcastReceiver {
  final String SYSTEM_DIALOG_REASON_KEY = reason;
  final String SYSTEM_DIALOG_REASON_RECENT_APPS = recentapps;
  final String SYSTEM_DIALOG_RE
				
在每次点击Home按键时都会发出一个action为 Intent.ACTION_CLOSE_SYSTEM_DIALOGS的广播,它是关闭系统Dialog的广播,我们可以通过注册它来监听Home按键消息,我自定义了一个home按键监听工具类,代码如下,使用说明参见类名上方的使用说明: import android.content.BroadcastReceiver; import androi
@Override public boolean dispatchKeyEvent(KeyEvent event) { if(event.getKeyCode()==KeyEvent.KEYCODE_BACK){ Log.d("ansen", "KEY     static final String TAG = "HomeWatcher";       private Context mContext;       private IntentFilter mFilter;       private OnHomePressedListener mListener;  
APP 一般无法直接监听主页HOME)的按键事件,在 onKeyDown 方法中是监听不到的,因为 HOME 是在 PhoneWindowManager 中处理的,不会分发到应用。 应用如何监听这个事件呢,答案是接收 Intent.ACTION_CLOSE_SYSTEM_DIALOGS 广播 。 private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public v
Android 5.x中新增了RippleDrawable类型,即波纹效果.效果图如下: 在res中添加一个新的文件夹drawable-v21,用于保存波纹效果ripple.xml<?xml version="1.0" encoding="utf-8"?><ripple xmlns:android="http://schemas.android.com/apk/res/android"
楼主的手机是华为P9搭载android6.0,今天一个项目需要读写文件,明明文件目录下存放数据,读文件时一直报FileNotFoundException(没找到文件),写文件时一直报没有权限,然而我都加了。 查了一早上的资料,终于发现API 23(6.0)以上的手机需要手动去检测读取权限。并不会自动帮你检测,检测后可以确认是否允许应用可获得读写权限。若手机本身不允许该权限,就不会允许你读写数据,即
Android 中,你可以通过创建一个 `BroadcastReceiver` 广播接收器来监听音量的变化。下面是一个示例代码: 首先,在你的 AndroidManifest.xml 文件中添加以下权限: ```xml <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 然后,创建一个新的 Java 类来实现广播接收器: ```java public class VolumeButtonReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action != null && action.equals("android.media.VOLUME_CHANGED_ACTION")) { // 处理音量改变的逻辑 int currentVolume = intent.getIntExtra("android.media.EXTRA_VOLUME_STREAM_VALUE", -1); int previousVolume = intent.getIntExtra("android.media.EXTRA_PREV_VOLUME_STREAM_VALUE", -1); // 在这里执行你的操作,比如发送广播或者调用相应的方法 // ... 接下来,在你的 Activity 或者 Service 中注册广播接收器: ```java public class MainActivity extends AppCompatActivity { private VolumeButtonReceiver receiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 创建广播接收器实例 receiver = new VolumeButtonReceiver(); // 创建 IntentFilter 并添加音量改变的 action IntentFilter filter = new IntentFilter(); filter.addAction("android.media.VOLUME_CHANGED_ACTION"); // 注册广播接收器 registerReceiver(receiver, filter); @Override protected void onDestroy() { super.onDestroy(); // 在 Activity 销毁时注销广播接收器 unregisterReceiver(receiver); 这样,当用户按下音量时,`VolumeButtonReceiver` 类中的 `onReceive()` 方法将会被调用,你可以在这个方法中执行你想要的操作。注意,在 Android 8.0(API 级别 26)及以上版本中,需要在运行时请求 `MODIFY_AUDIO_SETTINGS` 权限。