android 屏蔽电源键,home键

本文介绍如何在Android应用中屏蔽电源键长按、Home键及Home键长按时触发的默认行为。通过监听特定广播并发送定制的Intent来实现屏蔽功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Android 中屏蔽"电源键长按"、"Home键"、"Home键长按"


这几个“按钮”的触发,都会产生一个Action == Intent.ACTION_CLOSE_SYSTEM_DIALOGS的通知

区分他们三个的不同事件的参数,就是随着Intent带过来的reason字符串,分别对应

"电源键长按"(globalscreen)、"Home键"(homekey)、"Home键长按"(recentapps)

说破了就这么简单,直接上代码了。

package com.jumpinus.test;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;

public class MainActivity extends Activity {
	
	private MyBroadCastReceiver myBroadCastReceiver;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		
		myBroadCastReceiver = new MyBroadCastReceiver();
		
	}
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		IntentFilter intentFilter = new IntentFilter();
		intentFilter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
		
		System.out.println("I'm coming, myBroadCastReceiver注册了!");
		registerReceiver(myBroadCastReceiver, intentFilter);
	}
	private class MyBroadCastReceiver extends BroadcastReceiver{

		@Override
		public void onReceive(Context context, Intent intent) {
			//你自己先把 reasons == homekey 和 长按homekey 排除,剩下的做下面的处理
			String reason = intent.getStringExtra("reason");
			if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)){
				System.out.println("Intent.ACTION_CLOSE_SYSTEM_DIALOGS : " + intent.getStringExtra("reason"));
				
				if (intent.getExtras()!=null && intent.getExtras().getBoolean("myReason")){
					myBroadCastReceiver.abortBroadcast();
				}else if (reason != null){
					
					if (reason.equalsIgnoreCase("globalactions")){
						
						//屏蔽电源长按键的方法:
						Intent myIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
						myIntent.putExtra("myReason", true);
						context.sendOrderedBroadcast(myIntent, null);
						System.out.println("电源  键被长按");
						
					}else if (reason.equalsIgnoreCase("homekey")){
						
						//屏蔽Home键的方法
						//在这里做一些你自己想要的操作,比如重新打开自己的锁屏程序界面,这样子就不会消失了
						System.out.println("Home 键被触发");
						
					}else if (reason.equalsIgnoreCase("recentapps")){
						
						//屏蔽Home键长按的方法
						System.out.println("Home 键被长按");
					}
				}
			}
		}
		
	}
	
	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		
		System.out.println("I get out, myBroadCastReceiver注销了!");
		unregisterReceiver(myBroadCastReceiver);
	}
}


效果图:


### 屏蔽 AndroidHome 功能的方法 在 Android 开发中,完全禁用 Home 是一个复杂的问题,因为 Home 的行为是由操作系统控制的。然而,可以通过一些特定的方式实现类似的效果。 #### 方法一:设置自定义启动器应用 如果希望当按下 Home 时显示自己的应用程序界面而不是默认的桌面,可以将应用程序配置为一个自定义启动器。这需要修改 `AndroidManifest.xml` 文件中的活动声明部分: ```xml <activity android:name=".HomeActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> ``` 上述代码会告诉系统该活动应该作为主屏幕启动器运行[^1]。需要注意的是,这种方式并不会真正阻止用户访问其他应用或退出当前应用,而是改变按 Home 后的行为。 #### 方法二:重写 onUserLeaveHint() 或 onPause() 虽然无法直接拦截 Home 事件,但可以在某些情况下检测到它被触发并作出响应。例如,在 Activity 生命周期中监听状态变化: ```java @Override protected void onUserLeaveHint(){ super.onUserLeaveHint(); Log.d("MainActivity", "onUserLeaveHint called"); } ``` 此方法会在用户即将离开当前页面前调用(比如点击了 Home )。不过这种方法并不能彻底防止切换至别的程序[^4]。 #### 方法三:利用 kiosk mode 实现锁定设备模式 对于企业级解决方案或者教育用途来说,“Kiosk Mode”可能更加合适。启用这种模式之后,只有指定的应用能够被执行,并且所有的硬件按包括返回、菜单甚至电源按钮都可以受到不同程度上的限制。具体操作涉及到 DevicePolicyManager API 的使用。 #### 技术细节补充 内部机制上来看,每当有新的前台任务准备就绪的时候都会执行一次名为 `activityIdleInternalLocked()` 函数来判断是否完成引导过程以及更新UI布局等动作[^2];而最终启动 HOME 应用的过程则交给了另一个类——ActivityStartController 来负责完成整个流程[^3]。 ### 注意事项 由于安全性和用户体验方面的考虑,Google 并不鼓励开发者去干扰标准导航控件的工作方式。因此以上提到的技术手段要么仅适用于特殊场景下(如kiosks),要么只是间接影响而非绝对控制住HOME健的作用效果。 ```java // 示例代码展示如何创建简单的锁屏应用 public class LockScreenService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId){ Window window = new Window(this); WindowManager.LayoutParams params = new WindowManager.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.TYPE_SYSTEM_ERROR, WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD , PixelFormat.TRANSLUCENT); LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.lock_screen_layout,null); ((WindowManager)getApplicationContext().getSystemService(WINDOW_SERVICE)).addView(view,params); return START_STICKY; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值