在后台运行BroadcastReceiver作为服务并在启动后自动启动

3
我对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

获取短信广播可以正常工作,但我不确定接下来该怎么做。

非常感谢任何帮助 :)

谢谢。


你知道在 Android 中, "Service" 和 Windows 中的 "Service" 不是同一种东西,对吧?不停地运行 Service 会消耗电池。也许你需要的是 IntentService,在处理所有待处理意图(例如广播接收器发送的意图)后自动停止。 - Fildor
是的,如果我正确理解概念,它会消耗电池。但我正在寻找如何持续从BroadcastReceiver获取短信的解决方案。 :) - olealgo
如果我没记错的话,系统会调用你的BroadCastReceiver。不需要服务。请有人纠正我或确认这一点,因为我不再百分之百确定了。 - Fildor
也许这个能有所帮助:http://stackoverflow.com/a/4421600/982149 - Fildor
@user2354810 如果 (android.intent.action.BOOT_COMPLETED.equals(action)) 这行代码对我来说会抛出错误,android.intent 无法解析,为什么会出现这个错误? - Karthick M
显示剩余6条评论
1个回答

1

为了在设备启动完成事件(BOOT_COMPLETED)时启动您的服务,并持续接收短信意图。

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意图上是不必要的。IntentService会完成工作。因此,上述两个代码片段是不必要的。只需最后一个片段即可完成工作。


那太棒了。你的意思是我根本不需要实例化任何BroadcastReceivers或Services,只需使用IntentService来处理BOOT_COMPLETED和SMS_RECEIVED?(顺便问一下,IntentService会显示为正在运行的服务吗?)感谢您的所有帮助,我会尝试并告诉您它对我有什么作用 :) - olealgo
如果(android.intent.action.BOOT_COMPLETED.equals(action))这行代码对我来说会抛出错误,android.intent无法解析,为什么会出现这个错误 @mopurizwarriors - Karthick M
如果(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)),这段代码对于任何遇到错误的人都很有用。 - Karthick M
@mopurizwarriors 你能看一下这个链接吗?https://dev59.com/OXnZa4cB1Zd3GeqPvd10 - Karthick M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接