Saya memiliki layanan yang selalu memeriksa tugas baru. Jika ada tugas baru, saya ingin menyegarkan UI aktivitas untuk menampilkan info itu. Saya menemukan https://github.com/commonsguy/cw-andtutorials/tree/master/18-LocalService/ contoh ini. Apakah itu pendekatan yang bagus? Ada contoh lain?
Terima kasih.
Jawaban:
Lihat di bawah untuk jawaban asli saya - pola itu telah bekerja dengan baik, tetapi baru-baru ini saya mulai menggunakan pendekatan yang berbeda untuk komunikasi Layanan / Aktivitas:
Gunakan RxJava untuk menjalankan operasi asinkron.
Jika Layanan perlu melanjutkan operasi latar belakang meskipun tidak ada Aktivitas yang berjalan, mulai juga layanan dari kelas Aplikasi sehingga tidak dihentikan saat tidak terikat.
Keuntungan yang saya temukan dalam pendekatan ini dibandingkan dengan teknik startService () / LocalBroadcast adalah
Beberapa kode contoh. Pertama layanannya:
Dan Aktivitas yang mengikat ke layanan dan menerima pembaruan ketinggian tekanan:
Tata letak untuk Aktivitas ini adalah:
Jika layanan perlu dijalankan di latar belakang tanpa Aktivitas terikat, layanan dapat dimulai dari kelas Aplikasi juga dalam
OnCreate()
penggunaanContext#startService()
.Jawaban Asli Saya (dari 2013):
Dalam layanan Anda: (menggunakan COPA sebagai layanan pada contoh di bawah).
Gunakan LocalBroadCastManager. Di layanan onCreate Anda, siapkan penyiar:
Saat Anda ingin memberi tahu UI tentang sesuatu:
Dalam Aktivitas Anda:
Buat pendengar di onCreate:
dan daftarkan di onStart:
sumber
onStart()
atau AndaonResume()
. Secara umum, jika Aktivitas meminta Layanan untuk melakukan sesuatu, tetapi berhenti sebelum menerima hasilnya, masuk akal untuk menganggap hasilnya tidak lagi diperlukan. Demikian pula saat memulai Aktivitas, harus diasumsikan bahwa tidak ada permintaan yang belum diproses oleh Layanan.bagi saya solusi paling sederhana adalah mengirim siaran, dalam aktivitas oncreate saya mendaftar dan mendefinisikan siaran seperti ini (updateUIReciver didefinisikan sebagai instance kelas):
Dan dari layanan Anda mengirimkan maksud seperti ini:
jangan lupa untuk membatalkan registrasi pemulihan dalam aktivitas di penghancuran:
sumber
Saya akan menggunakan layanan terikat untuk melakukan itu dan berkomunikasi dengannya dengan menerapkan pendengar dalam aktivitas saya. Jadi, jika aplikasi Anda mengimplementasikan myServiceListener, Anda bisa mendaftarkannya sebagai listener di layanan Anda setelah Anda terikat dengannya, panggil listener.onUpdateUI dari layanan terikat Anda dan perbarui UI Anda di sana!
sumber
Saya akan merekomendasikan untuk memeriksa Otto , EventBus yang dirancang khusus untuk Android. Aktivitas / UI Anda dapat memantau peristiwa yang diposting di Bus dari Layanan, dan memisahkan dirinya dari backend.
sumber
Solusi Clyde berfungsi, tetapi ini adalah siaran, yang saya cukup yakin akan kurang efisien daripada memanggil metode secara langsung. Saya bisa saja salah, tapi menurut saya siarannya lebih ditujukan untuk komunikasi antar aplikasi.
Saya berasumsi Anda sudah tahu cara mengikat layanan dengan Aktivitas. Saya melakukan sesuatu seperti kode di bawah ini untuk menangani masalah semacam ini:
Saya meninggalkan sedikit untuk keamanan benang, yang penting. Pastikan untuk menggunakan kunci atau semacamnya saat memeriksa dan menggunakan atau mengubah referensi fragmen pada layanan.
sumber
sumber
Solusi saya mungkin bukan yang terbersih tetapi seharusnya bekerja tanpa masalah. Logikanya sederhana untuk membuat variabel statis untuk menyimpan data Anda di
Service
dan memperbarui tampilan Anda setiap detik diActivity
.Katakanlah Anda memiliki
String
pada AndaService
yang ingin Anda kirimkan keTextView
pada AndaActivity
. Seharusnya terlihat seperti iniLayanan Anda:
Aktivitas Anda:
sumber
android
ya, jika itu adalah daftar, coba buat adaptor atau pertahankan data menggunakan sqllite / realm db.