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

Kev*_*ede 8 android android-screen-pinning

我正在使用运行Android 5.0.1的Nexus 4上的任务锁定API.我的设备所有者应用程序包含两个按钮:"锁定"和"解锁",只需调用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();
            }           
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

任务已锁定时按"锁定"按钮是无害的.但是如果我在没有锁定任务时按下"解锁"按钮,我会得到一个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$2.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)
Run Code Online (Sandbox Code Playgroud)

是否有某种方法可以测试当前任务是否被锁定?

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

我在这里有意义吗?

编辑:创建问题#150089.

Vik*_*ngh 5

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

!mActivityManager.isInLockTaskMode()
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请访问此链接:http://developer.android.com/reference/android/app/ActivityManager.html#isInLockTaskMode%28%29

  • 当所有其他相关方法都在"Activity"中时,为什么该方法在"ActivityManager"中是另一个Android API之谜. (3认同)