Laitteen kääntämisen sulava käsittely Androidilla

Androidissa on kätevä resurssijärjestelmä, jossa on mahdollista tarjota vaihtoehtoisia resursseja eri laitteistokokoonpanoille. Esimerkiksi voidaan käyttää erilaista käyttöliittymä-layoutia suurille ja pienille näytöille. Tämä mahdollistaa varsin suoraviivaisen käyttöliittymän viilauksen eri laitteille.

Järjestelmästä aiheutuu kuitenkin pieniä lieveilmiöitä. Koska periaatteessa mikä tahansa resurssi saattaa muuttua jos kokoonpanoa muutetaan, on Androidin oletuskäytäntö se, että jos jokin asia muuttuu, parhaillaan käytössä oleva aktiviteetti tuhoutuu ja se käynnistetään uudelleen. Tässä ei sinänsä ole mitään perustavanlaatuista vikaa, kunhan ohjelmoinnissa on otettu tämä huomioon. Siitä aiheutuu kuitenkin helposti hitautta kokoonpanon muuttuessa, sillä aktiviteetin luonti on usein varsin raskas prosessi.

Useat ominaisuudet eivät muutu käyttötilanteessa; esimerkiksi laitteen näyttö ei yleensä voi vaihtua kesken kaiken. Yleisin ohjelman ajon aikana tapahtuva kokoonpanomuutos on näytön kääntyminen. Tämä harvemmin aiheuttaa suuria muutoksia resursseihin; useimmiten korkeintaan käyttöliittymä-layout muuttuu. Laitetta kääntäessä tapahtuvaa hitautta voidaan siis helposti vähentää poistamalla oletustoimenpide (aktiviteetin sulkeminen ja uudelleenkäynnistys).

Koodiesimerkki selventänee asiaa paremmin kuin jaarittelu:

Tässä on aktiviteettimme ensimmäinen versio:

public class RotatingActivity extends Activity {

    /** Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
    }

}

Voidaksemme hoitaa itse tilanteen, jossa laite kääntyy, täytyy Androidille kertoa, että aktiviteetti hoitaa tämän kokoonpanomuutoksen. Tämä tapahtuu lisäämällä ohjelman AndroidManifest.xml:ään tähän aktiviteettiin attribuutti android:configChanges=”orientation” ts. aktiviteetti on manifestissa ilmaistu:

<activity android:name=".RotatingActivity"
    android:label="@string/app_name" android:configChanges="orientation">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Muutoksen voi toki tehdä myös Eclipsen graafisella työkalulla: välilehti “Application”, sieltä valitaan oikea aktiviteetti ja lisätään kohtaan “Config changes” arvo “orientation”.

Tällä muutoksella aktiviteetti säilyy sellaisenaan, kun laitetta kääntää. Tällaisessa pienessä esimerkissä nopeusero ei ole kummoinen, mutta todellisessa applikaatiossa ero on helposti huomattava.

Nyt kuitenkin suunnan muutos jää täysin huomiotta. Entäs, jos halutaan käyttää eri layoutia eri orientaatioissa? Tätä varten lisätään metodi aktiviteettiin, joka näyttää nyt seuraavalta:

public class RotatingActivity extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        setContentView(R.layout.main);
    }

}

Metodia onConfigurationChanged kutsutaan, kun tapahtuu kokoonpanomuutos, jonka aktiviteetti on ilmoittanut käsittelevänsä itse. Kutsu yläluokan metodiin on pakollinen, muuten ohjelma kaatuu. Tämän jälkeen asetetaan uudestaan aktiviteetin näkymä. Mutta mitä ihmettä? Kutsuhan on täysin sama kuin onCreate-metodissa, mikä siis muuttuu? Tässä on nimeomaan kulissien takana Androidin resurssijärjestelmä, joka osaa antaa oikeat resurssit kokoonpanosta riippuen (joka tässä on nyt siis nimeomaan tuo uusi, muuttunut kokoonpano). Tässä tapauksessa oli luotu erilliset “main” layoutit pysty- ja vaakasuunnalle, jolloin suunnan muuttuessa ladataan suunnasta riippuva layout.

Oikeassa sovelluksessa tulee luultavimmin tehdä muutakin kuin asettaa aktiviteetin näkymä, nimittäin populoida näkymä datalla, asettaa kuuntelijat nappuloille, yms. Kaikkea sellaista, mitä yleensä tehdään myös onCreate:n osana. Onkin varsin järkevää erottaa tuo käyttöliittymän alustus omaksi metodikseen, jota sitten kutsutaan niin onCreate:sta kuin onConfigurationChanged:sta. Näin varsin pienellä määrällä koodia saadaan aikaan selvästi nopeampi reagointi laitteen kääntämiseen.

iPhone-kehityksestä suomeksi

iPhone ja iPad ovat nyt kovassa huudossa. Päivittäin voimme lukea lehtijuttuja, kuinka suomalaisen Rovion Angry Birds valloittaa maailmaa, kuinka Helsingin Sanomat on julkaissut iPad-sovelluksensa tai kuinka Vanjoki hyppäsi Apple-kelkkaan.

Näiden tarinoiden taustalla on satojen tuntien iOS-kehitystyö, joiden tarinat ovat vielä jäännet suomeksi kertomatta.

iPhone-kehitys

Tämän blogin tarkoituksena on kertoa kaikille kiinnostuneille iOS-sovelluskehityksestä, siinä käytettävistä työkaluista, jipoista ja tärkeimmistä alaan liittyvistä uutisista.

Blogin kirjoittajina toimii Qvik Oy:n työntekijät, joilta löytyy kokemusta kymmenistä iOS-sovellutuksista ja yleisesti mobiilikehityksestä. Pyöritämme myös Android-kehityksestä kertovaa blogia osoitteessa androidkehitys.fi.

Androidkehitys.fi avattu

Tervehdys kaikki Android sovelluskehityksestä kiinnostuneet!

Tässä blogissa tullaan jatkossa julkaisemaan teknistä ja vähemmän teknistä asiaa Android sovelluskehitykseen liittyen. Pääosa asioista käsittelee natiivisovellusten kehitystä, julkaisua, jakelua, sovellusten dynamiikkaa, jne. Kehoitamme kaikkia osallistumaan keskusteluun ja ottamaan yhteyttä sivuston ylläpitäjiin mikäli olette kiinnostuneita Android sovelluskehityksestä.

Stay tuned!