Penerima Siaran dalam Layanan

90

Saya mencoba memulai BroadcastReceiverdalam a Service. Apa yang saya coba lakukan adalah menjalankan latar belakang serviceyang mengumpulkan pesan teks masuk, dan mencatat panggilan telepon masuk. Saya pikir cara terbaik untuk melakukannya adalah dengan servicemenjalankan yang menggabungkan penerima siaran yang dapat membuat katalog juga.

Bagaimana cara saya melakukan ini? Saya sudah menyiapkan dan menjalankan layanan saya.

Utopia025
sumber

Jawaban:

127

karena layanan Anda sudah disiapkan, cukup tambahkan penerima siaran di layanan Anda:

private final BroadcastReceiver receiver = new BroadcastReceiver() {
   @Override
   public void onReceive(Context context, Intent intent) {
      String action = intent.getAction();
      if(action.equals("android.provider.Telephony.SMS_RECEIVED")){
        //action for sms received
      }
      else if(action.equals(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED)){
           //action for phone state changed
      }     
   }
};

dalam layanan Anda onCreatelakukan ini:

IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
filter.addAction(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED);
filter.addAction("your_action_strings"); //further more
filter.addAction("your_action_strings"); //further more

registerReceiver(receiver, filter);

dan di layanan Anda onDestroy:

unregisterReceiver(receiver);

dan Anda siap menerima siaran untuk filter apa pun yang Anda sebutkan onCreate. Pastikan untuk menambahkan izin jika diperlukan. untuk mis

<uses-permission android:name="android.permission.RECEIVE_SMS" />
waqaslam
sumber
Saya perhatikan bahwa saya tidak dapat meneruskan data dengan maksud.setData (myUri) saat mengirim sendBroadcas (maksud) dan braoadcastReceiver tidak berfungsi dalam kasus itu, bukan?
ikan mati
Saya sedikit bingung tentang siklus hidup layanan ketika memiliki BroadcastReceiver (dalam kasus saya, unduh BroadcastReceiver)
Android Man
1
@waqaslam Apakah Anda menyetel BroadcastReceiver ini di Manifes Anda?
IgorGanapolsky
2
@IgorGanapolsky Tidak, Anda tidak perlu mendaftarkan penerima seperti itu dalam manifes.
waqaslam
2
@SayyedRizwan Layanan dan BroadcastReceiver Anda akan berjalan dalam proses yang sama dan kemungkinan besar utas yang sama (kecuali Anda membuat yang baru). Konsumsi baterai tergantung pada bagaimana Anda menentukan utas Anda (latar belakang / Latar depan) dan jumlah siaran yang masuk.
waqaslam
25

Pola yang lebih baik adalah dengan membuat standalone BroadcastReceiver. Ini memastikan bahwa aplikasi Anda dapat merespons siaran, baik Servicesedang berjalan atau tidak . Faktanya, menggunakan pola ini dapat menghilangkan kebutuhan untuk menjalankan secara konstan Servicesama sekali.

Daftarkan BroadcastReceiverdalam Manifes Anda, dan buat kelas / file terpisah untuk itu.

Misalnya:

<receiver android:name=".FooReceiver" >
    <intent-filter >
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

Saat penerima berjalan, Anda cukup meneruskan Intent( Bundle) ke Service, dan menanggapinya dionStartCommand() .

Misalnya:

public class FooReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do your work quickly!
        // then call context.startService();
    }   
}
Paul Burke
sumber
6
Saya ingin siaran berada dalam siklus hidup layanan, sehingga aplikasi hanya menanyakan pesan / panggilan telepon sesuai dengan garis waktu layanan. Apakah metode ini memungkinkannya? sepertinya Anda telah mengaturnya sehingga penerimaan siaran mengaktifkan layanan.
Utopia025
Implementasi ini akan memulai Servicejika belum berjalan, atau meneruskan yang baru Intentjika sudah (untuk pengambilan onStartCommand). Jika Anda hanya ingin menjalankannya saat Servicesiaran langsung, Anda dapat mengaktifkan / menonaktifkan Receiverkomponen secara terprogram melalui PackageManagers setComponentEnabledSetting().
Paul Burke
4
Jawaban waqas mungkin pilihan terbaik Anda, jika Anda hanya menginginkan yang Receiverhidup saat Servicesedang berjalan.
Paul Burke
3
Jika Anda tidak memiliki Aktivitas, itu tidak akan berfungsi untuk API 3.1 dan yang lebih tinggi: ashimita.blogspot.com.tr/2012/04/…
elif
1
Mulai Android 3.1, sistem Android mengecualikan semua penerima dari menerima maksud secara default jika aplikasi terkait belum pernah dimulai oleh pengguna atau jika pengguna secara eksplisit menghentikan aplikasi melalui menu Android. vogella.com/tutorials/AndroidBroadcastReceiver/article.html
Juraj Petrik