Android översikt TDDD80 Mobila och sociala applikationer
Vad som skiljer Android från Java Responsiv Appar får ett par sekunder på sig att reagera på användarinput Resurssnål Appar i bakgrunden dödas när minnet behövs för annat Så fort app:en hamnar i bakgrunden är det fritt fram för Android att döda den Jfr. vanlig Quit på en desktop Ges ingen tid att spara undan viktig info
Java Android Lägre minnesanv.
Android app
Egen mobil eller platta
Felsökning via USB-koppling
Emulator Emulerar en AVD (Android Virtual Device) Har AVD Välj CPU, etc. HAX hardware acceleration Kamera Sensorer Nätverk http://developer.android.com/tools/devices/emulator.html
Lifecycle för kodkomponenter
Spara undan tillstånd Processen stoppas Utslängd urminnet
Aktiviteter startas av Android public class MainActivity extends AppCompatActivity { @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); } Ingen konstruktor @Override protected void onpause()
Aktiviteter dödas av Android Dödas T.ex. om appen hamnat i bakgrunden (och ont om minne) T.ex. om telefonen roteras Spara undan tillstånd i god tid, innan aktiviteten dödas. Två sätt: Ge dina vyer Id, och låt systemet spara dessa vyer Override på onsaveinstancestate()
GUI Graphical User Interface
Views (grafiska element)
XML extensible Markup Language Ung. som html, fast för vilka data som helst fritt att bestämma taggar och attribut <img src="madonna.jpg" alt='foligno Madonna, by Raphael' /> <step number="3">connect A to B.</step>
Android UI layout i XML <LinearLayout xmlns:android="http://schemas.android.com/ " xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:orientation= vertical" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:showin="@layout/activity_my">
XML kod XML Kod Statisk placering och utseende på komponenter (dvs. kan inte ta bort under körning) Tomma behållare kan läggas ut i xml (FrameLayout) Dynamiskt tillägg/borttagning av element Fyllning med innehåll
Fragment Fragment kan åka in/ur activity Kan inte lita på att fragment x just nu finns där Fragment ska kommunicera via aktiviteten Komm. till aktivitet Definiera ett interface som aktiviteten ska implementera Anropa callback-metoden vid knapptryck, etc Komm. från aktivitet Hitta fragmentet, findfragmentbyid() http://developer.android.com/training/basics/fragments/co mmunicating.html
Vanliga problem med fragment Hamnat utanför skärmen Är Layout:en rätt konfigurerad? T.ex. LinearLayout är direction rätt? Hittar inte vyn ifrån koden Finns vyn verkligen på skärmen? Lägg anrop findviewbyid( ) I onactivitycreated()
Fånga upp klick (enkelt) I XML: <Button android:layout_width="wrap_content android:layout_height="wrap_content android:text="@string/button_send android:onclick="sendmessage" /> I din kod: public void sendmessage(view view) { }
Fånga upp klick (rekommenderat) I Activity eller i Fragment Button btn = (Button) findviewbyid(r.id.mybutton); btn.setonclicklistener(new View.OnClickListener() { @Override public void onclick(view view) { sendmessage(view); } }); public void sendmessage(view view) { }
Olika skärmstorlekar http://developer.android.com/guide/practices/tablets-and-handsets.html
Aktivitet Huvudbeståndsdel i appen
Aktivitet Vilken aktivitet är main AndroidManifest.xml <activity... > <intent-filter... > <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter>... </activity>
Activity Ger uppdelning i tasks som är logiska för användaren Skriva inlägg Kolla på flöde Dela en bild Upptar hela skärmen När användaren klar med uppgiften Bakåt/uppåt-knapp Aktiviteten dödas
Anrop med intent Går via OS Vet inte alltid om finns aktivitet som kan ta emot Android kan launcha annan app om nödvändigt
Anrop av aktiviteter med intent Förfrågan att någon utför en typ av uppgift Intent intent = new Intent(Intent.ACTION_VIEW, ); fyll på med extra information att skicka med startactivity(intent); Starta aktivitet i egna appen Intent intent = new Intent(this, NextActivity.class); fyll på med extra information att skicka med startactivity(intent);
Exempel på intent public void createalarm(string message, int hour, int minutes) { Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM).putExtra(AlarmClock.EXTRA_MESSAGE, message).putextra(alarmclock.extra_hour, hour).putextra(alarmclock.extra_minutes, minutes); if (intent.resolveactivity(getpackagemanager())!= null) { startactivity(intent); } }
Att ta emot resultat från en aktivitet Activity1 anropar activity2 startactivityforresult( ) Callback: Activity1 implementerar onactivityresult() som Android anropar när activity2 är klar Ex activity1: @Override protected void onactivityresult(, Intent data) { } Intent med resultat-data
Nätverk
Nätverk AndroidAsyncHttp Populärt bibliotek http://loopj.com/android-async-http/ f Volley Googles egna bibliotek http://developer.android.com/training/volley/ind ex.html
Volley
För större nerladdningar Använd inte Volley Kräver att hela hämtade innehållet ligger i minnet under parsning Bättre att starta en Service i bakgrunden OBS! Bör startas på sin egen tråd! Mha AsyncTask OBS! Ingen garanti att servicen inte avslutas abrupt (t.ex. vid skärmrotation)
Trådar
GUI responsiveness Appen måste reagera på användarinput inom 5 sekunder (helst 100-200 ms) Annars får användaren en "Application Not Responding" (ANR) dialog
Trådar Render thread Animeringar UI thread (main thread) Reseverat för användarinteraktion Visa info Reagera på klick, etc. Worker thread (1, 2, 3,.) För tunga/långsamma saker i bakgrunden
AsyncTask private class HeavyTask extends AsyncTask<Long>{ } // Do the long-running work in here protected Long doinbackground(url... urls) { // This is called when doinbackground() is finished protected void onpostexecute(long result) { } shownotification("downloaded " + result + " bytes"); Ber artigt att få komma tillbaks till UI-tråden (så fort detta blir möjligt/lämpligt)
rita.kovordanyi@liu.se www.liu.se