gpt4 book ai didi

启动时的 Android pin Activity

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:40:30 28 4
gpt4 key购买 nike

我有一个应用程序可以将自己注册为默认启动器并在启动时自动固定自己。

安装应用程序时一切正常。它固定自己,只有后退按钮可见。

问题是当设备第一次启动时,它没有正确固定。我多次看到一系列 toast “已固定屏幕”和“已取消固定屏幕”。 “主页”和“近期任务”按钮仍然可见。

--

运行“adb shell dumpsys activity activities”——最后几行表明它没有固定:

mLockTaskModeState=NONE mLockTaskPackages (userId:packages)=
0:[com.example.myapp]
mLockTaskModeTasks[]

--

测试设备 Asus ZenPad 运行 Marshmallow/6.0/23

我依靠 MainActivity list 属性“lockTaskMode”来固定(而不是 activity.startLockTask()):

<activity
android:name=".MainActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/launcher_main"
android:launchMode="singleTask"
android:lockTaskMode="if_whitelisted"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.HOME"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>

任何帮助或指点将不胜感激

最佳答案

我遇到了同样的问题,我真的只能找到一个解决方案。我不确定为什么,但是是的,android 中的某些东西在启动时阻止了任务锁定,这让我感到困惑,因为任务锁定旨在创建这些“kiosk”类型的应用程序。我能找到的唯一解决方案是检测未锁定的情况,然后重新启动应用程序。这有点“hacky”,但您还能做什么?

为了检测未锁定的情况,我创建了一个状态变量并分配状态(锁定、锁定、解锁、解锁)。然后在 onTaskModeExiting 的设备管理接收器中,如果状态不是“正在解锁”,那么我知道它已自行解锁。因此,如果这种情况发生在失败的地方,我会使用此方法重新启动应用程序(在警报管理器中安排应用程序然后终止应用程序):

how to programmatically "restart" android app?

下面是一些示例代码:

DeviceAdminReceiver

@Override
public void onLockTaskModeEntering(Context context, Intent intent, String pkg) {
super.onLockTaskModeEntering(context, intent, pkg);
Lockdown.LockState = Lockdown.LOCK_STATE_LOCKED;
}

@Override
public void onLockTaskModeExiting(Context context, Intent intent) {
super.onLockTaskModeExiting(context, intent);

if (Lockdown.LockState != Lockdown.LOCK_STATE_UNLOCKING) {
MainActivity.restartActivity(context);
}
Lockdown.LockState = Lockdown.LOCK_STATE_UNLOCKED;
}

主要 Activity

public static void restartActivity(Context context) {
if (context != null) {
PackageManager pm = context.getPackageManager();
if (pm != null) {
Intent intent = pm.getLaunchIntentForPackage(context.getPackageName());
if (intent != null) {
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
int pendingIntentId = 223344;
PendingIntent pendingIntent = PendingIntent.getActivity(context, pendingIntentId, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, pendingIntent);
System.exit(0);
}
}
}
}

private void lock() {
Lockdown.LockState = Lockdown.LOCK_STATE_LOCKING;
startLockTask();
}

private void unlock() {
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
if (am.getLockTaskModeState() == ActivityManager.LOCK_TASK_MODE_LOCKED) {
Lockdown.LockState = Lockdown.LOCK_STATE_UNLOCKING;
stopLockTask();
}
}

事实上,这是我实现的简化版本。但它应该有望让您找到解决方案。

关于启动时的 Android pin Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39965124/

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