Câu hỏi Broadcast Receiver trong một dịch vụ


Tôi đang cố bắt đầu một BroadcastReceiver trong một Service. Những gì tôi đang cố gắng làm là chạy nền service sẽ 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 service chạy mà kết hợp một máy thu phát sóng có thể danh mục hoặc.

Làm thế nào để tôi đi về việc này? Tôi đã có dịch vụ của tôi và chạy.


76
2018-02-01 07:10


gốc




Các câu trả lời:


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 onCreate làm cái 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 tốt để tiếp tục phát sóng cho những bộ lọc mà bạn đề cập đến onCreate. Đảm bảo thêm bất kỳ quyền nào nếu cần. ví dụ:

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

112
2018-02-01 07:23



tôi muốn hiển thị tin nhắn bánh mì nướng trong khi cuộc gọi đến. tôi đã thêm bộ lọc này.addAction ("android.provider.Telephony.LISTEN_CALL_STATE"); sau đó làm thế nào để làm cho thấy bánh mì nướng. - Prasad
Tôi nhận thấy tôi không thể vượt qua dữ liệu bởi intent.setData (myUri) trong khi gửi sendBroadcas (intent) và braoadcastReceiver không hoạt động trong trường hợp đó, phải không? - deadfish
Tôi ít nhầm lẫn về vòng đời dịch vụ khi nó có BroadcastReceiver (trong trường hợp của tôi tải BroadcastReceiver) - Android Man
@waqaslam Bạn đã đặt BroadcastReceiver này trong Tệp kê khai của mình chưa? - Igor Ganapolsky
@IgorGanapolsky Không, bạn không cần phải đăng ký những người nhận như vậy trong tệp kê khai. - waqaslam


Mô hình tốt hơn là tạo 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ù có hay không Service đang chạy. Trong thực tế, việc sử dụng mẫu này có thể loại bỏ nhu cầu chạy liên tục Service hoàn toàn.

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

Ví dụ:

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

Khi người nhận chạy, bạn chỉ cần vượt qua Intent (Bundle) đến Servicevà trả lờ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();
    }   
}

23
2018-02-01 07:29



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 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ó để việc tiếp nhận bộ phát sóng tắt dịch vụ. - Utopia025
Việc triển khai này sẽ bắt đầu Service nếu nó chưa chạy, hoặc vượt qua một Intent nếu nó là (để truy xuất 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 tính năng lập trình Receiver thành phần thông qua PackageManager'S setComponentEnabledSetting(). - Paul Burke
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 Receiver sống khi Service đang chạy. - Paul Burke
Nếu bạn không có Hoạt động, nó sẽ không hoạt động đối với API 3.1 trở lên: ashimita.blogspot.com.tr/2012/04/… - elif
Kể từ Android 3.1, hệ thống Android loại trừ tất cả người nhận nhận được ý định theo mặc định nếu ứng dụng tương ứng chưa bao giờ được người dùng bắt đầu hoặc nếu người dùng dừng ứng dụng một cách rõ ràng thông qua menu Android. vogella.com/tutorials/AndroidBroadcastReceiver/article.html - Juraj Petrik