Способ проверки того, заблокирована ли текущая задача?

Я играю с 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(); } }); } } 

Нажатие кнопки «Блокировка», когда задача уже заблокирована, безвредна. Но если я нажму кнопку «Разблокировать», когда задача не заблокирована, я получаю 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() регистрацию получателей, когда ваша деятельность приостановлена, вы обычно не разблокируете свою задачу. Таким образом, следующее действие создается заблокированным, но у него нет способа узнать, что он заблокирован. Таким образом, вы в основном должны передавать заблокированное состояние в намерениях и сохраненных наборах экземпляров. Или просто stopLockTask() каждый вызов stopLockTask() с уродливым try / catch

Имею ли я смысл здесь?

Изменить: Создана проблема # 150089 .

Solutions Collecting From Web of "Способ проверки того, заблокирована ли текущая задача?"

Вот метод проверки текущего состояния текущей задачи, если он заблокирован или нет в случае привязки экрана:

 !mActivityManager.isInLockTaskMode() 

Для получения дополнительной информации посетите эту ссылку: http://developer.android.com/reference/android/app/ActivityManager.html#isInLockTaskMode%28%29

Вам необходимо реализовать другие методы жизненного цикла (OnResume, OnStop и т. Д.).

Поместите свою логику, чтобы разблокировать приложение в другом методе, который вы узнаете, какой из них лучше в соответствии с вашим ожидаемым поведением. Проверьте это [ссылка]. 1