Soru Örnek Olayı Kaydet'i kullanarak Android Etkinlik durumunu kaydetme


Android SDK platformunda çalışıyorum ve bir uygulamanın durumunu nasıl kaydedeceğimiz biraz belli değil. Bu yüzden, 'Merhaba, Android' örneğinin bu küçük yeniden kullanımı verildi:

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 vaka için yeterli olacağını düşündüm, ancak uygulamadan nasıl uzaklaştığım önemli değil, her zaman ilk mesajla cevap veriyor.

Eminim çözümün geçersiz kılınması kadar basit onPause ya da bunun gibi bir şey, ama 30 dakika ya da öylesine belgelerinizden uzaklaştım ve açık bir şey bulamadım.


2238
2017-09-30 04:41


Menşei


SavedInstanceState == null olduğunda ne zaman boş değil? - Trojan.ZBOT
Etkinliğinizi açıkça ortadan kaldırıyorsunuz - dediğiniz gibi, ondan uzaklaşmak gibi geri adım atmak gibi. Aslında, bu "savedInstanceState" in kullanıldığı senaryo, Android'in etkinliklerinizi rekreasyon için yok ettiği zamandır. Durum için: Etkinlik çalışırken telefonunuzun dilini değiştirirseniz (ve projenizden farklı kaynakların yüklenmesi gerekir). Diğer bir çok yaygın senaryo ise, telefonunuzu yan tarafa döndürdüğünüzde, etkinliğin yeniden oluşturulması ve manzaranın görüntülenmesidir. - villoren
İkinci mesajı almak için, dev seçeneklerde "Etkinlikleri saklama" yı etkinleştirin. Bir ev düğmesine basın ve tekrarlardan alın. - Yaroslav Mytkalyk
bu oldukça yararlı developer.android.com/training/basics/activity-lifecycle/... - Syed Raza Mehdi
ile yapabilirsiniz: onSaveInstanceState (Bundle savedInstanceState) - HPbyP


Cevaplar:


Geçersiz kılmanız gerekiyor onSaveInstanceState(Bundle savedInstanceState) ve değiştirmek istediğiniz uygulama durumu değerlerini Bundle bu gibi parametre:

@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, esas olarak bir NVP ("İsim-Değeri Çifti") haritasının saklanmasının bir yoludur ve onCreate() ve ayrıca onRestoreInstanceState() bu gibi değerleri çıkaracağınız yer:

@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");
}

Uygulamanız için örnek değerleri (seçimler, kaydedilmemiş metinler vb.) Saklamak için genellikle bu tekniği kullanırsınız.


2275
2017-09-30 06:12



Bunun telefonda çalıştığı, ancak emülatörde çalışmadığı herhangi bir ihtimal var mı? Boş olmayan bir kayıtlıInstanceState elde edemiyorum. - Adam Jack
Bu dizi listesindeki tüm noktaları nasıl kaydedeceğimi ve sonra bunları nasıl geri yükleyeceğimi bir Nokta ArrayList'im var? - AZ_
YARARLI: değerlerini Paket'e eklemeden önce super.onSaveInstanceState (savedInstanceState) öğesini çağırmanız gerekir, aksi takdirde bu çağrıda silinir (Droid X Android 2.2). - jkschneider
Dikkat: Resmi belgelendirme, onapa-metodu içinde önemli bilgileri saklamanız gerektiğini gösterir; çünkü onsaveinstance-method, android yaşam döngüsünün bir parçası değildir. developer.android.com/reference/android/app/Activity.html - schlingel
Bu gerçek etkili onSaveInstanceState Sadece ekran yönelim değişimleri durumu dışında neredeyse işe yaramaz. Hemen hemen tüm diğer durumlarda, hiçbir zaman güvenemezsiniz ve UI durumunuzu başka bir yere el ile kaydetmeniz gerekir. Ya da GERİ düğmesinin davranışını geçersiz kılarak uygulamanızın öldürülmesini önleme. Bunu neden böyle uyguladıklarını anlamıyorum. Tamamen kasıtsız. Ve sistemi, bu çok özel yöntem dışında şeyleri kaydetmenize izin verdiğiniz Bundle'a sahip olamazsınız. - chakrit


savedInstanceState yalnızca bir Hareketin o anki örneğiyle ilişkili durumu kaydetmek için, örneğin geçerli gezinme veya seçim bilgisi, böylece Android bir etkinliği yok ederse ve yeniden oluşturursa, daha önce olduğu gibi geri gelebilir. İçin belgelere bakın onCreate ve onSaveInstanceState

Daha uzun ömürlü durum için, bir SQLite veritabanı, dosya veya tercihler kullanmayı düşünün. Görmek Kalıcı Durumu Kaydetme.


375
2017-09-30 05:03



SavedInstanceState == null olduğunda ne zaman boş değil? - Trojan.ZBOT
Sistem, Etkinliğinizin yeni bir örneğini oluşturduğunda ve geri yüklendiğinde null olmadığında null olarak sıfırdır. - Gabriel Câmara
... bu soruyu gündeme getiriyor ne zaman Sistemin yeni bir Etkinlik örneği oluşturması gerekir. Bir uygulamadan çıkmanın bazı yolları bir paket oluşturmaz, bu nedenle yeni bir örnek oluşturulmalıdır. Bu temel problemdir; demek değil ki güvenmek Bir demet varlığında ve alternatif bir kalıcı depolama aracı yapmalıdır. OnSave / onRestoreInstanceState'in yararı, sistemin yapabileceği bir mekanizma olmasıdır. anidenÇok fazla sistem kaynağı tüketmeden. Bu yüzden, uygulamayı desteklemenin yanı sıra, uygulamadan daha zarif bir çıkış için kalıcı depolama da var. - ToolmakerSteve


Olduğunu unutmayın DEĞİL kullanıma uygun onSaveInstanceState ve onRestoreInstanceState  kalıcı veriler için, Faaliyet durumundaki belgelere göre http://developer.android.com/reference/android/app/Activity.html.

Belge durumu ('Etkinlik Yaşam Döngüsü' bölümünde):

Kaydetmenin önemli olduğunu unutmayın.   kalıcı veriler onPause() yerine   arasında onSaveInstanceState(Bundle)   çünkü daha sonra bunun bir parçası değil   yaşam döngüsü geri aramaları, bu yüzden olmayacak   açıklandığı gibi her durumda çağrıldı   kendi belgelerinde.

Diğer bir deyişle, kaydetme / geri yükleme kodunu kalıcı veriler için onPause() ve onResume()!

DÜZENLE: Daha fazla açıklama için, işte onSaveInstanceState() belgeleri:

Bu yöntem, bir etkinliğin öldürülmesi için çağrılmadan önce çağrılır.   Gelecekte biraz zaman geri gelir, devletini geri yükleyebilir. İçin   Örneğin, etkinlik B'nin A aktivitesi önünde başlatıldığı ve bazılarında   A noktasındaki etkinlik A kaynakların geri kazanılması için öldürüldü, A aktivitesi   Bu sayede kullanıcı arayüzünün mevcut durumunu kaydetme şansı   yöntem, kullanıcı A etkinliğine döndüğünde,   kullanıcı arayüzü üzerinden geri yüklenebilir onCreate(Bundle) veya    onRestoreInstanceState(Bundle).


366
2018-05-25 23:22



Sadece nitpick için: bu da güvensiz değil. Bu sadece ne korumak istediğinize ve ne kadar süreyle, @Bernard'ın asıl sorusuyla ilgili tamamen açık olmadığını bağlıdır. InstanceState, mevcut UI durumunu (kontrollere girilen veriler, listelerdeki mevcut pozisyonlar ve benzerleri) korumak için mükemmeldir, oysa Duraklat / Devam ettir, uzun süreli kalıcı depolama için tek olasılıktır. - Pontus Gagge
Bu downvoted olmalıdır. Kullanım döngüsü yöntemleri gibi (Save | Restore) InstanceState üzerinde kullanmak güvenli değildir (yani, durumu kaydetmek / geri yüklemek yerine başka bir şey yapın). Durumu kurtarmak / geri yüklemek için mükemmeller. Ayrıca, onPause ve onResume'deki durumu nasıl kaydetmek / geri yüklemek istiyorsunuz? Bundles'i kullanabileceğiniz bu yöntemlere sahip olmuyorsunuz, bu yüzden aptalca olan başka bir veritabanında, veritabanlarında, dosyalarda vb. - Felix
Bu kişiye oy vermemeli, en azından belgelere devam etmek için çaba sarf ettiler ve bence insanlar aslında bilgili bir topluluk oluşturmak ve birbirlerine oy vermek için yardım etmek için buradayız. Bu yüzden çaba için 1 oy verin ve oylama yapmamaya veya oy vermemenize oy vermemenizi istemenizi rica ediyorum .... bu kişi dokümantasyondan geçerken sahip olmak istediği karışıklığı temizleyin. 1 oy kadar :) - AZ_
Bu cevabın bir düşüşü hak ettiğini düşünmüyorum. Atleast, cevap vermeye ve doco'dan bir bölüm çıkarmıştı. - GSree
Bu cevap kesinlikle doğru ve UP oyu hak ediyor, aşağı değil! Onu görmeyen adamlar için devletler arasındaki farkı açıklığa kavuşturmama izin verin. Seçilmiş radyo düğmeleri ve giriş alanındaki bazı metinler gibi bir GUI durumu, ListView'de görüntülenen bir listeye eklenen kayıtlar gibi veri durumundan çok daha az önemlidir. İkincisi, güvenilen tek çağrı olduğu için veritabanına onPause'da depolanmalıdır. Bunun yerine onSaveInstanceState içine koyarsanız, bu çağrılmadığı takdirde veri kaybetme riski vardır. Ancak radyo düğmesi seçimi aynı sebepten dolayı kaydedilmezse - bu büyük bir sorun değildir. - JBM


Meslektaşım, Etkinlik Yaşam Döngüsü ve Durum Bilgileri, Durum Bilgilerinin Saklanması ve Devlete Nasıl Kaydetme hakkında açıklamalar dahil olmak üzere Android cihazlarında Uygulama Durumu'nu açıklayan bir makale yazdı Bundle ve SharedPreferences ve buraya bir göz at.

Makale üç yaklaşımı kapsamaktadır:

Örnek durum Bundle'ı kullanarak uygulama ömürleri için yerel değişken / UI denetim verilerini depolayın (geçici olarak)

[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 Tercihler'i kullanarak uygulama örnekleri arasında yerel değişken / UI denetim verilerini depolayın (kalıcı olarak)

[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 Olmayan Yapılandırma Örneği'ni kullanarak uygulama ömürleri içindeki etkinlikler arasındaki nesne örneklerini bellekte 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();
}

171
2017-08-27 13:54



@ MartinBelcher-Eigo Makale, "Bu veri cihazdaki veri tabanına yazılır." Diye düşündüğümüz SharedPreferences'daki veriler hakkında diyor. Verilerin uygulamanın dosya sisteminin dizinindeki bir dosyada saklandığını düşünüyorum. - Tom
@Tom SharefPrefs verileri xml dosyasına yazılmıştır. Xml bir çeşit veritabanı mıdır? Diyorum ki;) - MaciejGórski
Bunu not et editor.apply() daha hızlı editor.commit(). - Fred
Bağlantı öldü. - Sakiboy


Bu Android geliştirme klasik bir 'gotcha' dir. Burada iki sorun var:

  • Geliştirme sırasında uygulama yığını yönetimini büyük ölçüde zorlaştıran ince bir Android Framework hatası var, en azından eski sürümlerde (tam olarak ne zaman / ne zaman sabitlendiğinden emin değil). Bu hatayı aşağıda tartışacağım.
  • Bu sorunu yönetmenin 'normal' veya amaçlanan yolu, onPause / onResume ve onSaveInstanceState / onRestoreInstanceState'nin dualitesi ile oldukça karmaşıktır.

Tüm bu konulara göz attığımda, zaman geliştiricilerinin çoğunun aynı anda bu iki farklı konu hakkında konuştuklarından şüpheleniyorum. Bu nedenle "bu benim için işe yaramadı" nın tüm kafa karışıklığı ve raporları.

İlk olarak, 'amaçlanan' davranışı açıklığa kavuşturmak için: onSaveInstance ve onRestoreInstance kırılgandır ve sadece geçici durum içindir. Kullanım amacı (afaict), telefon döndürüldüğünde (rekreasyon değişikliği) Etkinlik rekameti ile uğraşmaktır. Diğer bir deyişle, amaçlanan kullanım, Etkinliğiniz hala mantıklı bir şekilde "üstte" iken, yine de sistem tarafından yeniden başlatılmalıdır. Kaydedilen Paket işlem / bellek / gc dışında kalmaz, bu nedenle etkinliğiniz arka plana giderse gerçekten buna güvenemezsiniz. Evet, belki de Aktivitenizin hafızası arka plana olan yolculuğunu sürdürür ve GC'den kaçar, ancak bu güvenilir değildir (ne de tahmin edilebilir).

Dolayısıyla, uygulamanızın “başlattı” arasında kalıcı olması gereken 'kullanıcı ilerlemesi' veya durumun olduğu bir senaryo varsa, rehberlik onPause ve onResume'yi kullanmaktır. Kalıcı bir mağaza seçip 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ılmışsa ve daha sonra siz ana ekrandan veya başlatıcı menüsünden başlatırsanız, o zaman gelen bir görev yeni bir görev oluşturacaktır. Uygulamanızın iki farklı örneğini etkili bir şekilde alacaksınız. Aynı yığını yaşayan ... çok hızlı çok tuhaf oluyor. Bu, uygulamanızı geliştirme sırasında (yani Eclipse veya Intellij'den) başlattığınızda gerçekleşir. Bu nedenle geliştiriciler buna çok şey katmaktadır. Ancak, bazı uygulama deposu güncelleme mekanizmaları aracılığıyla da (kullanıcılarınızı da etkiler).

Asıl meselenin bu hata olduğunu, planlanan çerçeve davranışının olmadığını fark etmeden önce bu konulara saatler boyunca çarptı. Harika bir yazma ve geçici çözüm (UPDATE: aşağıya bakınız), bu cevapta kullanıcı Kaciula'dan görünüyor:

Ana tuşa basın davranışı

UPDATE Haziran 2013: Aylar sonra, en sonunda 'doğru' çözümü buldum. Durum bilgisi olan bir startApp bayraklarını kendiniz yönetmeniz gerekmez, bunu çerçeveden saptayabilir ve uygun şekilde kefalet edebilirsiniz. Bunu LauncherActivity.onCreate'ımın başlangıcında 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;
    }
}

126
2017-10-19 23:47



Android neden tekrar ikinci tercih edilen mobil işletim sistemi oldu? elinde kafa kafaya - Nick Bauer


onSaveInstanceStateSistem belleğe ihtiyaç duyduğunda ve bir uygulamayı öldürdüğünde çağrılır. Kullanıcının uygulamayı kapattığı zaman çağrılmaz. Yani uygulama durumunun da kaydedilmesi gerektiğini düşünüyorum. onPause Gibi bazı kalıcı depolamaya kaydedilmelidir Preferences veya Sqlite


70
2018-05-07 00:21



Üzgünüm, bu doğru değil. onSaveInstanceState, etkinlik yeniden oluşturulmadan önce çağrılır. yani kullanıcı cihazı her döndürdüğünde. Geçici görünüm durumlarını depolamak içindir. Android, uygulamayı kapatmaya zorlandığında, onSaveInstanceState aslında YOKTUR (bu yüzden önemli uygulama verilerini saklamak için güvensiz). onPause, ancak etkinlik öldürmeden önce çağrılması garanti edilir, bu yüzden tercihler veya Squlite'de kalıcı bilgi depolamak için kullanılmalıdır. Doğru cevap, yanlış sebepler. - moveaway00
@ moveaway00 - Kısmen yanlış. Sistem kaynakları kurtarmak için uygulamayı öldürürse, yapar onSaveInstanceState'i çağırın. itibaren developer.android.com/training/basics/activity-lifecycle/... - Sistem aynı zamanda aktivitenizi de yok edebilir ... ön plan etkinliği daha fazla kaynak gerektirir, böylece sistem belleği kurtarmak için arka plan süreçlerini kapatmalıdır. sistem kısıtlamaları ... sistem varolduğunu hatırlıyor ... Kaydedilen veriler ... bir Bundle nesnesinde saklanan anahtar / değer çiftleri topluluğudur. ". - ToolmakerSteve


Her iki yöntem de yararlı ve geçerlidir ve her ikisi de farklı senaryolar için en uygun olanlardır:

  1. Kullanıcı uygulamayı sonlandırır ve daha sonra yeniden açar, ancak uygulamanın son oturumdan verileri yeniden yüklemesi gerekir - bu, SQLite kullanımı gibi kalıcı bir depolama yaklaşımı gerektirir.
  2. Kullanıcı uygulamayı değiştirir ve ardından orijinaline geri döner ve bıraktıkları yeri seçmek ister - paket verilerini (uygulama durumu verileri gibi) kaydedip geri yükler onSaveInstanceState() ve onRestoreInstanceState() genellikle yeterlidir.

Durum verilerini kalıcı bir şekilde kaydederseniz, bir onResume() veya onCreate() (ya da aslında herhangi bir yaşam döngüsü çağrısı). Bu istenen davranış olabilir veya olmayabilir. Bir pakette bir paket içinde saklarsanız InstanceStateDaha sonra, geçici ve aynı kullanıcı oturumunda kullanmak için sadece veri saklamak için uygundur (oturum terimini gevşek bir şekilde kullanıyorum), ancak "oturumlar" arasında değil.

Bir yaklaşımın diğerinden daha iyi olması değil, her şey gibi, hangi davranışa ihtiyaç duyduğunuzu anlamak ve en uygun yaklaşımı seçmek önemlidir.


59
2018-06-27 16:17



Kalıcı depolama alanı ararken SQLite ve Tercihler arasında nasıl seçim yapabiliriz? - Deco


Tasarruf durumu, endişelendiğim kadarıyla en iyi yoldur. Kalıcı verileri kaydetmeniz gerekiyorsa, yalnızca bir SQLite veri tabanı. Android bunu yapar SOOO kolay.

Böyle 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) {
        }
    }
}

Bundan sonra basit bir çağrı

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

50
2018-06-23 17:07



Bir SQLite veritabanını yüklemek çok uzun sürdüğü için, uygulamanın kullanıcıya kullanıcı arayüzünü göstermenin kritik yolunda olduğunu düşünürsek. Aslında zamanlama yapmadım, bu yüzden düzeltilmekten mutluluk duyuyorum, ancak mutlaka bir veritabanı dosyasını yüklemek ve açmak hızlı olmayacak mı? - Tom
Bir yeni kullanıcının uygulamalarına kesip yapıştırabileceği ve hemen kullanabileceği bir çözüm sunduğunuz için çok teşekkür ederiz! @Tom Hız devam ettiği sürece, 1000 çift depolamak yaklaşık yedi saniye sürer, ancak bunu bir AsyncTask'da yapabilirsiniz. Ancak, son olarak bir {cursor.close ()} eklemeniz veya bunu yaparken bellek sızıntısından çökmeniz gerekir. - Noumenon
Buna rastladım ve düzgün görünüyor olsa da, son zamanlarda üzerinde çalıştığım cihaz olan Google Glass’ı kullanmayı denemekten çekiniyorum. - Stephen Tetreault


Bence cevabı buldum. Basit kelimelerle neler yaptığımı söyleyeyim:

İki etkinliğim olduğunu varsayalım, etkinlik1 ve etkinlik2 ve ben etkinlik1'den etkinlik2'ye gidiyorum (etkinlik2'de bazı işler yaptım) ve tekrar etkinlik1'de bir düğmeyi tıklatarak etkinlik 1'e dönüyorum. Şimdi bu aşamada aktiv2'ye geri dönmek istedim2 ve aktivitemi2 son soldaki etkinlik2 ile aynı durumda görmek istiyorum.

Yukarıdaki senaryo için yaptığım şey, açıklamamda şu gibi bazı değişiklikler yaptım:

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

Ve düğme tıklatma olayındaki aktivitede1 böyle yaptım:

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

Ve button2 etkinliğinde etkinlik 2'de şu şekilde yaptım:

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

Şimdi ne olacak, etkinlik2'de yaptığımız değişiklikler her ne olursa olsun, kaybolmayacak ve daha önce bıraktığımız gibi, aktivite2'yi aynı durumda görebiliriz.

Bunun cevabın olduğuna inanıyorum ve bu benim için iyi çalışıyor. Eğer Yanlışsam beni düzelt.


50
2018-02-05 11:35



@bagusflyer daha spesifik olması için bakım ??? Yorumunuz yardımcı olmadı ve buna dayanarak kimse size yardımcı olamaz. - Stephen Tetreault
Bu farklı bir duruma bir cevaptır: Aynı uygulama içinde iki etkinlik. OP hakkında ayrılma Uygulama (örneğin, ana düğme veya farklı bir uygulamaya geçmek için başka araçlar). - ToolmakerSteve


onSaveInstanceState() geçici veriler için (geri yüklendi onCreate()/onRestoreInstanceState()), onPause() kalıcı veriler için (geri yüklendi onResume()). Android teknik kaynaklarından:

onSaveInstanceState () Faaliyet durdurulursa ve tekrar başlatılmadan önce öldürülürse Android tarafından çağrılır! Bu, Aktivite yeniden başlatıldığında aynı duruma yeniden başlatmak için gerekli olan herhangi bir durumu depolaması gerektiği anlamına gelir. OnCreate () yönteminin karşılığıdır ve gerçekte onCreate () öğesine gönderilen savedInstanceState Bundle, onSaveInstanceState () yönteminde outState olarak oluşturduğunuz Bundle'tır.

OnPause () ve Özgeçmişte() ayrıca ücretsiz yöntemler vardır. OnPause (), Aktivite bittiğinde her zaman çağrılırsa (örneğin, bir bitirme () çağrısıyla) çağrılır. Mevcut notu veritabanına geri kaydetmek için bunu kullanacağız. İyi uygulama, pasif durumdayken daha az kaynak almak için, onPause () sırasında serbest bırakılabilecek herhangi bir kaynağı serbest bırakmaktır.


36
2018-01-17 18:28