├ľrnek durumu kullanarak bir Android Etkinlik durumu nas─▒l kaydedilir?


Al─▒nan cevaba git


Android SDK platformunda ├žal─▒┼č─▒yorum ve bir uygulaman─▒n durumunu nas─▒l kaydedece─čimiz biraz belirsiz. Bu nedenle, 'Merhaba, Android' ├Ârne─činin bu k├╝├ž├╝k yeniden yap─▒land─▒rmas─▒ verildi─činde:

 package com.android.hello;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class HelloAndroid extends Activity {

  private TextView mTextView = null;

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

    mTextView = new TextView(this);

    if (savedInstanceState == null) {
       mTextView.setText("Welcome to HelloAndroid!");
    } else {
       mTextView.setText("Welcome back.");
    }

    setContentView(mTextView);
  }
}
 

En basit durum i├žin yeterli olaca─č─▒n─▒ d├╝┼č├╝nd├╝m, ancak uygulamadan nas─▒l uzakla┼čsam da her zaman ilk mesaja cevap veriyor.

├ç├Âz├╝m├╝n ge├žersiz k─▒lma onPause veya bunun gibi bir ┼čey kadar basit oldu─čundan eminim , ancak belgelerde 30 dakikadan fazla bir s├╝redir d├╝┼čt├╝─č├╝mden beri bariz bir ┼čey bulamad─▒m.


2513









Cevap say─▒s─▒n─▒ say: 30






Bu gibi parametrelere onSaveInstanceState(Bundle savedInstanceState) de─či┼čtirmek istedi─činiz uygulama durum de─čerlerini ge├žersiz k─▒lman─▒z ve yazman─▒z gerekir Bundle :

 @Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  super.onSaveInstanceState(savedInstanceState);
  // Save UI state changes to the savedInstanceState.
  // This bundle will be passed to onCreate if the process is
  // killed and restarted.
  savedInstanceState.putBoolean("MyBoolean", true);
  savedInstanceState.putDouble("myDouble", 1.9);
  savedInstanceState.putInt("MyInt", 1);
  savedInstanceState.putString("MyString", "Welcome back to Android");
  // etc.
}
 

Paket, temel olarak bir NVP ("Ad-De─čer ├çifti") haritas─▒n─▒ saklaman─▒n bir yoludur ve bu gibi de─čerleri alaca─č─▒n─▒z yere onCreate() ve ayr─▒ca onRestoreInstanceState() buradan ge├žece─činiz yere:

 @Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  // Restore UI state from the savedInstanceState.
  // This bundle has also been passed to onCreate.
  boolean myBoolean = savedInstanceState.getBoolean("MyBoolean");
  double myDouble = savedInstanceState.getDouble("myDouble");
  int myInt = savedInstanceState.getInt("MyInt");
  String myString = savedInstanceState.getString("MyString");
}
 

Bu tekni─či genellikle uygulaman─▒z─▒n ├Ârnek de─čerlerini (se├žimler, kaydedilmemi┼č metinler vb.) Depolamak i├žin kullan─▒rs─▒n─▒z.


2486







Bu savedInstanceState , yaln─▒zca ge├žerli bir etkinlik ├Ârne─čiyle ili┼čkili durumun kaydedilmesi i├žindir; ├Ârne─čin, ge├žerli gezinme veya se├žim bilgisi; Android bir Etkinli─či yok edip yeniden olu┼čturursa, ├Ânceki gibi geri gelebilir. Belgelerine bak─▒n onCreate ve onSaveInstanceState

Daha uzun ├Âm├╝rl├╝ olmak i├žin bir SQLite veritaban─▒, dosya veya tercihler kullanmay─▒ d├╝┼č├╝n├╝n. Kal─▒c─▒ Devleti Kaydetme b├Âl├╝m├╝ne bak─▒n .


413







O oldu─čunu Not DE─×─░L kullan─▒m─▒na g├╝venli onSaveInstanceState ve onRestoreInstanceState kal─▒c─▒ veri Etkinlik devletler ├╝zerinde belgelere g├Âre, http://developer.android.com/reference/android/app/Activity.html .

Belgede ('Etkinlik Ya┼čam D├Âng├╝s├╝' b├Âl├╝m├╝nde):

Kal─▒c─▒ verileri kaydetmenin ├Ânemine dikkat edin onPause() , onSaveInstanceState(Bundle) ├ž├╝nk├╝ daha sonra ya┼čam d├Âng├╝s├╝ geri aramalar─▒n─▒n bir par├žas─▒ de─čildir, bu nedenle belgelerinde a├ž─▒kland─▒─č─▒ gibi her durumda aranmaz.

Ba┼čka bir deyi┼čle, kal─▒c─▒ veriler i├žin kaydetme / geri y├╝kleme kodunuzu onPause() ve onResume() !

EDIT : Daha fazla a├ž─▒klama i├žin i┼čte onSaveInstanceState() belgeler:

Bu y├Ântem, bir etkinlik ├Âld├╝r├╝lmeden ├Ânce ├ža─čr─▒l─▒r, b├Âylece ileride bir s├╝re geri d├Ând├╝─č├╝nde durumunu geri alabilir. ├ľrne─čin, B etkinli─či A etkinli─činin ├Ân├╝nde ba┼člat─▒l─▒rsa ve baz─▒ noktalarda A kayna─č─▒ kaynaklar─▒ geri almak i├žin ├Âld├╝r├╝l├╝rse, A etkinli─či kullan─▒c─▒ geri d├Ând├╝─č├╝nde bu y├Ântemle kullan─▒c─▒ arabiriminin ge├žerli durumunu kaydetme ┼čans─▒na sahip olur. A aktivitesine, kullan─▒c─▒ aray├╝z├╝n├╝n durumu onCreate(Bundle) veya ile geri y├╝klenebilir onRestoreInstanceState(Bundle) .


400







Meslekta┼č─▒m durum bilgilerini saklamak i├žin nas─▒l faaliyet ├Âmr├╝ ve devlet bilgilere a├ž─▒klamalar─▒n yer ald─▒─č─▒ Android cihazlar─▒nda uygulama durumunu a├ž─▒klayan bir makale yazd─▒m ve devlete tasarruf Bundle ve SharedPreferences ve burada bir g├Âz at─▒n .

Makale ├╝├ž yakla┼č─▒m─▒ kapsamaktad─▒r:

Bir ├Ârnek durum paketi kullanarak yerel de─či┼čken / UI kontrol verilerini uygulama ├Âmr├╝ boyunca (yani ge├žici olarak) depolay─▒n

 [Code sample ÔÇô Store state in state bundle]
@Override
public void onSaveInstanceState(Bundle savedInstanceState)
{
  // Store UI state to the savedInstanceState.
  // This bundle will be passed to onCreate on next call.  EditText txtName = (EditText)findViewById(R.id.txtName);
  String strName = txtName.getText().toString();

  EditText txtEmail = (EditText)findViewById(R.id.txtEmail);
  String strEmail = txtEmail.getText().toString();

  CheckBox chkTandC = (CheckBox)findViewById(R.id.chkTandC);
  boolean blnTandC = chkTandC.isChecked();

  savedInstanceState.putString(ÔÇťNameÔÇŁ, strName);
  savedInstanceState.putString(ÔÇťEmailÔÇŁ, strEmail);
  savedInstanceState.putBoolean(ÔÇťTandCÔÇŁ, blnTandC);

  super.onSaveInstanceState(savedInstanceState);
}
 

Payla┼č─▒lan tercihleri ÔÇőÔÇőkullanarak yerel de─či┼čken / UI kontrol verilerini uygulama ├Ârnekleri aras─▒nda (yani kal─▒c─▒ olarak) depolay─▒n

 [Code sample ÔÇô store state in SharedPreferences]
@Override
protected void onPause()
{
  super.onPause();

  // Store values between instances here
  SharedPreferences preferences = getPreferences(MODE_PRIVATE);
  SharedPreferences.Editor editor = preferences.edit();  // Put the values from the UI
  EditText txtName = (EditText)findViewById(R.id.txtName);
  String strName = txtName.getText().toString();

  EditText txtEmail = (EditText)findViewById(R.id.txtEmail);
  String strEmail = txtEmail.getText().toString();

  CheckBox chkTandC = (CheckBox)findViewById(R.id.chkTandC);
  boolean blnTandC = chkTandC.isChecked();

  editor.putString(ÔÇťNameÔÇŁ, strName); // value to store
  editor.putString(ÔÇťEmailÔÇŁ, strEmail); // value to store
  editor.putBoolean(ÔÇťTandCÔÇŁ, blnTandC); // value to store
  // Commit to storage
  editor.commit();
}
 

Tutulan konfig├╝rasyon d─▒┼č─▒ bir ├Ârne─či kullanarak uygulama ya┼čam─▒ boyunca etkinlikler aras─▒ndaki nesne ├Ârneklerini bellekte canl─▒ tutmak

 [Code sample ÔÇô store object instance]
private cMyClassType moInstanceOfAClass; // Store the instance of an object
@Override
public Object onRetainNonConfigurationInstance()
{
  if (moInstanceOfAClass != null) // Check that the object exists
      return(moInstanceOfAClass);
  return super.onRetainNonConfigurationInstance();
}
 

193







Bu Android geli┼čtirme klasik bir 'gotcha'. Burada iki konu var:

  • En az─▒ndan eski s├╝r├╝mlerde, geli┼čtirme s─▒ras─▒nda uygulama y─▒─č─▒n─▒ y├Ânetimini b├╝y├╝k ├Âl├ž├╝de karma┼č─▒kla┼čt─▒ran ince bir Android Framework hatas─▒ var (tam olarak ne zaman / ne zaman / nas─▒l d├╝zeltildi─činden emin de─čil). Bu hatay─▒ a┼ča─č─▒da tart─▒┼čaca─č─▒m.
  • Bu sorunu y├Ânetmek i├žin 'normal' veya ama├žlanan yol, kendi ba┼č─▒na, onPause / onResume ve onSaveInstanceState / onRestoreInstanceState'in ikili─či ile karma┼č─▒kt─▒r.

T├╝m bu konular─▒ ara┼čt─▒r─▒rken, zaman zaman geli┼čtiricilerin bu iki farkl─▒ konu hakk─▒nda ayn─▒ anda konu┼čtuklar─▒ndan ┼č├╝pheleniyorum ... bu y├╝zden t├╝m bu kar─▒┼č─▒kl─▒k ve "bu benim i├žin i┼če yaramaz" raporlar─▒.

─░lk olarak, 'ama├žlanan' davran─▒┼č─▒ netle┼čtirmek i├žin: onSaveInstance ve onRestoreInstance k─▒r─▒lgand─▒r ve yaln─▒zca ge├žici durumlar i├žindir. Kullan─▒m amac─▒ (faal), telefon d├Ând├╝r├╝ld├╝─č├╝nde Aktivite yeniden yap─▒land─▒rmas─▒n─▒ kullanmakt─▒r (oryantasyon de─či┼čir). Ba┼čka bir deyi┼čle, kullan─▒m amac─▒, Faaliyetiniz hala mant─▒ksal olarak ÔÇťen ├╝stteÔÇŁ iken, ancak yine de sistem taraf─▒ndan yeniden sa─članmal─▒d─▒r. Kaydedilen Paket, i┼člem / bellek / gc d─▒┼č─▒nda kalmaz, bu nedenle etkinli─činiz arka plana giderse buna ger├žekten g├╝venemezsiniz. Evet, belki de Faaliyetinizin haf─▒zas─▒, arka plana olan yolculu─čundan kurtulacak ve GC'den ka├žacak, ancak bu g├╝venilir de─čil (ne de tahmin edilebilir).

Bu nedenle, uygulaman─▒z─▒n 'ba┼člat─▒lmas─▒' aras─▒nda s├╝rmesi gereken anlaml─▒ bir 'kullan─▒c─▒ ilerlemesi' veya durumu olan bir senaryo varsa, rehberlik onPause ve onResume kullanmakt─▒r. Kal─▒c─▒ bir ma─čaza se├žmeli ve kendiniz haz─▒rlamal─▒s─▒n─▒z.

AMA - t├╝m bunlar─▒ karma┼č─▒kla┼čt─▒ran ├žok kafa kar─▒┼čt─▒r─▒c─▒ bir b├Âcek var. Detaylar burada:

http://code.google.com/p/android/issues/detail?id=2373

http://code.google.com/p/android/issues/detail?id=5277

Temel olarak, uygulaman─▒z SingleTask bayra─č─▒yla ba┼člat─▒ld─▒ysa ve daha sonra ana ekrandan veya ba┼člat─▒c─▒ men├╝s├╝nden ba┼člatt─▒ysan─▒z, daha sonra yap─▒lan bu ba┼člatman─▒n YEN─░ bir g├Ârev yarataca─č─▒ ... uygulaman─▒z─▒n iki farkl─▒ ├Ârne─čini etkili bir ┼čekilde alacaks─▒n─▒z. Ayn─▒ y─▒─č─▒n─▒n i├žinde oturmak ... ├žok h─▒zl─▒ gariple┼čiyor. Bu, geli┼čtirme s─▒ras─▒nda uygulaman─▒z─▒ ba┼člatt─▒─č─▒n─▒zda (├Ârne─čin Eclipse veya Intellij'den) ger├žekle┼čti─či i├žin, geli┼čtiriciler buna ├žok rastlar. Ama ayn─▒ zamanda baz─▒ uygulama ma─čazas─▒ g├╝ncelleme mekanizmalar─▒ arac─▒l─▒─č─▒yla (bu y├╝zden kullan─▒c─▒lar─▒n─▒z─▒ da etkiler).

Ama├žlanan ├žer├ževe davran─▒┼č─▒ de─čil, as─▒l sorunumun bu hata oldu─čunu fark etmeden ├Ânce saatlerce bu konularla sava┼čt─▒m. Harika bir yaz─▒ vege├žici ├ž├Âz├╝m (G├ťNCELLEME: a┼ča─č─▒ya bak─▒n) bu cevapta @kaciula kullan─▒c─▒s─▒ndan g├Âr├╝n├╝yor:

Ana tu┼ča basma davran─▒┼č─▒

G├ťNCELLEME Haziran 2013 : Aylar sonra, nihayet 'do─čru' ├ž├Âz├╝m├╝ buldum. Herhangi bir durum bilgisi olan ba┼člat i┼čaretini kendiniz y├Ânetmenize gerek yok, bunu ├žer├ževeden tespit edip uygun bir ┼čekilde kefaletle tespit edebilirsiniz. Bunu LauncherActivity.onCreate'─▒n ba┼člang─▒c─▒na yak─▒n bir yerde kullan─▒yorum:

 if (!isTaskRoot()) {
    Intent intent = getIntent();
    String action = intent.getAction();
    if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && action != null && action.equals(Intent.ACTION_MAIN)) {
        finish();
        return;
    }
}
 

139







onSaveInstanceState sistem belle─če ihtiya├ž duydu─čunda ve bir uygulamay─▒ ├Âld├╝rd├╝─č├╝nde ├ža─čr─▒l─▒r. Kullan─▒c─▒ uygulamay─▒ kapatt─▒─č─▒nda ├ža─čr─▒lmaz. Ben de uygulama durumu da kaydedilebilir gerekti─čini d├╝┼č├╝n├╝yorum Yani onPause bu gibi baz─▒ Kal─▒c─▒ belle─če kaydedilmelidir Preferences veya Sqlite


79







Her iki y├Ântem de faydal─▒ ve ge├žerlidir ve her ikisi de farkl─▒ senaryolar i├žin en uygunudur:

  1. Kullan─▒c─▒ uygulamay─▒ sonland─▒r─▒r ve daha sonraki bir tarihte yeniden a├žar, ancak uygulaman─▒n verileri son oturumdan yeniden y├╝klemesi gerekir - bu, SQLite kullanmak gibi kal─▒c─▒ bir depolama yakla┼č─▒m─▒ gerektirir.
  2. Kullan─▒c─▒ uygulamay─▒ ge├žer ve sonra orijinal geri gelir ve kald─▒─č─▒ yerden devam etmemizi istiyor - (├Ârne─čin uygulama durumu verileri gibi) paket veri kaydetme ve geri y├╝kleme onSaveInstanceState() ve onRestoreInstanceState() genellikle yeterlidir.

Durum verilerini kal─▒c─▒ bir ┼čekilde kaydederseniz, bir onResume() veya onCreate() (ya da herhangi bir ya┼čam d├Âng├╝s├╝ ├ža─čr─▒s─▒nda) yeniden y├╝klenebilir . Bu istenen davran─▒┼č olabilir veya olmayabilir. Bir paket i├žinde saklarsan─▒z InstanceState , o zaman ge├žicidir ve yaln─▒zca ayn─▒ kullan─▒c─▒ oturumunda (oturum terimini gev┼ček kullan─▒yorum) ayn─▒ kullan─▒c─▒ oturumunda kullan─▒m i├žin depolamak i├žin uygundur.

Bir yakla┼č─▒m─▒n di─čerinden daha iyi olmas─▒ de─čil, her ┼čey gibi, hangi davran─▒┼č─▒ gerektirdi─činizi anlamak ve en uygun yakla┼č─▒m─▒ se├žmek ├Ânemlidir.


68







Devleti kurtarmak, ilgilendi─čim kadar─▒yla en iyi ihtimalle bir ├žamurluk. Kal─▒c─▒ verileri kaydetmeniz gerekirse, sadece bir SQLite veritaban─▒ kullan─▒n . Android SOOO'yu kolayla┼čt─▒r─▒yor.

Bunun gibi bir ┼čey:

 import java.util.Date;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class dataHelper {

    private static final String DATABASE_NAME = "autoMate.db";
    private static final int DATABASE_VERSION = 1;

    private Context context;
    private SQLiteDatabase db;
    private OpenHelper oh ;

    public dataHelper(Context context) {
        this.context = context;
        this.oh = new OpenHelper(this.context);
        this.db = oh.getWritableDatabase();
    }

    public void close() {
        db.close();
        oh.close();
        db = null;
        oh = null;
        SQLiteDatabase.releaseMemory();
    }


    public void setCode(String codeName, Object codeValue, String codeDataType) {
        Cursor codeRow = db.rawQuery("SELECT * FROM code WHERE codeName = '"+  codeName + "'", null);
        String cv = "" ;

        if (codeDataType.toLowerCase().trim().equals("long") == true){
            cv = String.valueOf(codeValue);
        }
        else if (codeDataType.toLowerCase().trim().equals("int") == true)
        {
            cv = String.valueOf(codeValue);
        }
        else if (codeDataType.toLowerCase().trim().equals("date") == true)
        {
            cv = String.valueOf(((Date)codeValue).getTime());
        }
        else if (codeDataType.toLowerCase().trim().equals("boolean") == true)
        {
            String.valueOf(codeValue);
        }
        else
        {
            cv = String.valueOf(codeValue);
        }

        if(codeRow.getCount() > 0) //exists-- update
        {
            db.execSQL("update code set codeValue = '" + cv +
                "' where codeName = '" + codeName + "'");
        }
        else // does not exist, insert
        {
            db.execSQL("INSERT INTO code (codeName, codeValue, codeDataType) VALUES(" +
                    "'" + codeName + "'," +
                    "'" + cv + "'," +
                    "'" + codeDataType + "')" );
        }
    }

    public Object getCode(String codeName, Object defaultValue){

        //Check to see if it already exists
        String codeValue = "";
        String codeDataType = "";
        boolean found = false;
        Cursor codeRow  = db.rawQuery("SELECT * FROM code WHERE codeName = '"+  codeName + "'", null);
        if (codeRow.moveToFirst())
        {
            codeValue = codeRow.getString(codeRow.getColumnIndex("codeValue"));
            codeDataType = codeRow.getString(codeRow.getColumnIndex("codeDataType"));
            found = true;
        }

        if (found == false)
        {
            return defaultValue;
        }
        else if (codeDataType.toLowerCase().trim().equals("long") == true)
        {
            if (codeValue.equals("") == true)
            {
                return (long)0;
            }
            return Long.parseLong(codeValue);
        }
        else if (codeDataType.toLowerCase().trim().equals("int") == true)
        {
            if (codeValue.equals("") == true)
            {
                return (int)0;
            }
            return Integer.parseInt(codeValue);
        }
        else if (codeDataType.toLowerCase().trim().equals("date") == true)
        {
            if (codeValue.equals("") == true)
            {
                return null;
            }
            return new Date(Long.parseLong(codeValue));
        }
        else if (codeDataType.toLowerCase().trim().equals("boolean") == true)
        {
            if (codeValue.equals("") == true)
            {
                return false;
            }
            return Boolean.parseBoolean(codeValue);
        }
        else
        {
            return (String)codeValue;
        }
    }


    private static class OpenHelper extends SQLiteOpenHelper {

        OpenHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE IF  NOT EXISTS code" +
            "(id INTEGER PRIMARY KEY, codeName TEXT, codeValue TEXT, codeDataType TEXT)");
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
    }
}
 

Ondan sonra basit bir arama

 dataHelper dh = new dataHelper(getBaseContext());
String status = (String) dh.getCode("appState", "safetyDisabled");
Date serviceStart = (Date) dh.getCode("serviceStartTime", null);
dh.close();
dh = null;
 

65







San─▒r─▒m cevab─▒ buldum. Basit kelimelerle ne yapt─▒─č─▒m─▒ s├Âyleyeyim:

─░ki faaliyetim oldu─čunu varsayal─▒m, etkinlik1 ve etkinlik2 ve etkinlik1'den etkinlik2'ye (etkinlik2'de baz─▒ i┼čler yapt─▒m) gidip tekrar etkinlik1'deki bir d├╝─čmeye t─▒klayarak etkinlik 1'e d├Ân├╝yorum. ┼×imdi bu a┼čamada aktivite2'ye geri d├Ânmek istedim ve aktivite2'den son ayr─▒ld─▒─č─▒mda aktivite2'yi ayn─▒ durumda g├Ârmek istiyorum.

Yukar─▒daki senaryoda, yapt─▒─č─▒m ┼čey, tezah├╝rde ┼č├Âyle baz─▒ de─či┼čiklikler yapmamd─▒:

 <activity android:name=".activity2"
          android:alwaysRetainTaskState="true"      
          android:launchMode="singleInstance">
</activity>
 

Ve button1'deki activity1'de ┼č├Âyle yapt─▒─č─▒m olay─▒ t─▒klay─▒n:

 Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
intent.setClassName(this,"com.mainscreen.activity2");
startActivity(intent);
 

Ve activity2'de button click olay─▒n─▒ ┼č├Âyle yapt─▒m:

 Intent intent=new Intent();
intent.setClassName(this,"com.mainscreen.activity1");
startActivity(intent);
 

┼×imdi olacak olan ┼čey, etkinlik2'de yapt─▒─č─▒m─▒z de─či┼čiklikler ne olursa olsun kaybolmayacak ve etkinlik2'yi daha ├Ânce b─▒rakt─▒─č─▒m─▒z gibi g├Ârebiliriz.

Bunun cevap oldu─čuna inan─▒yorum ve bu benim i├žin iyi ├žal─▒┼č─▒yor. Yanl─▒┼č─▒m varsa d├╝zelt.


56







onSaveInstanceState() ge├žici veriler i├žin ( onCreate() / olarak geri y├╝klendi onRestoreInstanceState() ), onPause() kal─▒c─▒ veriler i├žin (geri y├╝klendi onResume() ). Android teknik kaynaklar─▒ndan:

onSaveInstanceState () , Etkinlik durdurulursa ve devam ettirilmeden ├Ânce ├Âld├╝r├╝lebilirse Android taraf─▒ndan ├ža─čr─▒l─▒r! Bu, Aktivite yeniden ba┼člat─▒ld─▒─č─▒nda ayn─▒ duruma yeniden ba┼člatmak i├žin gereken herhangi bir durumu kaydetmesi gerekti─či anlam─▒na gelir. OnCreate () y├Ânteminin kar┼č─▒l─▒─č─▒d─▒r ve asl─▒nda onCreate () ├Â─česine iletilen kay─▒tl─▒InstanceState Bundle, onSaveInstanceState () y├Ânteminde outState olarak olu┼čturdu─čunuz ayn─▒ Paket'tir.

onPause () ve onResume () ayr─▒ca ├╝cretsiz y├Ântemlerdir. onPause (), Aktivite sona erdi─činde her zaman ├ža─čr─▒l─▒r (├Ârne─čin bir bitirmek () ├ža─čr─▒s─▒). Bunu, mevcut notu tekrar veritaban─▒na kaydetmek i├žin kullanaca─č─▒z. ─░yi uygulama, bir onPause () s─▒ras─▒nda serbest b─▒rak─▒labilecek t├╝m kaynaklar─▒ serbest b─▒rakmak ve pasif durumdayken daha az kaynak t├╝ketmektir.


42


2012-01-17





onSaveInstance Aktivite arka plana gitti─činde ger├žekten ├žal─▒nd─▒

Dok├╝manlardan al─▒nt─▒: " onSaveInstanceState(Bundle) etkinlik b├Âyle bir arka plan durumuna getirilmeden ├Ânce y├Ântem ├ža─čr─▒l─▒r"


38







Kazan plakas─▒n─▒ azaltmaya yard─▒mc─▒ olmak i├žin a┼ča─č─▒dakileri kullan─▒yorum interface ve class bir Bundle tasarruf ├Ârne─či durumunu okumak / yazmak i├žin kullan─▒yorum .


─░lk olarak, ├Ârnek de─či┼čkenlerinizi a├ž─▒klamada kullan─▒lacak bir aray├╝z olu┼čturun:

 import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({
        ElementType.FIELD
})
public @interface SaveInstance {

}
 

Daha sonra, de─čerleri pakete kaydetmek i├žin kullan─▒laca─č─▒ bir s─▒n─▒f olu┼čturun:

 import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.Log;

import java.io.Serializable;
import java.lang.reflect.Field;

/**
 * Save and load fields to/from a {@link Bundle}. All fields should be annotated with {@link
 * SaveInstance}.</p>
 */
public class Icicle {

    private static final String TAG = "Icicle";

    /**
     * Find all fields with the {@link SaveInstance} annotation and add them to the {@link Bundle}.
     *
     * @param outState
     *         The bundle from {@link Activity#onSaveInstanceState(Bundle)} or {@link
     *         Fragment#onSaveInstanceState(Bundle)}
     * @param classInstance
     *         The object to access the fields which have the {@link SaveInstance} annotation.
     * @see #load(Bundle, Object)
     */
    public static void save(Bundle outState, Object classInstance) {
        save(outState, classInstance, classInstance.getClass());
    }

    /**
     * Find all fields with the {@link SaveInstance} annotation and add them to the {@link Bundle}.
     *
     * @param outState
     *         The bundle from {@link Activity#onSaveInstanceState(Bundle)} or {@link
     *         Fragment#onSaveInstanceState(Bundle)}
     * @param classInstance
     *         The object to access the fields which have the {@link SaveInstance} annotation.
     * @param baseClass
     *         Base class, used to get all superclasses of the instance.
     * @see #load(Bundle, Object, Class)
     */
    public static void save(Bundle outState, Object classInstance, Class<?> baseClass) {
        if (outState == null) {
            return;
        }
        Class<?> clazz = classInstance.getClass();
        while (baseClass.isAssignableFrom(clazz)) {
            String className = clazz.getName();
            for (Field field : clazz.getDeclaredFields()) {
                if (field.isAnnotationPresent(SaveInstance.class)) {
                    field.setAccessible(true);
                    String key = className + "#" + field.getName();
                    try {
                        Object value = field.get(classInstance);
                        if (value instanceof Parcelable) {
                            outState.putParcelable(key, (Parcelable) value);
                        } else if (value instanceof Serializable) {
                            outState.putSerializable(key, (Serializable) value);
                        }
                    } catch (Throwable t) {
                        Log.d(TAG, "The field '" + key + "' was not added to the bundle");
                    }
                }
            }
            clazz = clazz.getSuperclass();
        }
    }

    /**
     * Load all saved fields that have the {@link SaveInstance} annotation.
     *
     * @param savedInstanceState
     *         The saved-instance {@link Bundle} from an {@link Activity} or {@link Fragment}.
     * @param classInstance
     *         The object to access the fields which have the {@link SaveInstance} annotation.
     * @see #save(Bundle, Object)
     */
    public static void load(Bundle savedInstanceState, Object classInstance) {
        load(savedInstanceState, classInstance, classInstance.getClass());
    }

    /**
     * Load all saved fields that have the {@link SaveInstance} annotation.
     *
     * @param savedInstanceState
     *         The saved-instance {@link Bundle} from an {@link Activity} or {@link Fragment}.
     * @param classInstance
     *         The object to access the fields which have the {@link SaveInstance} annotation.
     * @param baseClass
     *         Base class, used to get all superclasses of the instance.
     * @see #save(Bundle, Object, Class)
     */
    public static void load(Bundle savedInstanceState, Object classInstance, Class<?> baseClass) {
        if (savedInstanceState == null) {
            return;
        }
        Class<?> clazz = classInstance.getClass();
        while (baseClass.isAssignableFrom(clazz)) {
            String className = clazz.getName();
            for (Field field : clazz.getDeclaredFields()) {
                if (field.isAnnotationPresent(SaveInstance.class)) {
                    String key = className + "#" + field.getName();
                    field.setAccessible(true);
                    try {
                        Object fieldVal = savedInstanceState.get(key);
                        if (fieldVal != null) {
                            field.set(classInstance, fieldVal);
                        }
                    } catch (Throwable t) {
                        Log.d(TAG, "The field '" + key + "' was not retrieved from the bundle");
                    }
                }
            }
            clazz = clazz.getSuperclass();
        }
    }

}
 

├ľrnek kullan─▒m:

 public class MainActivity extends Activity {

    @SaveInstance
    private String foo;

    @SaveInstance
    private int bar;

    @SaveInstance
    private Intent baz;

    @SaveInstance
    private boolean qux;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Icicle.load(savedInstanceState, this);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Icicle.save(outState, this);
    }

}
 

Not: Bu kod, MIT lisans─▒ alt─▒nda lisanslanan AndroidAutowire adl─▒ bir k├╝t├╝phane projesinden uyarlanm─▒┼čt─▒r .https://raw.githubusercontent.com/CardinalNow/AndroidAutowire/master/LICENSE


35







Bu arada genel olarak art─▒k kullanm─▒yorum

 Bundle savedInstanceState & Co
 

Ya┼čam d├Âng├╝s├╝ ├žo─ču faaliyet i├žin ├žok karma┼č─▒k ve gerekli de─čildir.

Ve Google kendini g├Âsterir, hatta g├╝venilir de─čil.

Benim y├Ântemim, de─či┼čiklikleri an─▒nda tercihlerde kaydetmektir:

  SharedPreferences p;
 p.edit().put(..).commit()
 

Bir ┼čekilde SharedPreferences Bundles'a benzer ┼čekilde ├žal─▒┼č─▒r. Ve tabii ki ve ilk ba┼čta bu t├╝r de─čerler tercihlerden okunmal─▒d─▒r.

Karma┼č─▒k veri durumunda, tercihleri ÔÇőÔÇőkullanmak yerine SQLite kullanabilirsiniz.

Bu konsepti uygularken, etkinlik, arka y─▒─č─▒ndan dolay─▒ yeniden a├ž─▒lmalarla veya yeniden a├ž─▒lma ile ilk a├ž─▒lmadan ba─č─▒ms─▒z olarak, son kaydedilen durumu kullanmaya devam eder.


33







As─▒l soruya do─črudan cevap vermek i├žin. savedInstancestate de─čeri null, ├ž├╝nk├╝ Faaliyetiniz asla yeniden olu┼čturulmuyor.

Etkinli─činiz yaln─▒zca a┼ča─č─▒daki durumlarda bir durum paketi ile yeniden olu┼čturulacakt─▒r:

  • Yeni bir aktivite ├Ârne─či olu┼čturulmas─▒n─▒ gerektirebilecek y├Ânlendirme veya telefon dilini de─či┼čtirme gibi yap─▒land─▒rma de─či┼čiklikleri.
  • ─░┼čletim sistemi etkinli─či tahrip ettikten sonra arka plandan uygulamaya geri d├Ânersiniz.

Android, bellek bask─▒s─▒ alt─▒ndayken veya uzun s├╝re arka planda kald─▒ktan sonra arka plan etkinliklerini yok eder.

Merhaba d├╝nya ├Ârne─činizi test ederken Aktivite'ye d├Ânmenin ve geri d├Ânmenin birka├ž yolu var.

  • Geri d├╝─čmesine bast─▒─č─▒n─▒zda Etkinlik biter. Uygulaman─▒n yeniden ba┼člat─▒lmas─▒ yepyeni bir ├Ârnektir. Siz hi├ž arka plandan devam etmiyorsunuz.
  • Giri┼č d├╝─čmesine bast─▒─č─▒n─▒zda veya g├Ârev de─či┼čtiriciyi kulland─▒─č─▒n─▒zda, Etkinlik arka plana gidecektir. Uygulamaya geri d├Ânerken onCreate, yaln─▒zca Aktivitenin imha edilmesi gerekti─činde ├ža─čr─▒lacakt─▒r.

├ço─ču durumda sadece eve bas─▒yorsan─▒z ve ard─▒ndan uygulamay─▒ tekrar ba┼člat─▒yorsan─▒z etkinli─čin yeniden olu┼čturulmas─▒ gerekmez. Bellekte zaten var, onCreate () ├ža─čr─▒lmayacak.

Ayarlar -> Geli┼čtirici Se├ženekleri alt─▒nda "Aktiviteleri saklamay─▒n" ad─▒ alt─▒nda bir se├ženek var. Etkinle┼čtirildi─činde, Android her zaman etkinlikleri yok eder ve arka plan olu┼čturduklar─▒nda yeniden olu┼čturur. Bu, en k├Ât├╝ durum senaryosunu sim├╝le etti─či i├žin geli┼čtirirken etkin b─▒rakmak i├žin m├╝kemmel bir se├ženektir. (Faaliyetlerinizi her zaman geri d├Ân├╝┼čt├╝ren d├╝┼č├╝k bellek ayg─▒t─▒).

Di─čer cevaplar, size durumu saklamak i├žin do─čru y├Ântemleri ├Â─čretmeleri bak─▒m─▒ndan de─čerlidir ancak kodunuzun NEDEN bekledi─činiz ┼čekilde ├žal─▒┼čmad─▒─č─▒n─▒ NEDEN cevaplad─▒klar─▒n─▒ hissetmedim.


30







Bu onSaveInstanceState(bundle) ve onRestoreInstanceState(bundle) y├Ântemler, sadece ekran─▒ d├Ând├╝r├╝rken (oryantasyon de─či┼čikli─či) verilerin kal─▒c─▒l─▒─č─▒ i├žin kullan─▒┼čl─▒d─▒r.
Onlar beri (uygulamalar aras─▒nda ge├ži┼č yaparken bile iyi de─čildir onSaveInstanceState() y├Ântemi denir ama onCreate(bundle) ve onRestoreInstanceState(bundle) yine ├ža─čr─▒lmaz.
Daha kal─▒c─▒l─▒k kullan─▒m─▒ payla┼č─▒lan tercihleri i├žin. Bu makaleyi okuyun


27







Benim sorunum yaln─▒zca uygulama ├Âmr├╝ boyunca sebat etmemdi (ayn─▒ uygulama i├žerisinde di─čer alt faaliyetlerin ba┼člat─▒lmas─▒ ve cihaz─▒n d├Ând├╝r├╝lmesi gibi tek bir uygulama). Yukar─▒daki cevaplar─▒n ├že┼čitli kombinasyonlar─▒n─▒ denedim ama her durumda istedi─čimi alamad─▒m. Sonunda, benim i├žin ├žal─▒┼čan ┼čey onCreate s─▒ras─▒nda savedInstanceState ├Â─česine bir referans elde etmekti:

 mySavedInstanceState=savedInstanceState;
 

ve ihtiyac─▒m oldu─čunda de─či┼čkenimin i├žeri─čini, a┼ča─č─▒daki sat─▒rlar boyunca almak i├žin kullan─▒n:

 if (mySavedInstanceState !=null) {
   boolean myVariable = mySavedInstanceState.getBoolean("MyVariable");
}
 

Kulland─▒─č─▒m onSaveInstanceState ve onRestoreInstanceState yukar─▒da ├Ânerilen ancak ben (├Ârn kullanarak ben de veya alternatif olarak de─či┼čtirdi─činde de─či┼čkeni kaydetmek i├žin benim y├Ântemi kullanmak san─▒r─▒m putBoolean )


19







Kabul edilen cevap do─čru olmas─▒na ra─čmen, Icepick adl─▒ bir k├╝t├╝phane kullanarak Android'deki Etkinlik durumunu kaydetmenin daha h─▒zl─▒ ve kolay bir y├Ântemi vard─▒r . Icepick, sizin i├žin durumu kaydetme ve geri y├╝kleme i┼čleminde kullan─▒lan t├╝m kazan plakas─▒ kodunu dikkate alan bir a├ž─▒klama i┼člemcisidir.

Icepick ile b├Âyle bir ┼čey yapmak:

 class MainActivity extends Activity {
  @State String username; // These will be automatically saved and restored
  @State String password;
  @State int age;

  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Icepick.restoreInstanceState(this, savedInstanceState);
  }

  @Override public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Icepick.saveInstanceState(this, outState);
  }
}
 

Bunu yapmakla ayn─▒ ┼čey mi var:

 class MainActivity extends Activity {
  String username;
  String password;
  int age;

  @Override
  public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putString("MyString", username);
    savedInstanceState.putString("MyPassword", password);
    savedInstanceState.putInt("MyAge", age); 
    /* remember you would need to actually initialize these variables before putting it in the
    Bundle */
  }

  @Override
  public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    username = savedInstanceState.getString("MyString");
    password = savedInstanceState.getString("MyPassword");
    age = savedInstanceState.getInt("MyAge");
  }
}
 

Icepick, durumunu koruyan herhangi bir nesneyle ├žal─▒┼čacakt─▒r Bundle .


18







Bir etkinlik olu┼čturuldu─čunda, onCreate () y├Ântemi ├ža─čr─▒l─▒r.

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

savedInstanceState, ilk kez bo┼č olan bir Bundle s─▒n─▒f─▒n─▒n nesnesidir, ancak yeniden olu┼čturuldu─čunda de─čerler i├žerir. Aktivite durumunu kaydetmek i├žin onSaveInstanceState () ├Â─česini ge├žersiz k─▒lman─▒z gerekir.

    @Override
    protected void onSaveInstanceState(Bundle outState) {
      outState.putString("key","Welcome Back")
        super.onSaveInstanceState(outState);       //save state
    }
 

De─čerlerinizi "outState" dizisine yerle┼čtirin outState.putString ("key", "Welcome Back") gibi Bundle nesnesine koyun ve s├╝per ├ža─čr─▒ yaparak kaydedin. Etkinlik yok edildi─činde durumu Bundle nesnesine kaydedilir ve onCreate () veya onRestoreInstanceState () ├Â─česinde yeniden olu┼čturulduktan sonra geri y├╝klenebilir. OnCreate () ve onRestoreInstanceState () ├Â─čelerinde al─▒nan paketler ayn─▒.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

          //restore activity's state
         if(savedInstanceState!=null){
          String reStoredString=savedInstanceState.getString("key");
            }
    }
 

veya

   //restores activity's saved state
 @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
      String restoredMessage=savedInstanceState.getString("key");
    }
 

15







Bu de─či┼čikli─čin uygulanmas─▒n─▒n temelde iki yolu vard─▒r.

  1. onSaveInstanceState() ve kullanarak onRestoreInstanceState() .
  2. Tezah├╝r i├žinde android:configChanges="orientation|screenSize" .

Ger├žekten ikinci bir y├Ântem kullanman─▒z─▒ ├Ânermiyorum. Tecr├╝belerimden bir tanesinde cihaz ekran─▒n─▒n yar─▒s─▒ siyahken, portreden manzaraya d├Ânerken tam tersi oluyordu.

Yukar─▒da belirtilen ilk y├Ântemi kullanarak, oryantasyon de─či┼čti─činde veya herhangi bir yap─▒land─▒rma de─či┼čikli─či oldu─čunda verileri devam ettirebiliriz. SavedInstance state nesnesinin i├žine herhangi bir veri t├╝r├╝n├╝ depolayabilece─činiz bir yol biliyorum.

├ľrnek: Json nesnesine devam etmek istiyorsan─▒z bir dava d├╝┼č├╝n├╝n. al─▒c─▒lar─▒ ve ayarlay─▒c─▒lar─▒ i├žeren bir model s─▒n─▒f─▒ olu┼čturun.

 class MyModel extends Serializable{
JSONObject obj;

setJsonObject(JsonObject obj)
{
this.obj=obj;
}

JSONObject getJsonObject()
return this.obj;
} 
}
 

┼×imdi onCreate ve onSaveInstanceState y├Ântemindeki etkinli─činizde a┼ča─č─▒dakileri yap─▒n. Bu gibi bir ┼čey g├Âr├╝necek:

 @override
onCreate(Bundle savedInstaceState){
MyModel data= (MyModel)savedInstaceState.getSerializable("yourkey")
JSONObject obj=data.getJsonObject();
//Here you have retained JSONObject and can use.
}


@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//Obj is some json object 
MyModel dataToSave= new MyModel();
dataToSave.setJsonObject(obj);
oustate.putSerializable("yourkey",dataToSave); 

}
 

14







─░┼čte bir yorumdur Steve Moseley '─▒n cevab─▒ (taraf─▒ndan ToolmakerSteve ) bu bak─▒┼č i├žine koyar ┼čeyler (OnPause vs b├╝t├╝n onSaveInstanceState i├žinde, bat─▒ maliyet destan vs do─ču maliyet)

@VVK - K─▒smen kat─▒lm─▒yorum. Bir uygulamadan ├ž─▒kman─▒n baz─▒ yollar─▒ onSaveInstanceState (oSIS) ├Âzelli─čini tetiklemez. Bu, oSIS'in kullan─▒┼čl─▒l─▒─č─▒n─▒ s─▒n─▒rlar. Asgari i┼čletim sistemi kaynaklar─▒ i├žin de─čeri desteklemekte ancak bir uygulama kullan─▒c─▒y─▒ i├žinde bulundu─ču duruma geri d├Ând├╝rmek istiyorsa, uygulamadan nas─▒l ├ž─▒k─▒ld─▒─č─▒na bak─▒lmaks─▒z─▒n bunun yerine kal─▒c─▒ bir depolama yakla┼č─▒m─▒ kullanmak gerekir. Paketi kontrol etmek i├žin onCreate kullan─▒yorum ve eksikse kal─▒c─▒ depolamay─▒ kontrol ediyorum . Bu karar vermeyi merkezile┼čtirir. Bir ├ž├Âk├╝┼čten kurtulabilirim veya geri d├╝─čmesi ├ž─▒k─▒┼č─▒ndan veya ├Âzel men├╝ ├Â─česinden ├ž─▒kabilirim veya ekran kullan─▒c─▒s─▒na geri d├Ând├╝─č├╝m g├╝nler sonrayd─▒. - ToolmakerSteve 19 '15 Eyl├╝l, 10:38


10







Kotlin kodu:

kay─▒t etmek:

 override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState.apply {
        putInt("intKey", 1)
        putString("stringKey", "String Value")
        putParcelable("parcelableKey", parcelableObject)
    })
}
 

ve sonra onCreate() veya onRestoreInstanceState()

     val restoredInt = savedInstanceState?.getInt("intKey") ?: 1 //default int
    val restoredString = savedInstanceState?.getString("stringKey") ?: "default string"
    val restoredParcelable = savedInstanceState?.getParcelable<ParcelableClass>("parcelableKey") ?: ParcelableClass() //default parcelable
 

Se├ženeklere sahip olmak istemiyorsan─▒z, varsay─▒lan de─čerler ekleyin


9







Etkinlik durumu verilerini depolamak i├žin onCreate() , ├Ânce ge├žersiz k─▒lma SaveInstanceState(Bundle savedInstanceState) y├Ântemini kullanarak verileri savedInstanceState konumuna kaydetmeniz gerekir .

Aktivite yok etme SaveInstanceState(Bundle savedInstanceState) y├Ântemi ├ža─čr─▒ld─▒─č─▒nda ve orada saklamak istedi─činiz verileri kaydedin. onCreate() Aktivite yeniden ba┼člad─▒─č─▒nda da ayn─▒ ┼čey elde edersiniz . (SavedInstanceState, aktivite yok edilmeden ├Ânce baz─▒ verileri kaydetti─činizden bo┼č olamaz)


8







Bu sorunu ├ž├Âzmek i├žin basit h─▒zl─▒ IcePick kullan─▒yorhttps://github.com/frankiesardo/icepick

─░lk ├Ânce k├╝t├╝phaneyi app/build.gradle

 repositories {
  maven {url "https://clojars.org/repo/"}
}
dependencies {
  compile 'frankiesardo:icepick:3.2.0'
  provided 'frankiesardo:icepick-processor:3.2.0'
}
 

┼×imdi, a┼ča─č─▒daki ├Ârnekte EtkinlikÔÇÖte durumun nas─▒l kaydedilece─čini kontrol edelim

 public class ExampleActivity extends Activity {
  @State String username; // This will be automatically saved and restored

  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Icepick.restoreInstanceState(this, savedInstanceState);
  }

  @Override public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Icepick.saveInstanceState(this, outState);
  }
}
 

Etkinlikler, Fragmanlar veya durumunu bir Paket ├╝zerinde seri hale getirmesi gereken herhangi bir nesne i├žin ├žal─▒┼č─▒r (├Ârne─čin, har├ž ViewPresenters)

Icepick ayr─▒ca, ├Âzel G├Âr├╝n├╝mler i├žin ├Ârnek durum kodunu da olu┼čturabilir:

 class CustomView extends View {
  @State int selectedPosition; // This will be automatically saved and restored

  @Override public Parcelable onSaveInstanceState() {
    return Icepick.saveInstanceState(this, super.onSaveInstanceState());
  }

  @Override public void onRestoreInstanceState(Parcelable state) {
    super.onRestoreInstanceState(Icepick.restoreInstanceState(this, state));
  }

  // You can put the calls to Icepick into a BaseCustomView and inherit from it
  // All Views extending this CustomView automatically have state saved/restored
}
 

6







├ç├Âz├╝m├╝m├╝n ka┼č─▒n─▒p ├žatt─▒─č─▒ndan emin de─čilim, ancak ViewModel durumunu s├╝rd├╝rmek i├žin ba─čl─▒ bir servis kullan─▒yorum. Hizmette bellekte saklamak ya da devam ettirmek ve bir SQLite veritaban─▒ndan almak veya almak, gereksinimlerinize ba─čl─▒d─▒r. Bu, herhangi bir lezzetin hizmetinin yapt─▒─č─▒ ┼čeydir, uygulama durumunun korunmas─▒ ve soyut ortak i┼č mant─▒─č─▒ gibi hizmetler sa─člarlar.

Mobil cihazlarda var olan bellek ve i┼člem k─▒s─▒tlamalar─▒ nedeniyle, Android g├Âr├╝n├╝mlerini bir web sayfas─▒na benzer ┼čekilde ele al─▒yorum. Sayfa, durumu korumaz; yaln─▒zca amac─▒ uygulama durumunu sunmak ve kullan─▒c─▒ girdisini kabul etmek olan bir sunum katman─▒ bile┼čenidir. Web uygulamas─▒ mimarisindeki son trendler, sayfan─▒n G├Âr├╝n├╝m oldu─ču, etki alan─▒ verilerinin model oldu─ču ve denetleyicinin bir web hizmetinin arkas─▒na oturdu─ču as─▒rl─▒k Model, G├Âr├╝n├╝m, Denetleyici (MVC) modelini kullan─▒r. Ayn─▒ model, G├Âr├╝n├╝m ile birlikte Android'de de kullan─▒labilir ... G├Âr├╝n├╝m, model, etki alan─▒ verilerinizdir ve Denetleyici, bir Android ba─čl─▒ hizmeti olarak uygulan─▒r. Bir g├Âr├╝n├╝m├╝n denetleyici ile etkile┼čime girmesini istedi─činizde, ├žal─▒┼čt─▒rma / s├╝rd├╝rme s─▒ras─▒nda buna ba─član─▒n ve durdurma / duraklatma s─▒ras─▒nda ay─▒r─▒n.

Bu yakla┼č─▒m, hepinize uygulama i┼č mant─▒─č─▒n─▒n birden fazla g├Âr├╝n├╝mde yinelenen mant─▒─č─▒ azaltan ve g├Âr├╝n├╝m├╝n ba┼čka bir ├Ânemli tasar─▒m prensibi olan Tek Sorumlulu─ču uygulayabilmesi i├žin hizmetinize ta┼č─▒nabilmesi i├žin Endi┼čeli Tasar─▒m ilkesini uygulaman─▒n ek avantaj─▒n─▒ sunar.


6







Kotlin

Kal─▒c─▒ olmak istedi─činiz de─či┼čkenlerinizi saklamak ve almak i├žin ge├žersiz k─▒lman─▒z onSaveInstanceState ve onRestoreInstanceState

Ya┼čam d├Âng├╝s├╝ grafi─či




Ma─čaza de─či┼čkenleri

 public override fun onSaveInstanceState(savedInstanceState: Bundle) {
    super.onSaveInstanceState(savedInstanceState)

    // prepare variables here
    savedInstanceState.putInt("kInt", 10)
    savedInstanceState.putBoolean("kBool", true)
    savedInstanceState.putDouble("kDouble", 4.5)
    savedInstanceState.putString("kString", "Hello Kotlin")
}
 

De─či┼čkenleri al

 public override fun onRestoreInstanceState(savedInstanceState: Bundle) {
    super.onRestoreInstanceState(savedInstanceState)

    val myInt = savedInstanceState.getInt("kInt")
    val myBoolean = savedInstanceState.getBoolean("kBool")
    val myDouble = savedInstanceState.getDouble("kDouble")
    val myString = savedInstanceState.getString("kString")
    // use variables here
}
 

4







┼×imdi Android durum kaydetme i├žin ViewModels sa─čl─▒yor, saveInstanceState yerine bunu kullanmaya ├žal─▒┼čmal─▒s─▒n─▒z.


2







Ne kurtarmal─▒, ne yap─▒lmayacak?

EditText Oryantasyon de─či┼čti─činde neden metindeki metnin neden otomatik olarak kaydedildi─čini merak ettiniz mi? Peki, bu cevap sizin i├žin.

Bir Faaliyetin bir ├Ârne─či yok edildi─činde ve Sistem yeni bir ├Ârnek olu┼čturdu─čunda (├Ârne─čin, yap─▒land─▒rma de─či┼čikli─či). Eski Etkinlik Durumu ( ├Ârnek durum ) ile kaydedilmi┼č veri k├╝mesini kullanarak yeniden olu┼čturmaya ├žal─▒┼č─▒r .

├ľrnek durumu, bir nesnede saklanan anahtar / de─čer ├žiftlerinin toplam─▒d─▒r Bundle .

Varsay─▒lan olarak Sistem, View nesnelerini Bundle'a kaydeder.

  • ─░├žindeki metin EditText
  • Kayd─▒rma konumu a ListView , vb.

├ľrnek durumun bir par├žas─▒ olarak kaydedilecek ba┼čka bir de─či┼čkene ihtiyac─▒n─▒z varsa, OVERRIDE onSavedInstanceState(Bundle savedinstaneState) y├Ântemini kullanmal─▒s─▒n─▒z.

├ľrne─čin, int currentScore bir GameActivity'de

Veri kaydederken onSavedInstanceState (Bundle savedinstaneState) hakk─▒nda daha fazla ayr─▒nt─▒

 @Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}
 

Bu nedenle yanl─▒┼čl─▒kla super.onSaveInstanceState(savedInstanceState); varsay─▒lan davran─▒┼č─▒ ├ža─č─▒rmay─▒ unutursan─▒z ├žal─▒┼čmaz, yani EditText i├žindeki Metin kaydetmez.

Faaliyet durumunu geri y├╝klemek i├žin hangisini se├žmeli?

  onCreate(Bundle savedInstanceState)
 

VEYA

 onRestoreInstanceState(Bundle savedInstanceState)
 

Her iki y├Ântem de ayn─▒ Bundle nesnesini al─▒r, bu nedenle geri y├╝kleme mant─▒─č─▒n─▒z─▒ nereye yazd─▒─č─▒n─▒z─▒n bir ├Ânemi yoktur. Tek fark, onCreate(Bundle savedInstanceState) y├Ântemde, ikinci durumda gerekmedi─činde bo┼č bir denetim yapman─▒z gerekece─čidir. Di─čer cevaplar zaten kod par├žac─▒klar─▒n─▒ i├žeriyor. Onlara ba┼čvurabilirsiniz.

OnRestoreInstanceState (Bundle savedinstaneState) hakk─▒nda daha fazla ayr─▒nt─▒

 @Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);

    // Restore state members from the saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
}
 

Her zaman aray─▒n, super.onRestoreInstanceState(savedInstanceState); b├Âylece Sistem varsay─▒lan olarak G├Âr├╝n├╝m hiyerar┼čisini geri y├╝kler

Bonus

onSaveInstanceState(Bundle savedInstanceState) Kullan─▒c─▒ Faaliyet geri gelmek niyetinde yaln─▒zca sistem taraf─▒ndan ├ža─čr─▒l─▒r. ├ľrne─čin, App X kullan─▒yorsunuz ve aniden bir ├ža─čr─▒ al─▒yorsunuz. Arayan uygulamaya ge├žip X uygulamas─▒na geri d├Ânersiniz. Bu durumda onSaveInstanceState(Bundle savedInstanceState) y├Ântem ├ža─čr─▒l─▒r.

Ancak bir kullan─▒c─▒ geri d├╝─čmesine basarsa bunu g├Âz ├Ân├╝nde bulundurun. Kullan─▒c─▒n─▒n Faaliyete geri d├Ânme niyetinde olmad─▒─č─▒ varsay─▒ld─▒─č─▒ndan, bu durumda onSaveInstanceState(Bundle savedInstanceState) sistem taraf─▒ndan ba┼člat─▒lmayacakt─▒r. Verileri kaydederken t├╝m senaryolar─▒ g├Âz ├Ân├╝nde bulundurmal─▒s─▒n─▒z.

─░lgili ba─člant─▒lar:

Varsay─▒lan davran─▒┼č demosu
Android Resmi Belgeleri .


1







Kullanabilece─činiz Live Data ve View Model L i├žin ifecycle Handel Dan JetPack . bu Referansa bak─▒n─▒z:

https://developer.android.com/topic/libraries/architecture/livedata


0







Bunun yerine, etkinlik ya┼čam d├Âng├╝s├╝ne kadar verileri koruyacak ViewModel kullanmal─▒s─▒n─▒z.


0







Android herhangi bir y├Ântem uygulamadan devletler kurtarmak yapman─▒n bir yolu var. Faaliyet sat─▒r─▒ndaki Manifest'inize bu sat─▒r─▒ ekleyin:

 android:configChanges="orientation|screenSize"
 

Bu gibi g├Âr├╝nmeli:

 <activity
    android:name=".activities.MyActivity"
    android:configChanges="orientation|screenSize">
</activity>
 

Burada bu ├Âzellik hakk─▒nda daha fazla bilgi bulabilirsiniz.

Android'in bu i┼člemi sizin i├žin elle i┼člemekten daha iyi yapmas─▒ ├Ânerilir.


0



─░lgili yay─▒nlar


Android Spinner'─▒ ilk metni ÔÇťBirini Se├žÔÇŁ ile nas─▒l yapabilirim?

Bir Android cihaz─▒n─▒ nas─▒l titretirim?

Bir Android uygulamas─▒n─▒n ad─▒ nas─▒l de─či┼čtirilir?

Android d├╝─čmesini nas─▒l devre d─▒┼č─▒ b─▒rakabilirim?

Bir HTML5 Canvas'─▒ sunucuda bir resim olarak nas─▒l kaydederim?

Bir android bildirim sesi nas─▒l oynan─▒r

Android Studio ve gradle ile bir android k├╝t├╝phanesi nas─▒l olu┼čturulur?

Bir g├Âr├╝nt├╝y├╝ localStorage uygulamas─▒na nas─▒l kaydeder ve bir sonraki sayfada nas─▒l g├Âr├╝nt├╝lersiniz?

URL adresini zaten bildi─čim Python ile yerel olarak bir resmi nas─▒l kaydedebilirim?

Android d├╝─čmesinden ├ž─▒karken arka d├╝─čmesinden eri┼čilememek i├žin nas─▒l kullan─▒l─▒r?

Etiketle ilgili di─čer sorular [android]


'Se├ž' kutusu i├žin yer tutucuyu nas─▒l yapar─▒m?

Python kodu neden bir fonksiyonda daha h─▒zl─▒ ├žal─▒┼č─▒yor?

Dosyalar art─▒k yoksa, bir Windows hizmetini nas─▒l kald─▒r─▒r─▒m?

React.js'de dizi ├žocuklar─▒ i├žin benzersiz anahtarlar─▒n anla┼č─▒lmas─▒

CSS g├╝c├╝ g├Âr├╝nt├╝s├╝ yeniden boyutland─▒r─▒r ve en boy oran─▒n─▒ korur

'ConfigurationManager' ad─▒ ge├žerli ba─člamda mevcut de─čil

Python [├žo─čalt] i├žinde birden fazla s─▒n─▒rlay─▒c─▒ i├žeren dizeyi b├Âlme

Bir ak─▒┼č C# [] bir bayt [] d├Ân├╝┼čt├╝rmek nas─▒l? [├žift]

Git: Son taahh├╝d├╝m├╝ g├Âr

Bir sorgu dizesi i├žindeki bir diziyi nas─▒l iletirim?