Blocco n.3

16/10/14 Ciclo di vita delle aEvità Android Mobile Programming – Prof. R. De Prisco Slide 69 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Ogni “AcHvity” ha dei metodi standard A(vità non esiste 1.  onCreate() 2.  onStart() 3.  onResume() A(vità in esecuzione 4.  onPause() 5.  onStop() 6.  onDestroy() A(vità non esiste •  EseguiH secondo un determinato schema Ciclo di vita delle aEvità Android Mobile Programming – Prof. R. De Prisco Slide 70 Università di Salerno -­‐ a.a. 2013-­‐2014 1 16/10/14 Ciclo di vita delle aEvità Android Mobile Programming – Prof. R. De Prisco Ciclo di vita delle aEvità Android Mobile Programming – Prof. R. De Prisco Slide 71 Università di Salerno -­‐ a.a. 2013-­‐2014 Slide 72 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Quando l’utente preme il pulsante “Home” –  vengono chiamate •  onPause() •  onStop() •  Quando si ritorna all’aEvità –  vengono chiamate •  onRestart() •  onStart() •  onResume() 2 16/10/14 Ciclo di vita delle aEvità Android Mobile Programming – Prof. R. De Prisco Slide 73 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Quando l’utente ruota il disposiHvo –  l’aEvità viene prima eliminata: •  onPause() •  onStop() •  onDestroy() –  e poi ricreata: •  onCreate() •  onStart() •  onResume() •  onDestroy(): perdita dello stato!!!! onSaveInstanceState Android Mobile Programming – Prof. R. De Prisco Slide 74 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Si salva lo stato in onSaveInstanceState() @Override public void onSaveInstanceState(Bundle savedInstanceState) { // Salvare lo stato dell’app
savedInstanceState.putStringArrayList("LISTA_STRINGHE", array_di_stringhe); savedInstanceState.putInt("CONTATORE", counter); // Always call the superclass so it can save the view hierarchy state super.onSaveInstanceState(savedInstanceState); } •  Lo si recupera in onCreate() @Override protected void onCreate(Bundle savedInstanceState) { … if (savedInstanceState != null) { array_di_stringhe = savedInstanceState.getStringArrayList("LISTA_STRINGHE"); counter = savedInstanceState.getInt("CONTATORE"); } } 3 16/10/14 Slide Main acHvity 75 Università di Salerno -­‐ a.a. 2013-­‐2014 Android Mobile Programming – Prof. R. De Prisco <acHvity android:name=".MainAcHvity" android:label="@string/app_name"> <intent-­‐filter> <acHon android:name="android.intent.acHon.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-­‐filter> </acHvity> ActivityLifeCycle
Ciclo di vita delle aEvità Android Mobile Programming – Prof. R. De Prisco Slide 76 Università di Salerno -­‐ a.a. 2013-­‐2014 •  App Calcolatrice –  Cosa succede se ruoHamo il disposiHvo? Correggere l’errore nell’app Calcolatrice 4 16/10/14 Backstack Android Mobile Programming – Prof. R. De Prisco Slide 77 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Un app normalmente è fana di più acHvity –  ogni acHvity ha uno specifico compito •  modularità •  Es. un app per la posta elenronica –  un’aEvità per la scrinura del messaggio –  un’aEvità per spedire il messaggio –  un’aEvità per vedere una lista dei messaggi –  un’aEvità per vedere il contenuto di un messaggio –  ecc. Backstack Android Mobile Programming – Prof. R. De Prisco Slide 78 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Un’aEvità può lanciare un’altra aEvità –  anche aEvità che appartengono ad altre app •  Class “Intent” –  serve a lanciare una nuova aEvità e “passare” i daH all’aEvità che si lancia –  la vedremo fra poco •  Task –  è un insieme di aEvità con cui l’utente interagisce 5 16/10/14 Backstack Android Mobile Programming – Prof. R. De Prisco Slide 79 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Più aEvità possono coesistere, vengono organizzate in un backstack •  Solitamente un task parte dall’Home screen –  l’utente clicca un’icona e lancia un’aEvità –  l’applicazione viene mostrata sulla schermo •  gergo tecnico: viene portata in “foreground” •  Se vengono lanciate nuove aEvità –  l’aEvità corrente viene messa nel backstack –  l’utente ci può tornare con il pulsante Back Backstack Android Mobile Programming – Prof. R. De Prisco Slide 80 Università di Salerno -­‐ a.a. 2013-­‐2014 •  ConHnuando a premere Back si ritorna all’Home screen 6 16/10/14 Foreground e background Android Mobile Programming – Prof. R. De Prisco Slide 81 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Un task con le sue aEvità può essere spostato in “background” –  quando l’utente inizia un nuovo task oppure preme il pulsante Home –  Le aEvità vengono messe in stato di stop, ma il loro backstack rimane intano Istanze mulHple Android Mobile Programming – Prof. R. De Prisco Slide 82 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Se un’aEvità può essere lanciata da più di un’altra aEvità si possono avere istanze mulHple hnp://developer.android.com/guide/components/tasks-­‐and-­‐back-­‐stack.html 7 16/10/14 Slide VisualizzaMappa 83 Università di Salerno -­‐ a.a. 2013-­‐2014 Android Mobile Programming – Prof. R. De Prisco •  Un’app che usa aEvità di altre app –  permene di inserire un indirizzo •  L’indirizzo può essere preso dalla rubrica –  sfruna un’aEvità della rubrica –  permesso per leggere la rubrica!!! •  Visualizza la mappa –  sfruna un’aEvità dell’app GoogleMaps Classe Intent Android Mobile Programming – Prof. R. De Prisco VisualizzaMappa
Slide 84 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Intent –  è una descrizione (astrana) di un’operazione da svolgere •  Permene di –  startAcHvity: lanciare una nuova aEvità –  broadcastIntent: spedire l’intent in broadcast •  verrà ricevuto dai BroadcastReceiver interessaH –  startService o bindService: comunicare con un servizio di background 8 16/10/14 Intent Android Mobile Programming – Prof. R. De Prisco Slide 85 Università di Salerno -­‐ a.a. 2013-­‐2014 •  ParH principale di un oggeno Intent –  AcHon: l’azione da svolgere •  es. ACTION_VIEW, ACTION_EDIT, ACTION_MAIN –  Data: i daH su cui operare espresse come URI •  Uniform Resuorse IdenHfier: <schema>:<parte specifica> –  “hnp://www.di.unisa.it/” –  “mailto:robdep@unisa.it” –  “geo:0,0?via+Posidonia+Salerno+Italy” –  “tel:+391112223456” –  “content://com.android.contacts/contacts” •  Esempi di coppie (azione,daH): –  ACTION_VIEW, content://contacts/people/1 –  ACTION_DIAL, content://contacts/people/1 –  ACTION_DIAL, tel:1112233 Intent Android Mobile Programming – Prof. R. De Prisco Slide 86 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Altri parH di un intent –  Category •  informazioni aggiunHve sull’azione da eseguire –  es. CATEGORY_BROWSABLE significa che si può usare un browser come Component –  Type •  specifica in modo esplicito il Hpo (MIME) dei daH. Normalmente il Hpo viene dedono automaHcamente –  Component •  Specifica in modo esplicito l’aEvità da eseguire (che altrimenH verrebbe dedona dalle altre informazioni) –  Extras •  un bundle di informazioni addizionali (daH specifici per l’aEvità). 9 16/10/14 Intent Android Mobile Programming – Prof. R. De Prisco Slide 87 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Risoluzione esplicita –  specifichiamo in modo esplicito l’aEvità (Component) che vogliamo lanciare •  Risoluzione implicita –  Component non è specificata –  Android sceglie un’aEvità appropriata, in base a • 
• 
• 
• 
AcHon Type URI Category –  Le aEvità dichiarano le acHon che possono soddisfare nel manifesto Intent Android Mobile Programming – Prof. R. De Prisco Slide 88 Università di Salerno -­‐ a.a. 2013-­‐2014 Intent i; i = newIntent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI); startAcHvityForResult(i, REQUEST_CODE); •  Azione: ACTION_PICK –  Chiede di selezionare un item •  Data: –  ContactsContract.Contacts.CONTENT_URI –  “content://com.android.contacts/contacts” •  startAcHvityForResult –  lancia l’aEvità chiedendo un risultato –  REQUEST_CODE serve ad indenHficare la richiesta 10 16/10/14 Intent Android Mobile Programming – Prof. R. De Prisco Slide 89 Università di Salerno -­‐ a.a. 2013-­‐2014 @Override protected void onAcHvityResult(int request, int result, Intent data) { if (request == REQUEST_CODE && result == AcHvity.RESULT_OK) { … •  onAcHvityResult –  viene chiamato quando si ritorna all’aEvità di partenza –  permene di controllare il risultato resHtuito •  controlliamo il REQUEST_CODE •  in questo case anche un flag di OK •  gesHamo i daH resHtuiH Intent Extras Android Mobile Programming – Prof. R. De Prisco Slide 90 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Informazioni “extra” –  coppie chiave-­‐valore •  putExtra •  getExtra intent.putExtra(“CONTATORE”,c); intent.putExtra(“STRINGA”,”Ciao”); intent.putExtras(bundle); c = intent.getExtra(“CONTATORE”); stringa = intent.getExtra(“STRINGA”); Bundle b = intent.getExtras(); 11 16/10/14 Intent Flags Android Mobile Programming – Prof. R. De Prisco Slide 91 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Informazione su come l’intent dovrebbe essere tranato –  Esempi: •  FLAG_ACTIVITY_NO_HISTORY –  non memorizzare l’aEvità nello stack delle aEvità •  FLAG_DEBUG_LOG_RESOLUTION –  stampa informazioni addizionali quando si l’intent viene eseguito –  molto uHle in fase di debug se l’intent che vogliamo far eseguire non viene eseguito Intent Component Android Mobile Programming – Prof. R. De Prisco Slide 92 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Permene di specificare l’aEvità “target” –  da usare quando c’è una sola specifica aEvità (componente) che deve ricevere l’intent Intent intent = new Intent(Context context, Class<?> class); //oppure intent.setComponent(…); intent.setClass(…); intent.setClassName(…); 12 16/10/14 Slide Intent 93 Università di Salerno -­‐ a.a. 2013-­‐2014 Android Mobile Programming – Prof. R. De Prisco Quiz
Quiz Android Mobile Programming – Prof. R. De Prisco Slide 94 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Cosa succede se ruoHamo lo schermo? –  Un utente può barare sfrunando questo fano Correggere l’errore dovuto alle rotazioni nell’app Quiz •  L’app Quiz conHnua a contare le risposte sbagliate Fare in modo che il click su una risposta venga contato una sola volta per ogni domanda 13