Corso di laurea in Informatica Mobile Prof. De Prisco Prova scritta del 28/01/2015 NOME: COGNOME: MATRICOLA: Domande Punti 1 /100 2 /100 3 /100 4 /100 5 /100 6 /100 7 /100 8 /100 9 /100 10 /100 TOTALE /100
Quesito 1 A cosa serve il file AndroidManifest.xml? Quali sono le principali informazioni contenute in questo file? 1
Quesito 2 Durante lo sviluppo di un app è fondamentale individuare gli errori di programmazione che inevitabilmente si commettono. Descrivere almeno uno strumento che ci permetta di effettuare il debug di un app. 2
Quesito 3 Fornire il codice xml per il layout della figura sulla destra. L immagine è memorizzata nel flle drawable/android. Il colore di sfondo dell ImageView è #EFDCBA, mentre quello del LinearLayout che contiene il TextView e l EditText è #ABCDEF. Il layout radice è un RelativeLayout. 3
Quesito 4 Dire se le seguenti successioni di chiamate ai metodi del ciclo di vita delle attività sono possibili e se lo sono in quali casi si sono potute verificare. Successione A 1. oncreate() 2. onstart() 3. onresume() Successione B 1. oncreate() 2. onstart() 3. onresume() 4. onstop() 5. onpause() 6. oncreate() Successione C 1. oncreate() 2. onstart() 3. onresume() 4. onpause() 5. onstop() 6. ondestroy 7. oncreate() 8. onstart() 9. onresume() Successione C 1. oncreate() 2. onstart() 3. onresume() 4. onpause() 5. onstop() 6. onstart() 7. onresume() 4
Quesito 5 L attività ActivityA utilizza il seguente snippet di codice per lanciare l attività ActivityB: Intent i = new Intent(); i.setclass(getapplicationcontext(), ActivityB.class); startactivity(i); L attività ActivityB riceve l intent nel metodo oncreate: protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); Intent i = getintent(); Supponendo che l ActivityA debba inviare un intero memorizzato nella variabile counter, cosa (e dove) si dovrebbe inserire negli snippet di codice riportati sopra? E se l ActivityA ha bisogno di ottenere un risultato dall ActivityB? Cosa bisogna fare? 5
Quesito 6 Completare il seguente codice per far in modo che l utente veda nel widget percentualetextview la parcentuale di completamento dell AsyncTask (si assuma di conoscere la grandezza del task e quindi di poter fornire informazioni sulla percentuale di completamento) e che alla fine del task l utenta veda il risultato nel widget risultatotextview: public class ThreadAsyncTaskActivity extends Activity { TextView percentualetextview; TextView risultatotextview; protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main_layout); percentualetextview = (TextView)findViewById(R.id.percentualeTextView); risultatotextview = (TextView)findViewById(R.id.risultatoTextView);. class LoadIconTask extends AsyncTask<Integer, Integer, String> { protected void onpreexecute() { protected String doinbackground(integer... values) { String str; //str è la Stringa risultato, il valore non ci interessa return str; protected void onprogressupdate(integer... values) { protected void onpostexecute(string str) { 6
Quesito 7 Si consideri il seguente layout: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" <ImageView android:id="@+id/myimage android:layout_centerinparent="true" android:layout_width="200dp" android:layout_height="200dp" android:src="@drawable/picture" /> </RelativeLayout> e il seguente codice: public class MainActivity extends Activity { protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); ImageView img = (ImageView) findviewbyid(r.id.myimage); Log.d("DEBUG","largezza immagine: "+img.getwidth()); Log.d("DEBUG"," altezza immagine: "+img.getheight()); che semplicemente stampa due messaggi di debug con la larghezza e l altezza dell immagine. Nonostatnte il widget espliciti 200dp sia come larghezza che come altezza, lanciando l app si ottengono i seguenti messaggi di debug: DEBUG larghezza immagine: 0 DEBUG altezza immagine: 0 Sapete spiegare perché e come fare per ottenere la larghezza e l altezza delle immagine usando img.getwidth() e img.getheight()? 7
Quesito 8 Pasquale il Programmatore è alle prese con lo sviluppo di un app per la quale utilizza il metodo onsaveinstancestate() per salvare lo stato dell app e successivamente ripristinarlo nel metodo oncreate(savedinstancebundle) quando l oggetto savedinstancebundle contiene dati precedentemente salvati. Questo lo mette al riparo dalla perdita dello stato dovuta alle rotazioni del dispositivo che forzano l esecuzione di ondestroy e di oncreate (e degli altri metodi del ciclo di vita delle activity). Pasquale è soddisfatto perché è riuscito a gestire le rotazioni. Tuttavia si è accorto che quando l utente esce dell app e poi successivamente la rilancia, l app riparte dallo stato iniziale. Pasquale vorrebbe che quando l utente rientra nell app venga ripristinato l ultimo stato in cui si trovava l app prima che l utente uscisse dell app. Suggerire a Pasquale un approccio alternativo che gli permetta di risolvere contemporaneamente i due problemi (perdita dello stato dovuto alla rotazione, perdita dello stato dovuto all uscita dall applicazione). 8
Quesito 9 Si parli dei BroadcastReceiver in Android. 9
Quesito 10 Che cosa descrive il seguente file XML? <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareinterpolator="false" > <rotate android:startoffset="0" android:duration="4000" android:fromdegrees="0" android:todegrees="1440" android:interpolator="@android:anim/accelerate_interpolator" android:pivotx="25%" android:pivoty="25%" /> <rotate android:startoffset="4000" android:duration="4000" android:fromdegrees="1440" android:todegrees="0" android:interpolator="@android:anim/decelerate_interpolator" android:pivotx="75%" android:pivoty="75%" /> </set> 10