gpt4 book ai didi

android - 如何在任何 Activity 中禁用虚拟主页按钮?

转载 作者:行者123 更新时间:2023-11-29 17:25:17 26 4
gpt4 key购买 nike

我需要在我的应用程序的任何 Activity 中禁用 3 个虚拟按钮。我以某种方式禁用了后退按钮和多任务按钮,但我无法启用主页按钮。

我在 stackoverflow 上尝试了 onAttachedToWindow() 风格的答案,但它们对我不起作用。

我不想为整个应用禁用主页按钮,我只想为单个 Activity 窗口禁用它。感谢您的帮助!

最佳答案

注意:如果您想部署应用,我强烈建议您不要在您的应用中执行此操作。这只是为了展示我们如何做到这一点。

自 Android 4 以来,没有有效的方法来禁用主页按钮。它需要一点技巧。我认为您需要的是应用程序中的 KIOSK 模式。一般来说,这个想法是检测新应用程序何时在前台运行并立即重启您的 Activity。过程如下..

首先创建一个名为 KioskService 的类来扩展 Service 并添加以下代码 fragment :

 public class KioskService extends Service {

private static final long INTERVAL = TimeUnit.SECONDS.toMillis(2); // periodic interval to check in seconds -> 2 seconds
private static final String TAG = KioskService.class.getSimpleName();
private static final String PREF_KIOSK_MODE = "pref_kiosk_mode";

private Thread t = null;
private Context ctx = null;
private boolean running = false;

@Override
public void onDestroy() {
Log.i(TAG, "Stopping service 'KioskService'");
running =false;
super.onDestroy();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "Starting service 'KioskService'");
running = true;
ctx = this;

// start a thread that periodically checks if your app is in the foreground
t = new Thread(new Runnable() {
@Override
public void run() {
do {
handleKioskMode();
try {
Thread.sleep(INTERVAL);
} catch (InterruptedException e) {
Log.i(TAG, "Thread interrupted: 'KioskService'");
}
}while(running);
stopSelf();
}
});

t.start();
return Service.START_NOT_STICKY;
}

private void handleKioskMode() {
// is Kiosk Mode active?
if(isKioskModeActive()) {
// is App in background?
if(isInBackground()) {
restoreApp(); // restore!
}
}
}

private boolean isInBackground() {
ActivityManager am = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);

List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
ComponentName componentInfo = taskInfo.get(0).topActivity;
return (!ctx.getApplicationContext().getPackageName().equals(componentInfo.getPackageName()));
}

private void restoreApp() {
// Restart activity
Intent i = new Intent(ctx, MyActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ctx.startActivity(i);
}

public boolean isKioskModeActive(final Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getBoolean(PREF_KIOSK_MODE, false);
}

@Override
public IBinder onBind(Intent intent) {
return null;
}
}

在您的 AppContext 类中添加以下方法,以通过创建应用程序上下文来启动服务

@Override
public void onCreate() {
super.onCreate();
instance = this;
registerKioskModeScreenOffReceiver();
startKioskService(); // add this
}

private void startKioskService() { // ... and this method
startService(new Intent(this, KioskService.class));
}

你的 AppContext 类看起来像这样

  public class AppContext extends Application {

private AppContext instance;
private PowerManager.WakeLock wakeLock;
private OnScreenOffReceiver onScreenOffReceiver;


@Override
public void onCreate() {
super.onCreate();
instance = this;
registerKioskModeScreenOffReceiver();
}

private void registerKioskModeScreenOffReceiver() {
// register screen off receiver
final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
onScreenOffReceiver = new OnScreenOffReceiver();
registerReceiver(onScreenOffReceiver, filter);
}

public PowerManager.WakeLock getWakeLock() {
if(wakeLock == null) {
// lazy loading: first call, create wakeLock via PowerManager.
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "wakeup");
}
return wakeLock;
}
}

在 list 中添加服务声明和获取前台进程的权限:

<service android:name=".KioskService" android:exported="false"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
//Added permission Edit 1
<uses-permission android:name="android.permission.WAKE_LOCK" />

我在一个站点上看到了所有内容,但忘记了链接,我所拥有的只是内容和代码,因此我将所有内容作为答案发布。获得链接后,我会立即与您分享。

关于android - 如何在任何 Activity 中禁用虚拟主页按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34919013/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com