SORU
17 Mart 2010, ÇARŞAMBA


Nasıl Android Hizmet Aktivite ile iletişim kurmak için

Benim ilk Android Uygulama yazma ve hizmetler ve faaliyetler arasındaki iletişimi başımı almak için çalışıyorum. Arka planda çalışan ve bazı gps yapacak bir işim var ve zaman günlüğü tabanlı. Hizmeti durdurmak veya başlatmak için kullanılacak bir Etkinlik olacak.

Bunun için ilk önce, eğer bu Hizmet Aktivite başlatıldığında çalışan olup olmadığını düşünmek lazım. Diğer sorular için buraya vardır, (ama tavsiye vermekten çekinmeyin) şekil edebilirim.

Benim gerçek sorun: bir etkinliktir ve Hizmet başlamış ise, Servis Aktivitesi için iletileri göndermek için bir yol gerekir. Basit Dizeleri ve tamsayılar bu noktada çoğunlukla durum mesajları. Mesajları yoklama servisi eğer başka bir yol varsa oraya gitmek için iyi bir yol olduğunu sanmıyorum, bu kadar düzenli, ne olacak değil. Ben sadece Etkinlik kullanıcı tarafından başlatıldı, bu iletişim ister hizmetinden faaliyete başlamak istemiyorum. Etkinliği başlatmak ve Hizmeti çalışıyorsa, diğer bir deyişle, ilginç bir şey olduğunda Etkinlik UI bazı durum iletilerini görürsünüz. Faaliyet başlamazsın eğer, bu iletiler (bu da ilginç değiller) göremez.

Eğer Hizmet çalışıyorsa belirlemek gerekir gibi görünüyor, ve eğer öyleyse, bir dinleyici olarak Faaliyet ekleyin. Daha sonra etkinliğin duraklatır veya durduğunda bir dinleyici olarak Faaliyet çıkarın. Bu gerçekten mümkün mü? Bunu anlamaya tek yolu Faaliyet Parcelable uygulamak ve Hizmetin uzaktan kumanda ile iletebilir, AİDL bir dosya oluşturmak için. Ama overkill gibi görünüyor, ve Aktivite writeToParcel uygulanması gerektiği hakkında hiç bir fikrim yok() / readFromParcel().

Daha kolay ya da daha iyi bir yolu var mı? Herhangi bir yardım için teşekkürler.

DÜZENLEME:

Bu ilgilenen herkes için, örnekler dizininde AİDL ile bu işleme Google'dan örnek kod var daha: /apis/app/RemoteService.java

CEVAP
19 Ocak 2011, ÇARŞAMBA


Soru soran muhtemelen uzun zamandan beri bu geçmiş geçmiştir, ancak eğer başka birisi bu arar...

Basit olabilir ki bence bu, işlemek için başka bir yol daha var.

Etkinlik için bir BroadcastReceiver ekleyin. Bazı özel onResume niyetiyle almak için kayıt olun ve onPause içinde kurtulun. Durum güncellemeleri göndermek istediğinizde ya da ne var hizmetinizden bu niyet gönderin o zaman.

İstemediğine emin eğer başka bir uygulama Niyetiniz (kimseye kötü niyetli olabilir?), dinleseydin mutsuz olun ama bunun ötesinde, bir şeyin kalmayacak.

Kod örneği istendi:

Benim hizmet, var:

// Do stuff that alters the content of my local SQLite Database
sendBroadcast(new Intent(RefreshTask.REFRESH_DATA_INTENT));

(RefreshTask.REFRESH_DATA_İNTENT sadece sabit bir Dize.)

Dinleme etkinliği, benim BroadcastReceiver tanımlayın:

private class DataUpdateReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(RefreshTask.REFRESH_DATA_INTENT)) {
          // Do stuff - maybe update my view based on the changed DB contents
        }
    }
}

Sınıfının en üstünde benim alıcı açıklıyorum:

private DataUpdateReceiver dataUpdateReceiver;

Ben eklemek için onResume geçersiz kılma:

if (dataUpdateReceiver == null) dataUpdateReceiver = new DataUpdateReceiver();
IntentFilter intentFilter = new IntentFilter(RefreshTask.REFRESH_DATA_INTENT);
registerReceiver(dataUpdateReceiver, intentFilter);

Ve ben onPause eklemek için geçersiz kılma:

if (dataUpdateReceiver != null) unregisterReceiver(dataUpdateReceiver);

Şimdi benim etkinlik benim hizmet", kendini güncelleme Merhaba." demek için dinliyor Elimden pass veri Niyet yerine güncelleme veritabanı tabloları ve daha sonra geri dönmeyi bulmak değişiklikleri içinde benim etkinlik, ama beri istediğim değişiklikler için ısrar neyse, çok mantıklı geçirmek için veri üzerinden db.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • metallmanutza13

    metallmanutz

    13 NİSAN 2007
  • Michelle Phan

    Michelle Pha

    18 Temmuz 2006
  • Monica Catral

    Monica Catra

    12 NİSAN 2009