Bộ thu phát sóng trong một dịch vụ


90

Tôi đang cố gắng bắt đầu một BroadcastReceivertrong một Service. Những gì tôi đang cố gắng làm là chạy nền serviceđể thu thập các tin nhắn văn bản đến và ghi lại các cuộc gọi điện thoại đến. Tôi đã tìm ra cách tốt nhất để giải quyết vấn đề này là có một servicebộ chạy kết hợp bộ thu phát sóng có thể lập danh mục.

Làm thế nào để tôi làm điều này? Tôi đã thiết lập và chạy dịch vụ của mình.

Câu trả lời:


127

vì dịch vụ của bạn đã được thiết lập, chỉ cần thêm bộ thu phát sóng vào dịch vụ của bạn:

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

trong dịch vụ của bạn, onCreatehãy làm điều này:

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

và trong dịch vụ của bạn onDestroy:

unregisterReceiver(receiver);

và bạn có thể đi nhận chương trình phát sóng cho những gì bạn từng đề cập đến trong bộ lọc onCreate. Đảm bảo thêm bất kỳ quyền nào nếu được yêu cầu. ví dụ

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

Ive nhận thấy rằng tôi không thể chuyển dữ liệu theo ý định.setData (myUri) trong khi gửi sendBroadcas (ý định) và braoadcastReceiver không hoạt động trong trường hợp đó, có đúng không?
deadfish

Tôi hơi nhầm lẫn về vòng đời của dịch vụ khi nó có BroadcastReceiver (trong trường hợp của tôi là tải xuống BroadcastReceiver)
Android Man

1
@waqaslam Bạn đã đặt BroadcastReceiver này trong Tệp kê khai của mình chưa?
IgorGanapolsky

2
@IgorGanapolsky Không, bạn không cần đăng ký các bộ thu như vậy trong tệp kê khai.
waqaslam

2
@SayyedRizwan Dịch vụ của bạn và BroadcastReceiver sẽ chạy theo cùng một quy trình và hầu hết có thể là cùng một luồng (trừ khi bạn tạo một luồng mới). Pin tiêu thụ phụ thuộc vào cách bạn đã xác định chủ đề của bạn (background / foreground) và số lượng chương trình phát sóng tới ở.
waqaslam

24

Mô hình tốt hơn là tạo ra một độc lập BroadcastReceiver. Điều này đảm bảo rằng ứng dụng của bạn có thể phản hồi chương trình phát sóng, cho dù chương trình Serviceđang chạy hay không . Trên thực tế, việc sử dụng mô hình này có thể loại bỏ hoàn toàn nhu cầu chạy liên tục Service.

Đăng ký BroadcastReceivertrong Tệp kê khai của bạn và tạo một lớp / tệp riêng cho nó.

Ví dụ:

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

Khi bộ thu chạy, bạn chỉ cần chuyển một Intent( Bundle) tới Servicevà phản hồi nó trong onStartCommand().

Ví dụ:

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

6
Tôi muốn chương trình phát sóng nằm trong vòng đời của dịch vụ để ứng dụng chỉ truy vấn tin nhắn / cuộc gọi điện thoại theo dòng thời gian dịch vụ. Phương pháp này có cho phép điều đó không? có vẻ như bạn đã thiết lập nó nên việc nhận chương trình phát sóng sẽ tắt dịch vụ.
Utopia025

Việc triển khai này sẽ bắt đầu Servicenếu nó chưa chạy hoặc chuyển một mới Intentnếu nó đang chạy (để truy xuất trong onStartCommand). Nếu bạn chỉ muốn nó chạy khi Serviceđang hoạt động, bạn có thể bật / tắt Receiverthành phần theo chương trình thông qua PackageManager's setComponentEnabledSetting().
Paul Burke

4
Câu trả lời của Waqas có thể là lựa chọn tốt nhất của bạn, nếu bạn chỉ muốn cái Receivercòn sống khi Servicenó đang chạy.
Paul Burke

3
Nếu bạn không có một hoạt động, nó sẽ không làm việc cho API 3.1 và cao hơn: ashimita.blogspot.com.tr/2012/04/...
elif

1
Kể từ Android 3.1, theo mặc định, hệ thống Android loại trừ tất cả người nhận nhận ý định nếu ứng dụng tương ứng chưa bao giờ được khởi động bởi người dùng hoặc nếu người dùng đã dừng ứng dụng một cách rõ ràng qua menu Android. vogella.com/tutorials/AndroidBroadcastReceiver/article.html
Juraj Petrik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.