【问题标题】:Have BroadcastReceiver run as Service in the background + Auto Start after boot让 BroadcastReceiver 在后台作为服务运行 + 启动后自动启动
【发布时间】:2014-10-18 18:09:00
【问题描述】:

总的来说,我对 Android 和编程非常陌生,所以我正在玩不同的游戏 在 stackoverflow 上收集的教程和信息。

我想要完成的是让带有我的 SMS BroadcastReceiver 的应用程序作为服务运行,这样当应用程序在后台时我可以获取所有 SMS 广播。

另外,如何添加一个 BroadcastReceiver 来接收 BOOT_COMPLETED 的广播并自动启动应用程序?

我需要几项服务,还是一项服务就足够了? (用于连续检测 SMS + BOOT_COMPLETED)

目前我已经创建了一个用于获取 SMS 的 BroadcastReceiver,如下所示;

public class SMS extends BroadcastReceiver {

   @Override
   public void onReceive(Context context, Intent intent) {
   .. etc ..
   .. etc ..
}

我的 AndroidManifest.xml 文件具有接收器和意图过滤器 补充android.provider.Telephony.SMS_RECEIVED

获取 SMS 广播工作正常,但我不知道从哪里开始。

非常感谢所有帮助:)

谢谢。

【问题讨论】:

  • 您知道在 Android 中,“服务”与 Windows 中的“服务”相同,对吧?运行服务不断消耗电池。也许您想要的是一个 IntentService,它在处理所有发送给它的待处理 Intent(例如通过您的广播接收器)后自行停止。
  • 是的,如果我正确理解这个概念,它会消耗电池。但我正在寻找如何从广播接收器连续获取短信的解决方案。 :)
  • 如果我没记错的话,系统会调用你的广播接收器。无需服务。请有人纠正我或确认这一点,因为我不再 100% 确定。
  • 所以不需要Service启动就可以持续运行?如果是这样,那就太好了。但我见过其他的广播接收器,比如 BOOT_COMPLETED 和传入/传出电话号码,它们都是由服务运行的?
  • 问题是:您可以动态注册接收器,也可以通过清单注册。取决于所需的行为。例如,如果您想在您的应用程序中接收 wifi 连接广播,您将在 onResume 中注册并在 onPause 中取消注册。在其他情况下,让一个服务能够在应用程序处于后台时接收它可能是明智的......

标签: android service broadcastreceiver


【解决方案1】:

在 BOOT_COMPLETED 事件上启动您的服务并持续接收 SMS 意图。

AndroidManifest.xml

<receiver android:name="BootReceiver" >
   <intent-filter>
   <action android:name="android.intent.action.BOOT_COMPLETED" />
   </intent-filter>
</receiver>

BootReceiver.java

public class BootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent service = new Intent(context, SMSService.class);
        context.startService(service);
  }
}

SMSService.java

public class SMSService extends IntentService {
    @Override
    protected void onHandleIntent(Intent intent) {
         String action = intent.getAction();
         if (Intent.BOOT_COMPLETED.equals(action)) {
             //write your code to process BOOT_COMPLETED intent here
         }
         else if(Intent.SMS_RECEIVED.equals(action)) {
             //Write your code for processing SMS intent here
         }
    }
}

正如Fildor 所指出的,没有必要在 BOOT_COMPLETED 意图上启动服务。 InentService 会做这项工作。所以,上面两个代码 sn-ps 不是必需的。只需最后一个 sn-p 即可完成工作。

【讨论】:

  • 那太棒了。您的意思是我根本不需要实例化任何 BroadcastReceivers 或 Services,只需将 IntentService 用于 BOOT_COMPLETED 和 SMS_RECEIVED ? (顺便说一句,IntentService 是否显示为正在运行的服务?)感谢所有帮助,将尝试一下,让您知道它是如何为我工作的 :)
  • if (android.intent.action.BOOT_COMPLETED.equals(action)) 这行对我抛出错误,android.intent 无法解决为什么会出现这个错误@mopurizwarriors
  • if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) 如果有人出错,此代码很有用
  • @mopurizwarriors stackoverflow.com/questions/20374238/…你能看到这个
猜你喜欢
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 2019-11-24
  • 1970-01-01
  • 2016-04-18
  • 1970-01-01
  • 2013-05-31
相关资源
最近更新 更多