测试当前任务是否被锁定的方法?

Method to test whether the current task is locked?

我正在 Nexus 4 运行 Android 5.0.1 上玩任务锁定 API。我的设备所有者应用程序包含两个按钮:"Lock" 和 "Unlock",它们只是调用 startLockTask()stopLockTask()。这就是它的全部内容,但由于有些人坚持要看样板文件:

public class MainActivity extends Activity {    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.lockButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startLockTask();
            }           
        });

        findViewById(R.id.unlockButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stopLockTask();
            }           
        });
    }
}

任务已经锁定时按"Lock"按钮是无害的。但是如果我在任务未锁定时按下 "Unlock" 按钮,我会得到一个 NPE:

02-12 22:58:11.942: E/AndroidRuntime(12888): java.lang.NullPointerException: Attempt to read from field 'android.content.Intent com.android.server.am.TaskRecord.intent' on a null object reference
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.os.Parcel.readException(Parcel.java:1546)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.os.Parcel.readException(Parcel.java:1493)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.app.ActivityManagerProxy.stopLockTaskMode(ActivityManagerNative.java:5245)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.app.Activity.stopLockTask(Activity.java:6179)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at com.chalcodes.kiosk.MainActivity.onClick(MainActivity.java:44)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.view.View.performClick(View.java:4756)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.view.View$PerformClick.run(View.java:19749)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.os.Handler.handleCallback(Handler.java:739)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.os.Handler.dispatchMessage(Handler.java:95)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.os.Looper.loop(Looper.java:135)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.app.ActivityThread.main(ActivityThread.java:5221)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at java.lang.reflect.Method.invoke(Native Method)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at java.lang.reflect.Method.invoke(Method.java:372)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

有没有什么方法可以检测当前任务是否被锁定?

这有点像 unregisterReceiver(...) 如果您尝试取消注册一个未注册的接收者,它就会爆炸。我认为这是一个行为不佳的 API 迫使你为它跟踪它的内部状态。但是 stopLockTask() 更糟,因为当 activity 暂停时您通常会取消注册您的接收器,但您通常不会解锁您的任务。所以下一个 activity 被创建为锁定,但它无法知道它是否已锁定。所以你基本上必须在意图和保存的实例包中传递锁定状态。或者用丑陋的 try/catch...

包围对 stopLockTask() 的每个调用

我说得有道理吗?

编辑: 创建 issue #150089

您需要实现生命周期的其他方法(OnResume、OnStop 等)。

将您解锁应用程序的逻辑放在其他方法中,您将根据您的预期行为找出哪个方法更好。看看这个 [link].1

以下是在固定屏幕的情况下检查当前任务是否锁定的当前状态的方法:

!mActivityManager.isInLockTaskMode()

有关详细信息,请访问此 link:http://developer.android.com/reference/android/app/ActivityManager.html#isInLockTaskMode%28%29