我正在使用运行Android 5.0.1的Nexus 4上的任务锁定API。我的设备所有者应用程序包含两个按钮:" Lock"和#34;解锁",只需拨打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();
}
});
}
}
按"锁定"任务已经锁定时按钮是无害的。但是,如果我按下"解锁"当任务没有锁定时按钮,我得到一个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)
是否有方法可以测试当前任务是否被锁定?
如果您尝试取消注册未注册的接收方,这有点像unregisterReceiver(...)爆炸的方式。我认为它是一个表现不佳的API,迫使你跟踪它的内部状态。但是stopLockTask()
更糟糕,因为当您的活动暂停时,您通常会取消注册您的接收器,但您通常不会解锁您的任务。所以下一个活动被创建锁定,但它无法知道它已被锁定。所以你基本上必须在意图和保存的实例包中传递锁定状态。或者只是用stopLockTask()
/ try
丑陋地围绕catch
的所有来电...
我在这里有意义吗?
修改:已创建issue #150089。
答案 0 :(得分:5)
以下是在屏幕固定的情况下检查当前任务的当前状态的方法:
!mActivityManager.isInLockTaskMode()
有关详情,请访问此链接:http://developer.android.com/reference/android/app/ActivityManager.html#isInLockTaskMode%28%29
答案 1 :(得分:-2)
您需要实现生命周期的其他方法(OnResume,OnStop等)。
将您的逻辑解释为在其他方法中解锁应用程序,您将根据预期的行为找出哪个方法更好。看看这个[链接]。1