服务中的广播接收器

Uto*_*025 86 sms android broadcastreceiver android-service

我想在一个BroadcastReceiver内部启动Service.我想要做的是有一个后台运行service,收集传入的短信,并记录来电.我认为最好的解决方法是service运行一个包含可以编目的广播接收器.

我该怎么做呢?我已经启动并运行了我的服务.

waq*_*lam 120

由于您的服务已经设置,只需在您的服务中添加广播接收器:

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
      }     
   }
};
Run Code Online (Sandbox Code Playgroud)

在你的服务中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);
Run Code Online (Sandbox Code Playgroud)

在你的服务中onDestroy:

unregisterReceiver(receiver);
Run Code Online (Sandbox Code Playgroud)

而且你很高兴能够接收你提到过的过滤广播onCreate.如果需要,请务必添加任何权限.例如

<uses-permission android:name="android.permission.RECEIVE_SMS" />
Run Code Online (Sandbox Code Playgroud)

  • @waqaslam 你在清单中设置了这个 BroadcastReceiver 吗? (2认同)
  • @IgorGanapolsky不,你不需要在清单中注册这样的接收器. (2认同)
  • @SayyedRizwan您的服务和BroadcastReceiver将在同一进程和很可能同一线程下运行(除非您创建一个新线程)。电池消耗取决于您如何定义线程(后台/前台)以及传入的广播量。 (2认同)

Pau*_*rke 23

更好的模式是创建一个独立的模式BroadcastReceiver.这可以确保您的应用可以响应广播,无论广播是否Service正在运行.实际上,使用这种模式可以Service完全不需要持续运行.

BroadcastReceiver在Manifest中注册,并为其创建单独的类/文件.

例如:

<receiver android:name=".FooReceiver" >
    <intent-filter >
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

当接收器运行时,你只需将一个Intent(Bundle)传递给Service,并在其中响应onStartCommand().

例如:

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

  • 我希望广播在服务的生命周期内,以便应用程序仅根据服务时间线查询消息/电话.这个方法能实现吗?它看起来像你已经设置好,所以广播的接收引发了服务. (5认同)
  • Waqas的答案可能是你最好的选择,如果你只想在`Service`运行时`Receiver`存活. (4认同)
  • 如果您没有活动,则不适用于API 3.1及更高版本:http://ashimita.blogspot.com.tr/2012/04/broadcast-receiver-change-in-flow-since.html (3认同)
  • 从 Android 3.1 开始,如果用户从未启动过相应的应用程序或者用户通过 Android 菜单显式停止该应用程序,Android 系统默认会排除所有接收者接收 Intent。http://www.vogella.com/tutorials/AndroidBroadcastReceiver/article.html (2认同)