Я играю с API блокировки задач на Nexus 4 под управлением Android 5.0.1. Приложение моего владельца устройства состоит из двух кнопок: «Блокировка» и «Разблокировка», которые просто вызывают 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», когда задача уже заблокирован безвредна. Но если нажать на кнопку «Разблокировать», когда задача не заблокирована, я получаю 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.
Показать связанную часть кода 'MainActivity 'class –
@ ρяσѕρєяK Кнопка буквально просто вызывает' stopLockTask() '. –
@ Gaskoin I * have * показал вам весь код. Но поскольку вы настаиваете, я покажу вам шаблон. –