2015-02-13 5 views
8

Sto giocando con l'API di blocco delle attività su un Nexus 4 con Android 5.0.1. L'app del proprietario del dispositivo è composta da due pulsanti: "Blocca" e "Sblocca", che semplicemente chiamano startLockTask() e stopLockTask(). Questo è davvero tutto ciò che devi fare, ma dal momento che alcune persone insistono nel vedere il boilerplate:Metodo per verificare se l'attività corrente è bloccata?

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(); 
      }   
     }); 
    } 
} 

Premendo il tasto "Lock" quando l'attività è già bloccato è innocuo. Ma se si preme il pulsante "Unlock" quando l'attività non è bloccato, ho un 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) 

Esiste un metodo da qualche parte per verificare se l'attività corrente è bloccata?

Questo è un po 'come il modo in cui unregisterReceiver(...) esplode se si tenta di annullare la registrazione di un ricevitore che non è registrato. Penso che sia un'API scarsamente educata che ti costringe a tenere traccia del suo stato interno per questo. Ma il numero stopLockTask() è anche peggio, perché mentre normalmente si annulla la registrazione dei destinatari quando l'attività è in pausa, normalmente non si sblocca l'attività. Quindi la prossima attività viene creata bloccata, ma non ha modo di sapere che è bloccata. Quindi, in pratica, devi passare lo stato bloccato in intents e i bundle di istanza salvati. Oppure semplicemente circondare ogni chiamata a stopLockTask() con una brutta try/catch ...

sto facendo alcun senso qui?

Modifica: Creato issue #150089.

+0

Visualizza parte relativa del codice 'MainActivity 'classe –

+1

@ ρяσѕρєяK Il pulsante chiama letteralmente' stopLockTask() '. –

+0

@Gaskoin I * hanno * mostrato la totalità del codice pertinente. Ma dal momento che insisti, ti mostrerò anche lo standard. –

risposta

-2

È necessario implementare gli altri metodi del ciclo di vita (OnResume, OnStop e così via).

Metti la tua logica per sbloccare l'Applicazione all'interno di un altro metodo che scoprirai quale è meglio in base al tuo comportamento previsto. Dai un'occhiata a questo [link]. 1

+0

Al momento sono di fretta, ma se non capisco il punto proverò a spiegare meglio dopo. –

+0

Certamente non può essere fatto in 'onCreate()'/'onDestroy()', perché quindi l'attività viene lasciata sbloccata quando si torna indietro nello stack delle attività. Facendolo in 'onResume()'/'onPause()' o 'onStart()'/'onStop()' lascia l'attività sbloccata quando lo schermo è addormentato, che ti dà accesso alla schermata di blocco e tutte le impostazioni nel menu a discesa. Prevenire lo schermo dal sonno potrebbe non essere sempre auspicabile.E se lo fai in qualsiasi metodo di ciclo di vita, sei costantemente spammato con toast ogni volta che navighi tra le attività o ruoti il ​​dispositivo. –