You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需Android Enterprise的安卓自助Kiosk设备最佳Kiosk模式操作方案

不依赖Android Enterprise实现Kiosk模式(前台保活+禁用导航栏)

一、让应用始终保持前台运行

1. 前台服务保活

创建前台服务并绑定通知(Android O及以上强制要求),系统会将其判定为高优先级进程,避免被后台回收。

public class KioskForegroundService extends Service {
    private static final int NOTIFICATION_ID = 1001;
    private static final String CHANNEL_ID = "kiosk_foreground";

    @Override
    public void onCreate() {
        super.onCreate();
        // 创建通知渠道(Android O+)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "Kiosk服务", NotificationManager.IMPORTANCE_LOW);
            NotificationManager manager = getSystemService(NotificationManager.class);
            manager.createNotificationChannel(channel);
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle("自助服务运行中")
                .setContentText("设备已锁定为自助模式")
                .setSmallIcon(R.drawable.ic_launcher)
                .build();
        startForeground(NOTIFICATION_ID, notification);
        // 进程被杀死后自动重启服务
        return START_STICKY;
    }

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

在Manifest中注册服务并添加权限:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<service android:name=".KioskForegroundService" />

2. 监听系统广播重启应用

注册广播接收器,监听设备重启、应用被替换、系统弹窗关闭等事件,主动拉起应用:

public class KioskBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (Intent.ACTION_BOOT_COMPLETED.equals(action) 
            || Intent.ACTION_PACKAGE_REPLACED.equals(action)
            || Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
            Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
            launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(launchIntent);
        }
    }
}

Manifest中注册接收器:

<receiver android:name=".KioskBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.PACKAGE_REPLACED" />
        <action android:name="android.intent.action.CLOSE_SYSTEM_DIALOGS" />
        <data android:scheme="package" />
    </intent-filter>
</receiver>

3. 锁定任务模式(Android 5.0+)

启动锁定任务模式后,应用会独占屏幕,用户无法切换到其他应用:

@Override
protected void onResume() {
    super.onResume();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (getPackageManager().isLockTaskPermitted(getPackageName())) {
            startLockTask();
        }
    } else {
        startLockTask();
    }
}

Manifest中给主Activity添加属性:

<activity 
    android:name=".MainActivity"
    android:lockTaskMode="if_needed">
</activity>

二、禁用导航栏

1. 沉浸式粘性全屏(无ROOT)

通过系统UI标志隐藏导航栏和状态栏,粘性模式下用户滑动唤起后会自动隐藏:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
    }
}

注意:部分定制ROM可能会限制该效果,用户快速滑动仍可能唤起导航栏。

2. ROOT后永久隐藏导航栏

如果设备已ROOT,可通过修改系统配置实现全局隐藏:

  • 修改/system/build.prop文件,添加qemu.hw.mainkeys=1,重启设备生效
  • 或执行ADB命令:su settings put global policy_control immersive.navigation=*

3. 设备管理员权限限制

申请设备管理员权限,禁止状态栏下拉、返回键等操作(无法完全禁用导航栏,但可增强限制):

// 申请设备管理员权限
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "需要设备管理员权限锁定自助模式");
startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN);

在设备管理员Receiver中配置限制:

@Override
public void onEnabled(Context context, Intent intent) {
    DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
    // 禁止状态栏下拉
    dpm.setStatusBarDisabled(componentName, true);
}

三、额外优化点

  • 将应用加入系统电池优化白名单,避免被省电策略杀死
  • 重写Activity的onPause方法,检测非主动退出时重启主页面:
private boolean isAppExiting = false;

@Override
protected void onPause() {
    super.onPause();
    if (!isAppExiting) {
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    }
}

// 主动退出时设置标记
public void exitApp() {
    isAppExiting = true;
    finish();
}

内容的提问来源于stack exchange,提问作者goodwill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 14:25:10