Bagikan melalui


Siklus Hidup Aktivitas

Aktivitas adalah blok penyusun dasar aplikasi Android dan dapat ada di sejumlah status yang berbeda. Siklus hidup aktivitas dimulai dengan instansiasi dan berakhir dengan penghancuran, dan mencakup banyak status di antaranya. Ketika aktivitas berubah status, metode peristiwa siklus hidup yang sesuai dipanggil, memberi tahu aktivitas perubahan status yang akan datang dan memungkinkannya untuk menjalankan kode untuk beradaptasi dengan perubahan tersebut. Artikel ini memeriksa siklus hidup aktivitas dan menjelaskan tanggung jawab yang dimiliki aktivitas selama setiap perubahan status ini menjadi bagian dari aplikasi yang berperilaku baik dan dapat diandalkan.

Gambaran Umum Siklus Hidup Aktivitas

Aktivitas adalah konsep pemrograman yang tidak biasa khusus untuk Android. Dalam pengembangan aplikasi tradisional biasanya ada metode utama statis, yang dijalankan untuk meluncurkan aplikasi. Namun, dengan Android, hal-hal yang berbeda; Aplikasi Android dapat diluncurkan melalui aktivitas terdaftar apa pun dalam aplikasi. Dalam praktiknya, sebagian besar aplikasi hanya akan memiliki aktivitas tertentu yang ditentukan sebagai titik masuk aplikasi. Namun, jika aplikasi mengalami crash, atau dihentikan oleh OS, OS dapat mencoba memulai ulang aplikasi pada aktivitas terbuka terakhir atau di tempat lain dalam tumpukan aktivitas sebelumnya. Selain itu, OS dapat menjeda aktivitas saat tidak aktif, dan mengklaimnya kembali jika memorinya rendah. Pertimbangan yang cermat harus dilakukan untuk memungkinkan aplikasi memulihkan statusnya dengan benar jika aktivitas dimulai ulang, terutama jika aktivitas tersebut tergantung pada data dari aktivitas sebelumnya.

Siklus hidup aktivitas diimplementasikan sebagai kumpulan metode yang dipanggil OS sepanjang siklus hidup aktivitas. Metode ini memungkinkan pengembang untuk menerapkan fungsionalitas yang diperlukan untuk memenuhi persyaratan manajemen status dan sumber daya aplikasi mereka.

Sangat penting bagi pengembang aplikasi untuk menganalisis persyaratan setiap aktivitas untuk menentukan metode mana yang diekspos oleh siklus hidup aktivitas yang perlu diimplementasikan. Kegagalan untuk melakukan ini dapat mengakibatkan ketidakstabilan aplikasi, crash, kembung sumber daya, dan bahkan mungkin mendasar ketidakstabilan OS.

Bab ini memeriksa siklus hidup aktivitas secara rinci, termasuk:

  • Status Aktivitas
  • Metode Siklus Hidup
  • Mempertahankan Status Aplikasi

Bagian ini juga mencakup panduan yang memberikan contoh praktis tentang cara menghemat status secara efisien selama siklus hidup Aktivitas. Pada akhir bab ini, Anda harus memiliki pemahaman tentang siklus hidup Aktivitas dan cara mendukungnya dalam aplikasi Android.

Siklus Hidup Aktivitas

Siklus hidup aktivitas Android terdiri dari kumpulan metode yang diekspos dalam kelas Aktivitas yang memberi pengembang kerangka kerja manajemen sumber daya. Kerangka kerja ini memungkinkan pengembang untuk memenuhi persyaratan manajemen status unik dari setiap aktivitas dalam aplikasi dan menangani manajemen sumber daya dengan benar.

Status Aktivitas

OS Android melakukan arbitrase Aktivitas berdasarkan statusnya. Ini membantu Android mengidentifikasi aktivitas yang tidak lagi digunakan, memungkinkan OS untuk mengklaim kembali memori dan sumber daya. Diagram berikut mengilustrasikan status yang dapat dilalui Aktivitas selama masa pakainya:

Activity states diagram

Status-status ini dapat dipecah menjadi 4 kelompok utama sebagai berikut:

  1. Aktif atau Berjalan – Aktivitas dianggap aktif atau berjalan jika berada di latar depan, juga dikenal sebagai bagian atas tumpukan aktivitas. Ini dianggap sebagai aktivitas prioritas tertinggi di Android, dan dengan demikian hanya akan dimatikan oleh OS dalam situasi ekstrem, seperti jika aktivitas mencoba menggunakan lebih banyak memori daripada yang tersedia di perangkat karena ini dapat menyebabkan UI menjadi tidak responsif.

  2. Dijeda – Saat perangkat tidur, atau aktivitas masih terlihat tetapi sebagian disembunyikan oleh aktivitas baru yang tidak berukuran penuh atau transparan, aktivitas dianggap dijeda. Aktivitas yang dijeda masih hidup, yaitu mempertahankan semua informasi status dan anggota, dan tetap melekat pada manajer jendela. Ini dianggap sebagai aktivitas prioritas tertinggi kedua di Android dan, dengan demikian, hanya akan dimatikan oleh OS jika membunuh aktivitas ini akan memenuhi persyaratan sumber daya yang diperlukan untuk menjaga Aktivitas Aktif/Berjalan tetap stabil dan responsif.

  3. Dihentikan/Di latar Belakang – Aktivitas yang sepenuhnya dikaburkan oleh aktivitas lain dianggap dihentikan atau di latar belakang. Aktivitas yang dihentikan masih mencoba mempertahankan informasi status dan anggota mereka selama mungkin, tetapi aktivitas yang dihentikan dianggap sebagai prioritas terendah dari tiga negara bagian dan, dengan demikian, OS akan mematikan aktivitas dalam keadaan ini terlebih dahulu untuk memenuhi persyaratan sumber daya dari aktivitas prioritas yang lebih tinggi.

  4. Dihidupkan ulang - Dimungkinkan untuk aktivitas yang berada di mana saja dari dijeda hingga dihentikan dalam siklus hidup untuk dihapus dari memori oleh Android. Jika pengguna menavigasi kembali ke aktivitas yang harus dimulai ulang, dipulihkan ke status tersimpan sebelumnya, lalu ditampilkan kepada pengguna.

Pembuatan Ulang Aktivitas sebagai Respons terhadap Perubahan Konfigurasi

Untuk membuat masalah lebih rumit, Android melemparkan satu kunci inggris lagi dalam campuran yang disebut Perubahan Konfigurasi. Perubahan konfigurasi adalah siklus penghancuran/pembuatan ulang aktivitas cepat yang terjadi ketika konfigurasi aktivitas berubah, seperti ketika perangkat diputar (dan aktivitas perlu dibangun kembali dalam mode lanskap atau potret), ketika keyboard ditampilkan (dan aktivitas disajikan dengan kesempatan untuk mengubah ukurannya sendiri), atau ketika perangkat ditempatkan di dermaga, antara lain.

Perubahan konfigurasi masih menyebabkan perubahan Status Aktivitas yang sama yang akan terjadi selama menghentikan dan memulai ulang aktivitas. Namun, untuk memastikan bahwa aplikasi terasa responsif dan berkinerja baik selama perubahan konfigurasi, penting bagi mereka untuk ditangani secepat mungkin. Karena itu, Android memiliki API tertentu yang dapat digunakan untuk mempertahankan status selama perubahan konfigurasi. Kami akan membahas ini nanti di bagian Mengelola Status Sepanjang Siklus Hidup.

Metode Siklus Hidup Aktivitas

Android SDK dan, berdasarkan ekstensi, kerangka kerja Xamarin.Android menyediakan model yang kuat untuk mengelola status aktivitas dalam aplikasi. Ketika status aktivitas berubah, aktivitas diberi tahu oleh OS, yang memanggil metode tertentu pada aktivitas tersebut. Diagram berikut mengilustrasikan metode ini sehubungan dengan Siklus Hidup Aktivitas:

Activity Lifecycle flowchart

Sebagai pengembang, Anda dapat menangani perubahan status dengan mengambil alih metode ini dalam aktivitas. Namun, penting untuk dicatat bahwa semua metode siklus hidup dipanggil pada utas UI dan akan memblokir OS agar tidak melakukan pekerjaan UI berikutnya, seperti menyembunyikan aktivitas saat ini, menampilkan aktivitas baru, dll. Dengan demikian, kode dalam metode ini harus sesingkat mungkin untuk membuat aplikasi terasa berkinerja baik. Setiap tugas yang berjalan lama harus dijalankan pada utas latar belakang.

Mari kita periksa masing-masing metode siklus hidup ini dan penggunaannya:

OnCreate

OnCreate adalah metode pertama yang dipanggil saat aktivitas dibuat. OnCreate selalu ditimpa untuk melakukan inisialisasi startup apa pun yang mungkin diperlukan oleh Aktivitas seperti:

  • Membuat tampilan
  • Menginisialisasi variabel
  • Mengikat data statis ke daftar

OnCreatemengambil parameter Bundel, yang merupakan kamus untuk menyimpan dan meneruskan informasi status dan objek antara aktivitas Jika bundel tidak null, ini menunjukkan aktivitas dimulai ulang dan harus memulihkan statusnya dari instans sebelumnya. Kode berikut mengilustrasikan cara mengambil nilai dari bundel:

protected override void OnCreate(Bundle bundle)
{
   base.OnCreate(bundle);

   string intentString;
   bool intentBool;

   if (bundle != null)
   {
      intentString = bundle.GetString("myString");
      intentBool = bundle.GetBoolean("myBool");
   }

   // Set our view from the "main" layout resource
   SetContentView(Resource.Layout.Main);
}

Setelah OnCreate selesai, Android akan memanggil OnStart.

OnStart

OnStart selalu dipanggil oleh sistem setelah OnCreate selesai. Aktivitas dapat mengambil alih metode ini jika mereka perlu melakukan tugas tertentu tepat sebelum aktivitas terlihat seperti menyegarkan nilai tampilan saat ini dalam aktivitas. Android akan memanggil OnResume segera setelah metode ini.

OnResume

Sistem memanggil OnResume ketika Aktivitas siap untuk mulai berinteraksi dengan pengguna. Aktivitas harus mengambil alih metode ini untuk melakukan tugas seperti:

  • Meningkatkan kecepatan bingkai (tugas umum dalam pengembangan game)
  • Memulai animasi
  • Mendengarkan pembaruan GPS
  • Menampilkan pemberitahuan atau dialog yang relevan
  • Menghubungkan penanganan aktivitas eksternal

Sebagai contoh, cuplikan kode berikut menunjukkan cara menginisialisasi kamera:

protected override void OnResume()
{
    base.OnResume(); // Always call the superclass first.

    if (_camera==null)
    {
        // Do camera initializations here
    }
}

OnResume penting karena setiap operasi yang dilakukan OnPause di harus tidak dilakukan di OnResume, karena itu adalah satu-satunya metode siklus hidup yang dijamin untuk dijalankan setelah OnPause ketika membawa aktivitas kembali ke kehidupan.

OnPause

OnPause dipanggil ketika sistem akan menempatkan aktivitas ke latar belakang atau ketika aktivitas menjadi dikaburkan sebagian. Aktivitas harus mengambil alih metode ini jika perlu:

  • Menerapkan perubahan yang tidak disimpan ke data persisten

  • Menghancurkan atau membersihkan objek lain yang mengkonsumsi sumber daya

  • Tingkat bingkai ramp down dan menjeda animasi

  • Batalkan pendaftaran penanganan aktivitas eksternal atau penanganan pemberitahuan (yaitu yang terkait dengan layanan). Ini harus dilakukan untuk mencegah kebocoran memori Aktivitas.

  • Demikian juga, jika Aktivitas telah menampilkan dialog atau pemberitahuan apa pun, mereka harus dibersihkan dengan metode ..Dismiss()

Sebagai contoh, cuplikan kode berikut akan merilis kamera, karena Aktivitas tidak dapat menggunakannya saat dijeda:

protected override void OnPause()
{
    base.OnPause(); // Always call the superclass first

    // Release the camera as other activities might need it
    if (_camera != null)
    {
        _camera.Release();
        _camera = null;
    }
}

Ada dua kemungkinan metode siklus hidup yang akan dipanggil setelah OnPause:

  1. OnResume akan dipanggil jika Aktivitas akan dikembalikan ke latar depan.
  2. OnStop akan dipanggil jika Aktivitas ditempatkan di latar belakang.

OnStop

OnStop dipanggil ketika aktivitas tidak lagi terlihat oleh pengguna. Ini terjadi ketika salah satu hal berikut ini terjadi:

  • Aktivitas baru sedang dimulai dan menutupi aktivitas ini.
  • Aktivitas yang ada sedang dibawa ke latar depan.
  • Aktivitas sedang dihancurkan.

OnStop mungkin tidak selalu dipanggil dalam situasi memori rendah, seperti ketika Android kelaparan untuk sumber daya dan tidak dapat latar belakang Aktivitas dengan benar. Untuk alasan ini, sebaiknya jangan mengandalkan OnStop panggilan saat menyiapkan Aktivitas untuk penghancuran. Metode siklus hidup berikutnya yang mungkin dipanggil setelah metode ini adalah OnDestroy jika Aktivitas akan hilang, atau OnRestart jika Aktivitas akan kembali berinteraksi dengan pengguna.

OnDestroy

OnDestroy adalah metode akhir yang dipanggil pada instans Aktivitas sebelum dihancurkan dan dihapus sepenuhnya dari memori. Dalam situasi ekstrem Android dapat mematikan proses aplikasi yang menghosting Aktivitas, yang akan mengakibatkan OnDestroy tidak dipanggil. Sebagian besar Aktivitas tidak akan menerapkan metode ini karena sebagian besar pembersihan dan pematian telah dilakukan dalam OnPause metode dan OnStop . Metode OnDestroy ini biasanya diganti untuk membersihkan tugas jangka panjang yang mungkin membocorkan sumber daya. Contohnya mungkin adalah utas latar belakang yang dimulai di OnCreate.

Tidak akan ada metode siklus hidup yang dipanggil setelah Aktivitas dihancurkan.

OnRestart

OnRestart dipanggil setelah aktivitas Anda dihentikan, sebelum dimulai lagi. Contoh yang baik dari ini adalah ketika pengguna menekan tombol beranda saat melakukan aktivitas di aplikasi. Ketika ini terjadi OnPause dan kemudian OnStop metode dipanggil, dan Aktivitas dipindahkan ke latar belakang tetapi tidak dihancurkan. Jika pengguna kemudian memulihkan aplikasi dengan menggunakan pengelola tugas atau aplikasi serupa, Android akan memanggil OnRestart metode aktivitas.

Tidak ada pedoman umum untuk jenis logika apa yang harus diimplementasikan dalam OnRestart. Ini karena OnStart selalu dipanggil terlepas dari apakah Aktivitas sedang dibuat atau dimulai ulang, sehingga sumber daya apa pun yang diperlukan oleh Aktivitas harus diinisialisasi di OnStart, bukan OnRestart.

Metode siklus hidup berikutnya yang dipanggil setelahnya OnRestart adalah OnStart.

Kembali vs. Home

Banyak perangkat Android memiliki dua tombol yang berbeda: tombol "Kembali" dan tombol "Beranda". Contohnya dapat dilihat pada cuplikan layar Android 4.0.3 berikut:

Back and Home buttons

Ada perbedaan halus antara dua tombol, meskipun tampaknya memiliki efek yang sama untuk menempatkan aplikasi di latar belakang. Saat pengguna mengklik tombol Kembali, mereka memberi tahu Android bahwa mereka selesai dengan aktivitas tersebut. Android akan menghancurkan Aktivitas. Sebaliknya, ketika pengguna mengklik tombol Beranda, aktivitas hanya ditempatkan ke latar belakang - Android tidak akan mematikan aktivitas.

Mengelola Status Sepanjang Siklus Hidup

Ketika Aktivitas dihentikan atau dihancurkan, sistem memberikan kesempatan untuk menyimpan status Aktivitas untuk rehidrasi nanti. Status tersimpan ini disebut sebagai status instans. Android menyediakan tiga opsi untuk menyimpan status instans selama siklus hidup Aktivitas:

  1. Menyimpan nilai primitif dalam yang Dictionary dikenal sebagai Bundel yang akan digunakan Android untuk menyimpan status.

  2. Membuat kelas kustom yang akan menyimpan nilai kompleks seperti bitmap. Android akan menggunakan kelas kustom ini untuk menyimpan status.

  3. Menghindari siklus hidup perubahan konfigurasi dan dengan asumsi tanggung jawab penuh untuk mempertahankan status dalam aktivitas.

Panduan ini mencakup dua opsi pertama.

Status Bundel

Opsi utama untuk menyimpan status instans adalah menggunakan objek kamus kunci/nilai yang dikenal sebagai Bundel. Ingat bahwa ketika Aktivitas dibuat bahwa OnCreate metode diteruskan bundel sebagai parameter, bundel ini dapat digunakan untuk memulihkan status instans. Tidak disarankan untuk menggunakan bundel untuk data yang lebih kompleks yang tidak akan dengan cepat atau mudah diserialisasikan ke pasangan kunci/nilai (seperti bitmap); sebaliknya, itu harus digunakan untuk nilai sederhana seperti string.

Aktivitas menyediakan metode untuk membantu menyimpan dan mengambil status instans di Bundel:

  • OnSaveInstanceState – Ini dipanggil oleh Android saat aktivitas sedang dihancurkan. Aktivitas dapat menerapkan metode ini jika perlu mempertahankan item status kunci/nilai apa pun.

  • OnRestoreInstanceState – Ini dipanggil setelah OnCreate metode selesai, dan memberikan kesempatan lain bagi Aktivitas untuk memulihkan statusnya setelah inisialisasi selesai.

Diagram berikut mengilustrasikan bagaimana metode ini digunakan:

Bundle states flowchart

OnSaveInstanceState

OnSaveInstanceState akan dipanggil karena Aktivitas sedang dihentikan. Ini akan menerima parameter bundel tempat Aktivitas dapat menyimpan statusnya. Saat perangkat mengalami perubahan konfigurasi, Aktivitas dapat menggunakan Bundle objek yang diteruskan untuk mempertahankan status Aktivitas dengan mengambil alih OnSaveInstanceState. Sebagai contoh, perhatikan kode berikut:

int c;

protected override void OnCreate (Bundle bundle)
{
  base.OnCreate (bundle);

  this.SetContentView (Resource.Layout.SimpleStateView);

  var output = this.FindViewById<TextView> (Resource.Id.outputText);

  if (bundle != null) {
    c = bundle.GetInt ("counter", -1);
  } else {
    c = -1;
  }

  output.Text = c.ToString ();

  var incrementCounter = this.FindViewById<Button> (Resource.Id.incrementCounter);

  incrementCounter.Click += (s,e) => {
    output.Text = (++c).ToString();
  };
}

Kode di atas menaikkan bilangan bulat bernama c saat tombol bernama incrementCounter diklik, menampilkan hasilnya dalam nama TextView output. Ketika perubahan konfigurasi terjadi - misalnya, ketika perangkat diputar - kode di atas akan kehilangan nilai c karena bundle akan , nullseperti yang ditunjukkan pada gambar di bawah ini:

Display does not show previous value

Untuk mempertahankan nilai c dalam contoh ini, Aktivitas dapat mengambil alih OnSaveInstanceState, menyimpan nilai dalam bundel seperti yang ditunjukkan di bawah ini:

protected override void OnSaveInstanceState (Bundle outState)
{
  outState.PutInt ("counter", c);
  base.OnSaveInstanceState (outState);
}

Sekarang ketika perangkat diputar ke orientasi baru, bilangan bulat disimpan dalam bundel dan diambil dengan baris:

c = bundle.GetInt ("counter", -1);

Catatan

Penting untuk selalu memanggil implementasi OnSaveInstanceState dasar sehingga status hierarki tampilan juga dapat disimpan.

Tampilkan Status

Penimpaan OnSaveInstanceState adalah mekanisme yang sesuai untuk menyimpan data sementara dalam Aktivitas di seluruh perubahan orientasi, seperti penghitung dalam contoh di atas. Namun, implementasi OnSaveInstanceState default akan mengurus penyimpanan data sementara di UI untuk setiap tampilan, selama setiap tampilan memiliki ID yang ditetapkan. Misalnya, aplikasi memiliki elemen yang EditText ditentukan dalam XML sebagai berikut:

<EditText android:id="@+id/myText"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"/>

EditText Karena kontrol memiliki yang id ditetapkan, ketika pengguna memasukkan beberapa data dan memutar perangkat, data masih ditampilkan, seperti yang ditunjukkan di bawah ini:

Data is preserved in landscape mode

OnRestoreInstanceState

OnRestoreInstanceState akan dipanggil setelah OnStart. Ini memberikan aktivitas kesempatan untuk memulihkan status apa pun yang sebelumnya disimpan ke Bundel selama sebelumnya OnSaveInstanceState. Ini adalah bundel yang sama yang disediakan untuk OnCreate, namun.

Kode berikut menunjukkan bagaimana status dapat dipulihkan di OnRestoreInstanceState:

protected override void OnRestoreInstanceState(Bundle savedState)
{
    base.OnRestoreInstanceState(savedState);
    var myString = savedState.GetString("myString");
    var myBool = savedState.GetBoolean("myBool");
}

Metode ini ada untuk memberikan beberapa fleksibilitas ketika status harus dipulihkan. Terkadang lebih tepat untuk menunggu sampai semua inisialisasi dilakukan sebelum memulihkan status instans. Selain itu, subkelas Aktivitas yang ada mungkin hanya ingin memulihkan nilai tertentu dari status instans. Dalam banyak kasus, tidak perlu mengambil alih OnRestoreInstanceState, karena sebagian besar aktivitas dapat memulihkan status menggunakan bundel yang disediakan untuk OnCreate.

Untuk contoh status penyimpanan menggunakan Bundle, lihat Panduan - Menyimpan status Aktivitas.

Batasan Bundel

Meskipun OnSaveInstanceState memudahkan untuk menyimpan data sementara, data tersebut memiliki beberapa batasan:

  • Ini tidak dipanggil dalam semua kasus. Misalnya, menekan Beranda atau Kembali untuk keluar dari Aktivitas tidak akan mengakibatkan dipanggil OnSaveInstanceState .

  • Bundel yang diteruskan tidak OnSaveInstanceState dirancang untuk objek besar, seperti gambar. Dalam kasus objek besar, menyimpan objek dari OnRetainNonConfigurationInstance lebih disukai, seperti yang dibahas di bawah ini.

  • Data yang disimpan dengan menggunakan bundel diserialisasikan, yang dapat menyebabkan penundaan.

Status bundel berguna untuk data sederhana yang tidak menggunakan banyak memori, sedangkan data instans non-konfigurasi berguna untuk data yang lebih kompleks, atau data yang mahal untuk diambil, seperti dari panggilan layanan web atau kueri database yang rumit. Data instans non-konfigurasi disimpan dalam objek sesuai kebutuhan. Bagian berikutnya diperkenalkan OnRetainNonConfigurationInstance sebagai cara mempertahankan jenis data yang lebih kompleks melalui perubahan konfigurasi.

Mempertahankan Data Kompleks

Selain menyimpan data dalam bundel, Android juga mendukung penyimpanan data dengan menimpa OnRetainNonConfigurationInstance dan mengembalikan instans Java.Lang.Object yang berisi data untuk dipertahankan. Ada dua manfaat utama penggunaan OnRetainNonConfigurationInstance untuk menyimpan status:

  • Objek yang dikembalikan dari berkinerja OnRetainNonConfigurationInstance baik dengan jenis data yang lebih besar dan lebih kompleks karena memori mempertahankan objek ini.

  • Metode OnRetainNonConfigurationInstance ini dipanggil sesuai permintaan, dan hanya jika diperlukan. Ini lebih ekonomis daripada menggunakan cache manual.

Penggunaan OnRetainNonConfigurationInstance cocok untuk skenario di mana mahal untuk mengambil data beberapa kali, seperti dalam panggilan layanan web. Misalnya, pertimbangkan kode berikut yang mencari Twitter:

public class NonConfigInstanceActivity : ListActivity
{
  protected override void OnCreate (Bundle bundle)
  {
    base.OnCreate (bundle);
    SearchTwitter ("xamarin");
  }

  public void SearchTwitter (string text)
  {
    string searchUrl = String.Format("http://search.twitter.com/search.json?" + "q={0}&rpp=10&include_entities=false&" + "result_type=mixed", text);

    var httpReq = (HttpWebRequest)HttpWebRequest.Create (new Uri (searchUrl));
    httpReq.BeginGetResponse (new AsyncCallback (ResponseCallback), httpReq);
  }

  void ResponseCallback (IAsyncResult ar)
  {
    var httpReq = (HttpWebRequest)ar.AsyncState;

    using (var httpRes = (HttpWebResponse)httpReq.EndGetResponse (ar)) {
      ParseResults (httpRes);
    }
  }

  void ParseResults (HttpWebResponse httpRes)
  {
    var s = httpRes.GetResponseStream ();
    var j = (JsonObject)JsonObject.Load (s);

    var results = (from result in (JsonArray)j ["results"] let jResult = result as JsonObject select jResult ["text"].ToString ()).ToArray ();

    RunOnUiThread (() => {
      PopulateTweetList (results);
    });
  }

  void PopulateTweetList (string[] results)
  {
    ListAdapter = new ArrayAdapter<string> (this, Resource.Layout.ItemView, results);
  }
}

Kode ini mengambil hasil dari web yang diformat sebagai JSON, mengurainya, lalu menyajikan hasilnya dalam daftar, seperti yang ditunjukkan pada cuplikan layar berikut:

Results displayed on screen

Ketika perubahan konfigurasi terjadi - misalnya, ketika perangkat diputar - kode mengulangi proses. Untuk menggunakan kembali hasil yang awalnya diambil dan tidak menyebabkan panggilan jaringan redundan yang tidak perlu, kita dapat menggunakan OnRetainNonconfigurationInstance untuk menyimpan hasilnya, seperti yang ditunjukkan di bawah ini:

public class NonConfigInstanceActivity : ListActivity
{
  TweetListWrapper _savedInstance;

  protected override void OnCreate (Bundle bundle)
  {
    base.OnCreate (bundle);

    var tweetsWrapper = LastNonConfigurationInstance as TweetListWrapper;

    if (tweetsWrapper != null) {
      PopulateTweetList (tweetsWrapper.Tweets);
    } else {
      SearchTwitter ("xamarin");
    }

    public override Java.Lang.Object OnRetainNonConfigurationInstance ()
    {
      base.OnRetainNonConfigurationInstance ();
      return _savedInstance;
    }

    ...

    void PopulateTweetList (string[] results)
    {
      ListAdapter = new ArrayAdapter<string> (this, Resource.Layout.ItemView, results);
      _savedInstance = new TweetListWrapper{Tweets=results};
    }
}

Sekarang ketika perangkat diputar, hasil asli diambil dari LastNonConfiguartionInstance properti . Dalam contoh ini, hasilnya terdiri dari tweet yang string[] berisi. Karena OnRetainNonConfigurationInstance mengharuskan dikembalikan, string[] dibungkus dalam kelas yang subkelas Java.Lang.Object, seperti yang Java.Lang.Object ditunjukkan di bawah ini:

class TweetListWrapper : Java.Lang.Object
{
  public string[] Tweets { get; set; }
}

Misalnya, mencoba menggunakan sebagai objek yang TextView dikembalikan akan OnRetainNonConfigurationInstance membocorkan Aktivitas, seperti yang diilustrasikan oleh kode di bawah ini:

TextView _textView;

protected override void OnCreate (Bundle bundle)
{
  base.OnCreate (bundle);

  var tv = LastNonConfigurationInstance as TextViewWrapper;

  if(tv != null) {
    _textView = tv;
    var parent = _textView.Parent as FrameLayout;
    parent.RemoveView(_textView);
  } else {
    _textView = new TextView (this);
    _textView.Text = "This will leak.";
  }

  SetContentView (_textView);
}

public override Java.Lang.Object OnRetainNonConfigurationInstance ()
{
  base.OnRetainNonConfigurationInstance ();
  return _textView;
}

Di bagian ini, kami mempelajari cara mempertahankan data status sederhana dengan Bundle, dan mempertahankan jenis data yang lebih kompleks dengan OnRetainNonConfigurationInstance.

Ringkasan

Siklus hidup aktivitas Android menyediakan kerangka kerja yang kuat untuk manajemen status aktivitas dalam aplikasi tetapi mungkin sulit untuk dipahami dan diterapkan. Bab ini memperkenalkan berbagai status bahwa suatu aktivitas dapat dilalui selama masa pakainya, serta metode siklus hidup yang terkait dengan negara-negara tersebut. Selanjutnya, panduan diberikan tentang jenis logika apa yang harus dilakukan di masing-masing metode ini.