เครื่องรับสัญญาณภายในบริการ


90

ฉันกำลังพยายามเริ่มต้นBroadcastReceiverภายในไฟล์Service. สิ่งที่ฉันพยายามทำคือมีพื้นหลังที่กำลังทำงานserviceซึ่งรวบรวมข้อความขาเข้าและบันทึกการโทรเข้า ฉันคิดว่าวิธีที่ดีที่สุดในการดำเนินการนี้คือการserviceวิ่งที่มีเครื่องรับสัญญาณออกอากาศที่สามารถแคตตาล็อกได้

ฉันจะทำสิ่งนี้ได้อย่างไร? ฉันมีบริการของฉันอยู่แล้ว

คำตอบ:


127

เมื่อบริการของคุณได้รับการตั้งค่าแล้วเพียงเพิ่มเครื่องรับสัญญาณในบริการของคุณ:

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
      }     
   }
};

ในบริการของคุณให้onCreateทำสิ่งนี้:

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);

และในบริการของคุณonDestroy:

unregisterReceiver(receiver);

onCreateและคุณจะดีไปจะได้รับการออกอากาศสำหรับสิ่งที่เคยกรองที่คุณกล่าวถึงใน อย่าลืมเพิ่มสิทธิ์หากจำเป็น เช่น

<uses-permission android:name="android.permission.RECEIVE_SMS" />

ฉันสังเกตเห็นว่าฉันไม่สามารถส่งผ่านข้อมูลด้วยความตั้งใจ setData (myUri) ในขณะที่ส่ง sendBroadcas (ความตั้งใจ) และ braoadcastReceiver ไม่ทำงานในกรณีนั้นใช่ไหม
deadfish

ฉันสับสนเล็กน้อยเกี่ยวกับวงจรชีวิตการให้บริการเมื่อมี BroadcastReceiver (ในกรณีของฉันดาวน์โหลด BroadcastReceiver)
Kamran Majeed

1
@waqaslam คุณตั้ง BroadcastReceiver นี้ในรายการของคุณหรือไม่?
IgorGanapolsky

2
@IgorGanapolsky ไม่คุณไม่จำเป็นต้องลงทะเบียนเครื่องรับดังกล่าวในไฟล์ Manifest
waqaslam

2
@SayyedRizwan บริการและ BroadcastReceiver ของคุณจะทำงานภายใต้กระบวนการเดียวกันและส่วนใหญ่อาจเป็นเธรดเดียวกัน (เว้นแต่คุณจะสร้างใหม่) การใช้แบตเตอรี่ขึ้นอยู่กับว่าคุณกำหนดเธรดของคุณอย่างไร (พื้นหลัง / เบื้องหน้า) และปริมาณการออกอากาศที่เข้ามา
waqaslam

25

BroadcastReceiverรูปแบบที่ดีกว่าคือการสร้างแบบสแตนด์อโลน สิ่งนี้ช่วยให้มั่นใจได้ว่าแอปของคุณสามารถตอบสนองต่อการแพร่ภาพไม่ว่าแอปServiceจะทำงานอยู่หรือไม่ก็ตาม ในความเป็นจริงการใช้รูปแบบนี้อาจขจัดความจำเป็นในการทำงานอย่างต่อเนื่องServiceโดยสิ้นเชิง

ลงทะเบียนBroadcastReceiverในไฟล์ Manifest ของคุณและสร้างคลาส / ไฟล์แยกต่างหาก

เช่น:

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

เมื่อรับวิ่งคุณก็ผ่านการIntent( Bundle) การและตอบสนองต่อมันในServiceonStartCommand()

เช่น:

public class FooReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do your work quickly!
        // then call context.startService();
    }   
}

6
ฉันต้องการให้การออกอากาศอยู่ในวงจรชีวิตของบริการเพื่อให้แอปค้นหาข้อความ / โทรศัพท์ตามช่วงเวลาให้บริการเท่านั้น วิธีนี้เปิดใช้งานหรือไม่ ดูเหมือนว่าคุณได้ตั้งค่าไว้ดังนั้นการรับการถ่ายทอดจึงปิดการให้บริการ
Utopia025

การใช้งานนี้จะเริ่มต้นในServiceกรณีที่ยังไม่ได้ทำงานอยู่หรือส่งผ่านใหม่Intentหากเป็นเช่นนั้น (สำหรับการดึงข้อมูลonStartCommand) ถ้าคุณเพียงต้องการให้ทำงานเมื่อServiceนั้นคุณโปรแกรมสามารถเปิด / ปิดการใช้งานReceiverส่วนประกอบที่ผ่านมาPackageManager setComponentEnabledSetting()
Paul Burke

4
คำตอบของ Waqas อาจเป็นตัวเลือกที่ดีที่สุดของคุณหากคุณต้องการให้Receiverมีชีวิตอยู่เมื่อServiceกำลังดำเนินอยู่
Paul Burke

3
หากคุณไม่มีกิจกรรมจะใช้ไม่ได้กับ API 3.1 ขึ้นไป: ashimita.blogspot.com.tr/2012/04/…
elif

1
สำหรับ Android 3.1 ระบบ Android จะไม่รวมตัวรับสัญญาณทั้งหมดจากการรับ Intent ตามค่าเริ่มต้นหากผู้ใช้ไม่เคยเริ่มต้นแอปพลิเคชันที่เกี่ยวข้องหรือหากผู้ใช้หยุดแอปพลิเคชันโดยชัดแจ้งผ่านเมนู Android vogella.com/tutorials/AndroidBroadcastReceiver/article.html
Juraj Petrik
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.