我有一个应用程序,注册为默认启动程序,并在启动时自动锁定自己。
在安装应用程序时,这一切都运行得很好。它会自动锁定,并且只有back按钮可见。
问题是当设备第一次启动时,它不能正确地引脚。我多次看到一系列“屏幕锁定”和“屏幕取消固定”的敬酒词。“主页”和“最近的任务”按钮仍然可见。
--
正在运行"adb shell dumpsys activity“-最后几行表明它未被固定:
mLockTaskModeState=NONE mLockTaskPackages (userId:packages)=
0:[com.example.myapp]
mLockTaskModeTasks[]
--
测试运行Marshmallow/6.0/23的设备华硕ZenPad
我依赖于MainActivity清单属性"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>
如有任何帮助或建议,将不胜感激。
发布于 2017-05-06 05:50:23
我也有同样的问题,我真的只能找到一个解决方案。我不知道为什么,但是的,android中的一些东西阻止了启动时的任务锁定,这让我感到困惑,因为任务锁是为了创建这些"kiosk“类型的应用程序而设计的。我能找到的唯一解决方案是在应用程序没有锁定的情况下检测,然后重新启动应用程序。这有点“老生常谈”,但你还能做什么呢?
为了检测它没有锁定的情况,我创建了一个状态变量并分配状态(锁定、锁定、解锁、解锁)。然后在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;
}
MainActivity
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();
}
}
事实上,这是我所实现的东西的简化版本。但希望它能让你找到一个解决方案。
发布于 2017-11-10 02:25:59
到目前为止,我找到的唯一解决方案是:创建另一个launcher app,不带锁任务,每次launcher出现时都会触发主应用程序。这可以防止用户在BOOT_COMPLETED接收器上调用LockTasked应用程序之前等待更多几秒钟。因此,只有当lockTask应用程序在清单中具有某些活动的启动器属性时,我们才能遇到这个问题。
发布于 2018-06-03 03:55:03
抱歉,回复晚了,但是...
任何有这个问题的人都可以在first (启动器/主页)活动(例如MainActivity)中完成这项棘手的工作:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (mSharedPreferences.getBoolean(KEY_PREF_RECREATED, false)) {
mSharedPreferences.edit().putBoolean(KEY_PREF_RECREATED, false).apply();
// start LOCK TASK here
} else {
mSharedPreferences.edit().putBoolean(KEY_PREF_RECREATED, true).apply();
finish(); // close the app
startActivity(new Intent(this, MainActivity.class)); // reopen the app
return;
}
setContentView(R.layout.activity_main);
// other codes
}
https://stackoverflow.com/questions/39965124
复制相似问题