2015-02-13 6 views
8

Я играю с 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.

+0

Показать связанную часть кода 'MainActivity 'class –

+1

@ ρяσѕρєяK Кнопка буквально просто вызывает' stopLockTask() '. –

+0

@ Gaskoin I * have * показал вам весь код. Но поскольку вы настаиваете, я покажу вам шаблон. –

ответ

5

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

!mActivityManager.isInLockTaskMode() 

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

+3

Почему этот метод находится в 'ActivityManager', когда все другие связанные методы находятся в' Activity', это еще одна загадка Android API. –

-2

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

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

+0

Я сейчас спешу, но если вы не понимаете, я попытаюсь объяснить это позже. –

+0

Этого не может быть сделано в 'onCreate()'/'onDestroy()', потому что тогда задача остается разблокированной при переходе назад в стек активности. Выполнение этого в 'onResume()'/'onPause()' или 'onStart()'/'onStop()' оставляет задачу разблокированной, когда экран спит, что дает вам доступ к экрану блокировки и всем параметрам в выпадающее меню. Предотвращение сна сна может не всегда быть желательным.И если вы делаете это по любому методу жизненного цикла, вы постоянно рассылаете тосты каждый раз, когда вы перемещаетесь между действиями или вращаете устройство. –

 Смежные вопросы

  • Нет связанных вопросов^_^