Uygulama, özgeçmiş yerine yeniden başlatılıyor


195

Umarım birisi çözüm olmasa bile, en azından bir davranış için bir açıklama bulmamda bana yardımcı olabilir.

Sorun:

Bazı cihazlarda, başlatıcı simgesine basmak geçerli görevin sürdürülmesine neden olurken, diğerlerinde ilk başlatma amacının tetiklenmesine (uygulamayı etkili bir şekilde yeniden başlatmak) neden olur. Bu neden oluyor?

Detay:

"Launcher Icon" a bastığınızda uygulama normal başlar - Yani, sanırım Activity, eylem android.intent.action.MAINve kategori ile ilk adınızla bir Niyet başlatılır android.intent.category.LAUNCHER. Ancak bu her zaman böyle olamaz:

Cihazların çoğunda, uygulama zaten çalıştıktan sonra başlatıcı simgesine basarsanız, o süreçte o anda çalışan Etkinlik devam eder ( ilk DEĞİLActivity ). İşletim sistemi menüsündeki "Son Görevler" den seçmiş olduğunuz şekilde devam eder. Tüm cihazlarda istediğim davranış budur .

Ancak, seçilen diğer cihazlarda farklı davranışlar oluşur:

  • Motorola Xoom'da, başlatıcı simgesine bastığınızda, Uygulama şu anda çalışanlardan bağımsız olarak her zaman ilk başlatmayı başlatacaktır Activity. Başlatıcı simgelerinin her zaman "LAUNCHER" amacını başlattığını varsayıyorum.

  • Samsung Tab 2'de, başlatıcı simgesine bastığınızda, uygulamayı yeni yüklediyseniz, her zaman ilkini başlatır Activity(Xoom ile aynı) - ancak, yüklemeden sonra cihazı yeniden başlattıktan sonra başlatıcı simgesi uygulamayı devam ettirin. Bu cihazların, cihaz başlangıcında başlatıcı simgelerinin çalışan görevleri doğru bir şekilde sürdürmesini sağlayan bir arama tablosuna "yüklü uygulamalar" eklediğini varsayıyorum?

Bunu birçok cevabı okudum ses sorunuma benzer ancak basitçe ekleyerek android:alwaysRetainTaskState="true"veya kullanma launchMode="singleTop"için Activitycevap değildir.

Düzenle:

Bu uygulamanın en son başlatılmasından sonra, bu davranışın ilk yeniden başlatmadan sonra tüm cihazlarda ortaya çıkmaya başladığını görüyoruz . Bu bana çılgınca geliyor ama yeniden başlatma sürecine baktığımda, neyin yanlış gittiğini bulamıyorum.


1
Bu sorulması önemsiz bir soru gibi görünebilir, ancak Xoom için geliştirme seçeneklerinizde "Faaliyetleri saklamayın" mı ayarladınız?
Andrew Schuster

Hayır (Keşke! :)) - Her Faaliyetin yaşam döngüsünü ve Faaliyetleri arka planda hala mevcut olarak kaydettim (Durduruldu - yok edilmedi). İşletim sistemi finish(), onları Activitytekrar başlatmak yerine, yeniden ilk başladığı durumlarda çağırıyor gibi görünüyor .
Graeme

1
Ana sayfa düğmesine bastıysanız ve ardından başlatıcı simgesini tıkladıysanız, devam etme davranışı muhtemelen farkında olduğunuz gibi android için varsayılan değerdir. Ancak ana ekrana dönmek için geri düğmesine basarsanız çoğu telefon uygulamayı bitirir (). Uygulamadan çıkmak için kullandığınız yöntem farklı cihazlarda farklı olabilir mi? Bazılarının sabit / sof tkey'lerini tuhaf bir şekilde ele almadığını kontrol etmek için onKeyUpEvent oturumunu kapatabilir misiniz?
Nick Cardoso

2
Hayır - sorunun yukarıda belirtildiği gibi olduğundan eminim. Uygulamayı arka plana koymak için ev kullanmak (geri değil, doğru olan etkinlik). Backstack kesinlikle gelmiştir böylece Xoom (adil değil Başlatıcı'dan) görev listeden uygulamayı devamı yönünde Mümkün değil öldürüldü.
Graeme

1
Ödülle cevap, soruda açıklanan sorunu çözmenin yoludur. Kendi cevabımı "doğru" olarak işaretledim, çünkü bazen sorun başlatıcıdaki bir uygulama hatasından kaynaklanıyor olsa da (cevabında belirtildiği gibi) benim özel sorunum Görev geçişinden kaynaklandı. Her iki sorunun da çözümü onun çözümü ile belirlenir.
Graeme

Yanıtlar:


238

Yaşadığınız davranış, API 1'den bu yana bazı Android başlatıcılarında bulunan bir sorundan kaynaklanıyor. Hata ile ilgili ayrıntıları ve olası çözümleri burada bulabilirsiniz: https://code.google.com/p/android/issues/ ayrıntı? id = 2373 .

Samsung cihazlarında ve özel bir başlatıcı / cilt kullanan diğer üreticilerde nispeten yaygın bir sorundur. Sorunun stok Android başlatıcıda meydana geldiğini görmedim.

Temel olarak, uygulama aslında tamamen yeniden başlatılmaz, ancak lansman Etkinliğiniz başlatılır ve uygulama başlatıcı tarafından devam ettirilirken Etkinlik yığınının üstüne eklenir. Uygulamayı sürdürdüğünüzde ve başlatma Etkinliği gösterilirken geri düğmesini tıklayarak durumun bu olduğunu onaylayabilirsiniz. Daha sonra, uygulamayı sürdürdüğünüzde gösterilmesini beklediğiniz Etkinliğe getirilmelidir.

Bu sorunu gidermek için uygulamayı seçtiğim geçici çözüm, ilk Etkinliği başlatan amaçtaki Intent.CATEGORY_LAUNCHER kategorisini ve Intent.ACTION_MAIN eylemini denetlemektir. Bu iki bayrak varsa ve Etkinlik görevin kökünde değilse (uygulama zaten çalışıyor demektir), ilk Etkinlikte bitir () olarak adlandırırım. Bu kesin çözüm sizin için işe yaramayabilir, ancak benzer bir şey gerekir.

İlk / launch Activity'nin onCreate () yönteminde yaptığım şey:

    if (!isTaskRoot()
            && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
            && getIntent().getAction() != null
            && getIntent().getAction().equals(Intent.ACTION_MAIN)) {

        finish();
        return;
    }

4
Şimdiye kadar bu benim için olumsuz bir yan etkisi olmadan işe yarıyor. Mantıksal varsayımlara dayanarak, bunun geçerli olmadığına dair hiçbir neden göremiyorum.
javahead76

3
Bu hatayla başa çıkmanın doğru yolu olduğunu düşünüyorum. Benim için çalışıyor.
Sokolov

3
işi benim için yaptı, yaklaşık 8 farklı cihazda doğrulandı. çok teşekkürler!
shaya ajzner

3
WOOOOOW son 2 saat içinde bir düzeltme arıyordum sorunumu düzeltti
Jean Raymond Daher

2
Teşekkürler @ starkej2. Bir cazibe gibi çalıştı.
Rajeev Sahu

55

Bu soru 2016'da hala geçerli. Bugün bir KG test cihazı stok başlatıcıdan devam etmek yerine yeniden başlatılan bir uygulama rapor etti , Android M'deki .

Gerçekte, sistem başlatılan etkinliği geçerli görev yığınına ekliyordu , ancak kullanıcıya bir yeniden başlatma gerçekleşmiş ve işlerini kaybetmiş gibi görünüyordu. Dizi şöyleydi:

  1. Play Store'dan indirin (veya sideload apk)
  2. Play store iletişim kutusundan uygulamayı başlat: A etkinliği görünüyor [görev yığını: A]
  3. Etkinlik B'ye gidin [görev yığını: A -> B]
  4. 'Ana Sayfa' düğmesine basın
  5. Uygulamayı uygulama çekmecesinden başlat: A etkinliği görünüyor! [görev yığını: A -> B -> A] (kullanıcı buradan 'B' etkinliğine gitmek için 'Geri' düğmesine basabilir)

Not: Bu sorun, ADB yoluyla dağıtılan hata ayıklama APK'ları için, yalnızca Play Store'dan indirilen veya yandan yüklenen APK'larda ortaya çıkmaz. İkinci durumda, 5. adımdaki başlatma amacı bayrağı içeriyorduIntent.FLAG_ACTIVITY_BROUGHT_TO_FRONT , ancak hata ayıklama durumlarında değil. Uygulama başlatıcıdan soğuk başlatıldıktan sonra sorun ortadan kalkar. Benim şüphe, görevin, görev tamamen temizlenene kadar doğru başlatma davranışını önleyen hatalı biçimlendirilmiş (daha doğru, standart dışı) bir Niyet ile tohumlanmasıdır.

Çeşitli etkinlik başlatma modlarını denedim , ancak bu ayarlar kullanıcının bekleyeceği standart davranıştan çok fazla saptı: Görevin B etkinliğinde devam ettirilmesi . Sayfanın altındaki Görevler ve Geri Yığın kılavuzunda aşağıdaki beklenen davranış tanımına bakın. 'Görev Başlatma' başlığı altında:

Bu tür bir niyet filtresi, etkinliğin uygulama başlatıcısında görüntülenmesi için bir simge ve etiketin kullanılmasına neden olarak kullanıcılara etkinliği başlatma ve başlatıldıktan sonra oluşturdukları göreve geri dönme yolu verir.

Bu cevabı alakalı buldum ve kullanıcı uygulamayı açtığında uygun şekilde devam etmesi için kök aktivitemizin (A) 'onCreate' yöntemine aşağıdakileri ekledim.

                    /**
     * Ensure the application resumes whatever task the user was performing the last time
     * they opened the app from the launcher. It would be preferable to configure this
     * behavior in  AndroidMananifest.xml activity settings, but those settings cause drastic
     * undesirable changes to the way the app opens: singleTask closes ALL other activities
     * in the task every time and alwaysRetainTaskState doesn't cover this case, incredibly.
     *
     * The problem happens when the user first installs and opens the app from
     * the play store or sideloaded apk (not via ADB). On this first run, if the user opens
     * activity B from activity A, presses 'home' and then navigates back to the app via the
     * launcher, they'd expect to see activity B. Instead they're shown activity A.
     *
     * The best solution is to close this activity if it isn't the task root.
     *
     */

    if (!isTaskRoot()) {
        finish();
        return;
    }

GÜNCELLEME: etkinliğin doğrudan görevin kökünde olup olmadığını sorgulamak için bu çözümü amaç bayraklarını ayrıştırmaktan uzaklaştırdı. Niyet bayraklarını tahmin etmek ve test etmek, bir ANA etkinliği açmak için var olan tüm farklı yollarla test etmek zordur (Evden başlat, 'yukarı' düğmesinden başlat, Play Store'dan başlat vb.)


4
"Uygulama başlatıcıdan soğuk başlatıldıktan sonra sorun ortadan kalkar." Bu en garip kısım ve ben de gözlemledim - ilk lansmandan sonra uygulamayı öldürmek, tekrar normal davranmaya başlar. Böyle garip bir böcek. Bunu analiz ederek ve çözüm için teşekkürler.
Oded

11
Not: APK'yı Android Studio aracılığıyla yüklemiş olsanız bile , uygulamanın temizliğini Google Play sayfasından "Aç" ı kullanarak, ilk olarak temizledikten sonra (açıkladığınız gibi "soğuk başlatma" ile) yeniden oluşturma sorununu alabilirsiniz . Ben çalıştım düzeltmeyi doğrulamak için çok yararlı buldum.
Oded

Güzel açıklama!
karanatwal.github.io

Bu açıklama için teşekkürler :)
AndroidEnthusiast

2
Bu, birçok uygulamada olur. Google Fotoğraflar, test ettiğim önemli bir fotoğraf.
Raghubansh Mani

19

Aha! (tldr; Aşağıdaki ifadelere kalın harflerle bakın)

Sorunu buldum ... sanırım.

Yani, bir varsayımla başlayacağım. Başlatıcıya bastığınızda, varsayılanı başlatır Activityveya Taskönceki bir başlatma tarafından başlatılmışsa açık konuma getirir. Başka bir deyişle - Navigasyonunuzun herhangi bir aşamasında yeni Taskve finisheskisini oluşturursanız , başlatıcı artık uygulamanızı sürdürmeyecektir.

Bu varsayım doğruysa, her birinin Taskaynı süreçte olduğu ve oluşturulan ilk özgeçmiş adayı kadar geçerli olduğu göz önüne alındığında, bunun bir hata olması gerektiğinden eminim ?

O zaman benim sorunum, bu bayrakları bir çift kaldırılarak giderildi Intents:

i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );

FLAG_ACTIVITY_NEW_TASKYeni bir Taskşey yarattığı açık olsa da , yukarıdaki varsayımın yürürlükte olduğunu takdir etmedim. Bunu bir suçlu olarak gördüm ve test etmek için kaldırdım ve hala bir sorunum vardı, bu yüzden reddettim. Ancak, hala aşağıdaki koşullar vardı:

i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)

Açılış ekranım Activityyukarıdaki bayrağı kullanarak uygulamamda "ana" başlıyordu . Afterall, Uygulamamı veActivity hala çalışıyordu, ben çok durum bilgilerini korumak istiyorum.

Belgelerde yeni bir başlatmaya değinmediğini göreceksiniz Task:

Ayarlanırsa ve başlatılan etkinlik geçerli görevde zaten çalışıyorsa, o etkinliğin yeni bir örneğini başlatmak yerine, üstündeki diğer tüm etkinlikler kapatılacak ve bu Niyet (şimdi üst) yeni bir niyet olarak eski etkinlik.

Örneğin, A, B, C, D aktivitelerinden oluşan bir görevi düşünün. D, B aktivitesinin bileşenine karar veren bir Niyet ile startActivity () öğesini çağırırsa, C ve D tamamlanır ve B verilen Niyeti alır , yığının şu anda oluşmasına neden olur: A, B.

Yukarıdaki örnekte şu anda çalışan B etkinliği örneği ya burada başlattığınız yeni amacı onNewIntent () yöntemiyle alacak ya da yeni amaç ile bitmiş ve yeniden başlatılacak. Başlatma modunun "çoklu" (varsayılan) olduğunu bildirdiyse ve aynı amaç için FLAG_ACTIVITY_SINGLE_TOP belirlemediyseniz, bitirilir ve yeniden oluşturulur; diğer tüm başlatma modları için veya FLAG_ACTIVITY_SINGLE_TOP ayarlanmışsa, bu Amaç geçerli örneğin onNewIntent () öğesine iletilir.

Bu başlatma modu ayrıca FLAG_ACTIVITY_NEW_TASK ile birlikte iyi etki için kullanılabilir: bir görevin kök etkinliğini başlatmak için kullanılırsa, o görevin çalışan herhangi bir örneğini ön plana getirir ve ardından kök durumuna temizler. Bu, örneğin bildirim yöneticisinden bir etkinlik başlatırken özellikle yararlıdır.

Yani, aşağıda açıklandığı gibi durum vardı:

  • Abaşlattı Bile FLAG_ACTIVITY_CLEAR_TOP, Abittikten.
  • Bbir hizmeti yeniden başlatmak istiyorsa A, hizmeti yeniden başlatma mantığı ve kullanıcı arayüzüne sahip olan kullanıcıyı gönderir (Bayrak yok).
  • Alansmanlar BFLAG_ACTIVITY_CLEAR_TOP ile, Abitirir.

Bu aşamada , görev yığındaki ikinci FLAG_ACTIVITY_CLEAR_TOPbayrak yeniden başlatılır B. Bunun Taskyeni bir soruna yol açması ve yeni bir sorun başlatması gerektiğini düşünüyorum , bu da sorunuma neden oluyor, bu da bana sorarsanız çok zor bir durum!

Tüm varsayımlarım doğruysa:

  • LauncherSadece başlangıçta oluşturulan Görevi devam eder
  • FLAG_ACTIVITY_CLEAR_TOPKalanları yeniden başlatırsa, Activityyeni birTask

FLAG_ACTIVITY_CLEAR_TOP yeni bir görev oluşturmaz veya kalan tek Etkinlik ise başlatmaya çalıştığınız Etkinliği yeniden başlatmaz. "Ayarlanırsa ve başlatılan etkinlik geçerli görevde zaten çalışıyorsa, o etkinliğin yeni bir örneğini başlatmak yerine, üstündeki diğer tüm etkinlikler kapatılacak ve bu Amaç (şimdi üstte) yeni bir niyet olarak eski etkinliği "
starkej2

2
Bunun amaçlanmadığını anlıyorum - ama deneme yanılma yoluyla bu benim durumumda böyle oluyor. Bu bayrakları kaldırmak sorunu çözer.
Graeme

Bu, her koşulda tüm cihazlarda mükemmel bir özgeçmiş oluşturmaz.
danny117

Bayrakları kaldırmak benim için sorunu çözdü. Teşekkürler
Sealer_05

Açılış ekranı / ana ekran senaryom var ama sıçramadan anaya geçiş için herhangi bir bayrak kullanmıyorum, yine de sorun bana yeniden üretilebilir - bu çözüm bana çalışmıyor.
ror

12

Samsung cihazlarında da aynı sorunu yaşadım. Çok aradıktan sonra, bu cevapların hiçbiri işe yaramadı. AndroidManifest.xml dosyasında ( ) launchModeolarak ayarlandığını gördüm . Özniteliğin kaldırılması sorunumu çözdü.singleInstanceandroid:launchMode="singleInstance"launchMode


Gerçekten, bu benim için hile yaptı. Bu cevabı başka bir SO sorusundan yardımcı olmak için buldum: stackoverflow.com/a/21622266/293280 . Ve bu farklı değer türlerini yazıyorlaunchMode : inthecheesefactory.com/blog/…
Joshua Pinter

Bu düzeltme benim için çalıştı! Bu, manifest'te değil, ana aktivite sınıfı üzerindeki etkinlik özelliğinde eklendi.
Calin Vlasin

@CalinVlasin, launchMode'u nasıl kullandığınızı tam olarak gösterebilir misiniz? nereye yerleştirdin şu anda böyle ama soruna neden olan: <etkinlik android: ad = ". UI.landing.MyActivity" android: configChanges = "locale | layoutDirection" android: launchMode = "singleTop" android: windowSoftInputMode = "stateAlwaysHidden | adjustResize ">
j2emanue

Bu da benim sorunumdu. Bunun kabul edilen cevapla birlikte kullanılması gerektiğini düşünüyorum (! İsTaskRoot ...
23'te behelit)

1

Cat s60'ımda Geliştirici seçeneklerinde "Etkinlikleri tutma" özelliğini etkinleştirmiştim, bunu devre dışı bırakmak, uygulamaların durumunu kaybetmeden uygulamaları değiştirmeme izin verdi ...


Nasıl olduğu hakkında bir fikrim yok, ama bu cihazımda AÇIK.
Eylül'te realPro 16:48

0

Bu çözüm benim için çalıştı:

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            Intent startMain = new Intent(Intent.ACTION_MAIN);
            startMain.addCategory(Intent.CATEGORY_HOME);
            startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(startMain);
            return false;
        }
        else
            return super.onKeyUp(keyCode, event);
    }

kredi: Geri düğmesini tıklatarak android uygulamasını en aza indirmem gerekiyor

tüm cihazlarda çalışmayabilir, ancak geri düğmesine basıldığında başarılı bir şekilde ana sayfa düğmesi davranışı oluşturur, böylece etkinliği bitirmek yerine durdurur.


İlginç bir numara ama sorunu belirtildiği gibi çözmüyor. Yine de diğer sorunlar / sorular için çok yararlı.
Graeme

Geri düğmesinin belirli bir amacı vardır ve kullanıcılar geri düğmesinin yapması gerekeni yapmasını bekler. Herhangi bir şekilde geçersiz kılmak yanlış ve bence son derece profesyonelce.
Bugs

-1

Aynı sorunu yaşadım, nedeni:

(MainActivity'de Kotlin kodu)

override fun onBackPressed() {
    finish()
}

Bu yüzden LoginActivity'den MainActivity'ye giderken bunu kullanıyorum:

    val intent = Intent(this, MainActivity::class.java)
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    startActivity(intent)

Bu bayrakları kullanırken benim MainActivity bir onBackPressed () olması gerekmez, geri tıklama doğal olarak app çıkacaktır. Ve Ana Ekran düğmesine basıp uygulamaya geri döndüğünüzde yeniden başlatılmaz.


-2

Android telefonunda bu sorunu programlama ve deneyimleme konusunda hiçbir fikri olmayan insanlar için çözüm. Bu çoğunlukla android sürümünün yükseltilmesi nedeniyle olur (sadece benim varsayım). Yeni sürüme geçtikten sonra tüm uygulamalarınız daha az pil kullanacak şekilde optimize edilir. Ancak, bu da cihazınızı yavaşlatır.

Nasıl çözülür

Ayarlara gidin >> Uygulamalar >> uygulama ayarları (ekranın herhangi bir yerinde ayar işaretlerini arayın - farklı cihazlarda farklıdır) >> pil optimizasyonu (veya benzer opti [buraya resim açıklamasını girin] [1] açık) >> tümünü taşı için uygulamalar 'optimize edilmemiş' devlet (el / izin veren bazı telefonlarda disallow olmak dağıtabilir 1 yanında 1 yapmak zorunda). Başlatıcı uygulamanızın 'optimize edilmemesi' gerekiyor (benim durumumda Zen UI başlatıcısı - bu sanırım suçludur - zamanınız varsa optimize etmeyi / farklı uygulamayı optimize etmemeyi ve yeniden başlatmayı deneyebilirsiniz). Şimdi telefonunuzu yeniden başlatın. (veri / güvenli mod veya herhangi bir sorun sıfırlamaya gerek yok)

Şimdi çoklu görevleri deneyin. :) Başlatıcı simgesine basmak artık geçerli görevin devam etmesine neden olmalıdır. :) Cihazınız akü için endişelenmeyin, yine de boşalacaktır.


-8

Kullanıcılarınıza paha biçilemez. Son kullanılan uygulama listesinde haftalarca oturduktan sonra bile mükemmel özgeçmiş.

Kullanıcıya bir özgeçmiş gibi görünüyor ama aslında tam bir başlangıç.

Arka plan: Ana etkinlikte bir görevi başlatmayan uygulamalar tarafından kullanılan belleğin geri kazanılması kolaydır. İşletim sistemi, onCreate'a iletilen orijinal paketle uygulamayı yeniden başlatabilir. Bununla birlikte, orijinal pakete ekleyebilirsiniz, böylece uygulamanız işletim sistemi tarafından yeniden başlatıldığında örnek durumunu geri yükleyebilirsiniz ve hiç kimse uygulamanın yeniden başlatılıp başlatılmayacağına veya devam ettirilmesine ilişkin daha akıllı değildir. Örneğin klasik harita programını ele alalım. Kullanıcı haritadaki bir konuma hareket eder ve ardından ana ekran tuşuna basar. İki hafta sonra bu harita uygulaması facebook, pandora ve candy crush ile birlikte son uygulamalar listesinde. İşletim sistemi sadece son kullanılan uygulamalar için uygulamanın adını kaydetmez, aynı zamanda uygulamayı başlatmak için kullanılan orijinal paketi de kaydeder. Ancak programcı orignal paketinin artık uygulamayı yeniden başlatmak için gerekli olacak şekilde oluşturmak için gerekli tüm materyalleri ve bilgileri içerdiği bir yöntem.onSaveInstanceStateonSaveInstanceState

Örnek: Uygulamanın kaldırılması ve son uygulamalar listesinden haftalar sonra yeniden başlatılması durumunda mevcut kamera konumunu onSaveInstanceState'e kaydedin.

@Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        // save the current camera position;
        if (mMap != null) {
            savedInstanceState.putParcelable(CAMERA_POSITION,
                    mMap.getCameraPosition());
        }
    }



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

        // get the exact camera position if the app was unloaded.
        if (savedInstanceState != null) {
            // get the current camera position;
            currentCameraPosition = savedInstanceState
                    .getParcelable(CAMERA_POSITION);
        }

Not:onRestoreInstanceState yöntemi de kullanabilirsiniz, ancak örneği geri yüklemeyi daha kolay buluyorum onCreate.

Bu, uygulamanızda olup bitenlerden daha fazladır. Bazı cihazlarda uygulamanızın belleği boşalmak için yüklemesi kaldırılmıştır. Evet, yardımcı olan bazı bayraklar var, ancak bayraklar uygulamanızın her nüansını almayacak ve bayraklar haftalarca onSaveInstanceStateirade gibi hayatta kalmayacak. Mükemmel iki hafta sonra özgeçmiş kodlamak zorunda. Karmaşık uygulama için kolay bir görev olmayacak, ancak arkanızdayız ve yardım etmek için buradayız.

İyi şanslar


Bunun nedeni yaygın bellek kaygıları veya varsayılan "duraklatma durumu" koşulları değildir. Uygulamamı birçok cihazda denedim (bazıları büyük hafızalı, bazıları daha düşük hafızalı).
Graeme

Bu yüzden onPause'da kalıcı verileri kaydettiğinizde Uygulamamı her gün kullandığım telefonda iki haftaya kadar devam ettirmeye çalıştım ve iki hafta sonra onCreate yöntemi çağrıldığında ve işletim sistemi kaydettiğim pakette geçtiğini söyleyeyim onSaveSessionState ve etkinliğimin tam olarak bıraktığım gibi görünmesini sağlamak için paketteki verileri kullanıyorum. Cevabımdan bu yana sadece üç gün geçti, bu yüzden iki haftalık bir testi tamamlamanın bir yolu yok. Özet: Uygulama arka planda olduğu zaman kapatılabilir.
danny117

@ danny117 Graeme'nin yaşadığı sorunu tam olarak anladığınızı sanmıyorum
starkej2

Graeme'nin konusunu anlıyorum. Uygulama devam ettirilen bazı cihazlarda onCreate'ı çağırır. Ekranı döndürmek için uygulamayı öldürecek olan HTC EVO (Gingerbread) gibi geliyor. Uygulamanın onCreate developer.android.com/reference/android/app/…
danny117

@ danny117 doğru, ancak yaşadığı sorun, uygulama yeniden başlatıldığında (beklenen) yeniden oluşturulan tek bir etkinlikle ilgili değil, ancak yanlış etkinlik başlatılıyor
starkej2
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.