2012-10-22 16 views
6

Zaten uzun zamandır problemim hakkında çözümler arıyorum, ancak Android belgeleri çok net değil ve web çözümleri tamamen çalışmıyor.Android: singleTop veya SingleTask ile aktiviteyi devam ettirin

Oyunun ana etkinliğinin (oyunun yapıldığı yer) başka bir basit Etkinlik arayabileceği ve geri dönebileceği bir oyun geliştiriyorum. Bu şekilde çalışacak:

  1. kullanıcı Home tuşuna tıkladığında ve ardından oyuna dönerse, etkinlik durdu ve sonra OnDestroy (aksi takdirde oyun durumunu kaybedecek)
  2. geçmesi olmadan devam edilmelidir
  3. Ana Etkinlik diğer Etkinliği çağırdığında ve ardından oyuna geri döndüğünde aynı işlev. android:launchMode="singleTask" veya android:launchMode="singleTop" ama yazık:
  4. kullanıcı oyun ben sadece ve sadece bir ana Etkinlik oluşturuldu ve denir bu emin olmaya çalıştı ilk iki nokta için hiç

çıkmalısınız çıkış düğmesine bastığında İlk sorun için ilk işler ve ikincisi için ikincisi, ikisi için değil!

Sorun şu: Tek tıklama ile ana Etkinlik aslında ikinci etkinlik çağırdığında yığının en üstünde değil (açık olmak gerekirse, aradığım durumun ne olduğunu anlamıyorum) zaten yığınının üstünde olan bir etkinlik!). Tersine, singleTask, Etkinlik'in yığında benzersiz olmasını sağlar, ancak kullanıcılar Ana Sayfa düğmesini tıkladıktan ve Uygulama'ya döndükten sonra diğer Görev denir, doğru muyum? Her neyse, bu akıllı bir çözüm mü yoksa oyunumun durumunu onStop/onPause'a kaydetmeli ve sonra onResume'de devam ettirmeli miyim? Üçüncü noktası için

Her Faaliyete android:noHistory="true" eklemeyi denedim, o zaman kullanıcı ben onCreate üzerinde finish() yöntemle ama hiçbir şey yeni Aktivite diyoruz çıkış düğmesine tıklar bu Aktivite intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK); ile çağrılır onun launchMode, singleInstance'dur, ancak işe yaramıyor, yalnızca ana Etkinlikte her zaman geri dönüyor.

cevap

3

Kesinlikle launchMode ile uğraşmak istemezsiniz. Bu sorunu çözmek için bir yol değil ve sadece size daha fazla sorun yaratacaktır.

Android, istediği zaman (ancak özellikle uygulamanız arka planda ise) işleminizi gerçekleştirebilir (ve devam ettirir). Bu nedenle, oyununuzun durumunu onPause()'a kaydetmeniz gerekir, çünkü bu, garantili garantili tek fırsattır.

Her neyse, oyunu onPause()'a kaydederseniz, standart davranış ilk 2 puanınızı karşılar.

senin 3 noktası için

, birkaç seçenek vardır:

  1. Sen "çıkış", sadece geri gidebilir istediğinizde cevabım here
  2. bkz startActivityForResult() ile bütün faaliyetleri başlatmak edebilirsiniz kök aktivitesi (uygulamanızı başlatan) ve çıkmak istediğinizi söyleyin.Bunun gibi

: Artık

Intent intent = new Intent(this, MyRootActivity.class); // this is the starting activity for your application 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // tells Android to finish all other activities in the stack 
intent.addExtra("exit", "true"); // this tells your root activity that you want to exit 
startActivity(intent); 

, içinde senin MyRootActivity sen onCreate() bu kodu eklemek istiyorum: cevap için

Intent intent = getIntent(); 
if (intent.hasExtra("exit")) { 
    // User wants to exit 
    finish(); 
} 
+0

Teşekkür. İlk iki nokta için android: launchMode = "singleTask" kullanarak çözdüm ve android: noHistory = "true" siliyorum (bunun gerçek problem olduğunu düşünüyorum). OnPause() üzerindeki durumun kaydedilmesi bir seçenek olabilir, ancak Etkinlik'in UI görünümünü nasıl kaydedebilirim? Üçüncü nokta hakkında ... Bu tam olarak benim kullandığım çözümdü, ancak işe yaramadı çünkü diğer Görev'de ana Etkinlik var. Kök etkinlikte bitirmeyi() çağırmayı ve sonra bir bayrak "çıkış" ayarlanmışsa ana Faaliyetin onResume() öğesini kontrol etmeyi çözdüm, bu durumda hemen bitir(). – mordicchio

+0

'launchMode =" singleTask "' ı kullanmanız gerekmez. Standart başlatma modu, istediğiniz şeyi yapacağız. Eğer değilse, o zaman yanlış bir şey yapıyorsunuz demektir. Uygulamanızın birden fazla görevde değil, tek bir görevde çalışması gerekir. Bunun için bir sebep yok. –

+1

Katılıyorum ama bu benim hatam değil, sorun Google'ın çılgın tercihleri! Ana Faaliyetin her zaman bir ve sadece bir tane olmasını (ve nadiren az miktarda bellek olmadığı takdirde destoyed olmamasını) ve bu etkinliğin yığınının üstünde olmamasını istiyorum. Bu nedenle klasik launchMode, etkinliğimin birden fazla örneğini oluşturur. SingleTop, etkinliği yalnızca en üstte olduğunda devam ettirir, ancak başka bir etkinlikten söz ettiğimde bunun nasıl olacağını anlayamıyorum! – mordicchio

İlgili konular