2010-07-29 12 views
15

ile düzgün çalışmaz Uygulamamın Etkinlik yığınının Etkinlikler'ini yalnızca bir örneğiniz olmasını istiyorum. ListActivities olan birkaç ekranım var ve ListActivitesinin bir başka örneğinde (eklenen, düzenlenmiş, kaldırılmış, vb.) ListActivitesinin önceki bir örneğinde listelerin güncelleştirilmesiyle ilgili acı ve sıkıntıdan kurtulmak istemiyorum. (ya da bunu yapmak için kolay bir yolu var mı?).startActivityForResult, launchMode singleInstance

Not: Tek bir tıklamanın bunu başaracağını okudum (Geri düğmesine basarsanız Etkinliği bozarsa da), ancak çalışmaz. Bir menüm var ve Gelen Kutusu ekranına gidersem, Hızlı Listeleme ekranına gidiyorum ve Gelen Kutusu ekranıma tekrar giderim, yeni bir Gelen Kutusu Etkinliği oluşturur.

Şu anda, ListActivities'ımda, launchMode'u singleInstance olarak ayarlıyorum. Sorun şudur: startActivityForResult kullanarak başka bir Etkinlik başlatırsam, onActivityResult işleyicisi hemen başlatılır (yeni Etkinlik oluşturulmadan önce). Bir sonraki ekranda sonucu döndürmek için gerekli eylemi gerçekleştirdiğimde, onActivityResult işleyicisi yanmaz.

Neler oluyor? Gönderen

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_QUICKLIST) { 
     if (resultCode == Activity.RESULT_OK) { 
      Bundle extras = data.getExtras(); 
      if (extras != null) { 
       int id = extras.getInt("ql_id"); 
       if (id > 0) { 
        launchQLItemsThread(id); 
       } 
      } 
     } 
    } 
} 

cevap

21

: Burada

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    QuickListItem qlItem = m_Adapter.getItem(position); 
    if (qlItem != null && qlItem.getQLId() != -1) { 
     Intent data = new Intent(); 
     data.putExtra("ql_id", qlItem.getQLId()); 
     if (getParent() == null) { 
      setResult(Activity.RESULT_OK, data); 
     } 
     else { 
      getParent().setResult(Activity.RESULT_OK, data); 
     } 
    } 
    finish(); 
} 

benim onActivityResult işleyicisi geçerli:

İşte
Intent intentLaunchQuickList = new Intent(ActivityMyList.this, ActivityQuickList.class); 
startActivityForResult(intentLaunchQuickList, REQUEST_QUICKLIST); 

Ben sonucu döndüren nasıl: Burada

Yeni Aktivite ateş nasıl startActivityForResult dokümantasyonu: "Örneğin, başlatmakta olduğunuz etkinlik singleTask kullanıyorsa başlatma modu, görevinizde çalışmayacak ve bu yüzden hemen bir iptal sonucu alacaksınız. " singleInstance etkinlikleri aynı şekilde. Başka bir deyişle, eğer sAFR kullanmak isterseniz, birden çok etkinlik örneğini ele almanız gerekir.

Tavsiye edeceğim şey, adresindeki ListActivity örnekleriniz için liste durumunu bazı uygulama genelindeki noktaya (tekil veya herhangi bir yere) ve oradan da onResume ürününe yüklemektir. Daha sonra, birden çok ListActivity örneği oluşturulsa bile, en üstteki veriler, daha eski olanların yeniden başlaması için verileri her zaman günceller ve listeler her zaman kullanıcı için geçerli görünür.

Verilerinizin kalıcı olması isteniyorsa bunu yapmanız gerekir, çünkü tüm işleminiz sistem tarafından numaralı çağrıdan sonra herhangi bir zamanda öldürülür ve herhangi bir yerde herhangi bir değişiklik kaydetmediyseniz; Geri dönen zaman, bazı nadiren ve öngörülemeyen şartlar altında sessizce kaybolabilirler. Bu durumda, yerel dosya veya SQLite veritabanları kullanmak, ağa devam etmek istemiyorsunuz. , kullanıcı çalışırken sistemle etkileşimde bulunamadığından hızlı bir şekilde geri dönmesi gerektiğinden, yerel depolama birimine kaydedin ve başka bir zamanda, belki de tarafından başlatılan bir hizmet aracılığıyla ağa eşitleyin.

+0

Cevabınız için teşekkür ederiz. Ne yapmamı istediğinizi anlıyorum, ancak sorunlara neden olmaz mı? Açıkçası aynı şeyi onSaveInstanceState ve onRestoreInstanceState işleyicilerinde yapmam gerekecek. onResume ve OnPause okudum ve veritabanından bilgi tasarruf üzerine, başvurum gereksiz yere veritabanından okuyacak ve hiç evet, onRestoreInstanceState işleyicisi vurmak gerekir SavedInstanceState gelen okursanız? Ayrıca, bu gerçekten Android devleri için ortak uygulama nedir? ListActivity'nin birden çok örneği için ListActivity verilerini tekil olarak kaydediyor musunuz? Yine, – Andrew

+0

'a yardım ettiğiniz için teşekkürler Ayrıca, singleTop'un neden benim için çalışmadığını açıklayabilir misiniz? Yoksa anlamadım mı? – Andrew

+0

SavedInstanceState yalnızca belirli bir etkinlik örneğinin durumunu geri yüklemek için kullanışlıdır; içeriğini listelemek değil, kaydırma konumunu kaydetmek için kullanın. Ne yapmak istediğiniz, aktivitenizin tüm örneklerinin bazı durumları paylaşmasıdır, bu nedenle bu durumu bir veritabanında kalıcı ya da statik bir üyeyken ağdan yalnızca bir veri önbelleği olması durumunda koymak istersiniz.İkincisini söylediklerine göre öneririm; Sadece veriyi saklamak için bir DB kullanmanız yeterlidir, böylece gelecekte ağ üzerinden göndermeniz gerekir, böylece kaybetmezsiniz. –

1

Ben ListActivities olduğunu ve ListActivity ait başka örneği olduğunda Burada acı ve ListActivity önceki durumda listeleri güncelleyerek acıları aracılığıyla gitmez istiyorum birkaç ekranlar değişti (veya 'un bunu yapmasının kolay bir yolu var mı?).

tutarlı modeli kullanın. Örneğin, verileriniz bir veritabanında umarız. Her ListActivity, ihtiyaç duyduğu veritabanının bir kısmında Cursor'a sahiptir. Cursor (startManagingCursor() yoluyla) bir "yönetilen İmleç" olabilir ve sizin ListViewsonResume() içinde otomatik olarak güncellenecektir olduğunu var. Daha sonra, değişikliklerinizi modelinize veritabanından geçirirsiniz.

Bir menü ve benim Gelen Kutusu ekranına giderseniz, o zaman benim QuickList ekranına gidin, sonra yine benim Gelen Kutusu ekranına gitmek, yeni bir Gelen Kutusu Aktivite oluşturur. bunu yapmak gerekiyordu ne

. sadece bir açıdan birbirinden farklı

"standart" ve "singleTop" modları: "standart" etkinliği için yeni niyet , sınıfının yeni örneği var her zaman documentation aktaran Bu amaçla yanıtı oluşturulur. Her bir örnek , tek bir amaç taşır. Benzer şekilde, yeni bir niyeti ele almak için bir "tekTop" aktivitesinin yeni bir örneği de yaratılabilir. Ancak, hedef görevinin zaten varolan bir örneğinin yığınının üstündeki etkinliğe sahip olması durumunda, numaralı yeni niyeti (onNewIntent() çağrısında) alır; yeni örnek oluşturulmadı. Diğer durumlarda - örneğin, halinde "singleTop" aktivitesinin mevcut örneği, hedef görevi olan, ama istif, üstünde ya da bir istifin üstünde, ama halinde Hedef görevde değil - yeni bir örneği oluşturulacak ve yığında itilecek.

Ben launchMode SingleInstance olarak ayarlanmış olması, benim ListActivities üzerinde, şu anda

(kalın vurgulanmak için).

bunu yapmayın lütfen.

+0

Cevabınız için teşekkür ederiz. Lütfen yönetilen imleçler ve veritabanları ile ilgili bazı yararlı bilgilere bağlantı sağlayabilir misiniz? Bir Android uygulamasında henüz bir veritabanı uygulamadım. – Andrew

+0

Şu anda (bu uygulamaya geçen hafta başladım ve bu benim ilk uygulamam) Sadece web servislerimden veri alıyorum ve listeyi dolduruyorum. Açıkça, yeni bir Etkinlik örneğini oluşturmak, daha sonra web servisinden verileri tekrar çekmeye ihtiyaç duyacaktır. Bu yüzden tek örnek kullanmaya başladım. Söylediklerinin ardındaki mantığı anlıyorum. Henüz böyle bir şey uygulamaya koymadım; bu yüzden bazı kaynaklar yardımcı olacaktır. Tekrar teşekkürler – Andrew

İlgili konular