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;
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);
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` 权限。