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.
Visualizza parte relativa del codice 'MainActivity 'classe –
@ ρяσѕρєяK Il pulsante chiama letteralmente' stopLockTask() '. –
@Gaskoin I * hanno * mostrato la totalità del codice pertinente. Ma dal momento che insisti, ti mostrerò anche lo standard. –