启动时Android BroadcastReceiver - 当Activity在Background中时继续运行

时间:2011-03-13 14:56:05

标签: android broadcastreceiver

我正在监控收到的短信。

我的应用与BroadcastReceiver完美配合。但是它正在从一个Activity开始工作,并希望BroadcastReceiver始终保持运行(而不仅仅是在我的Activity运行时)。

我怎样才能做到这一点?我查看了BroadcastReceiver的生命周期,但文档中提到的所有内容都是生命周期仅限于onReceive方法,而不是保持BroadcastReceiver检查的生命周期来电短信。

我怎样才能坚持这个?

由于

5 个答案:

答案 0 :(得分:139)

您需要在清单中使用操作名称 android.intent.action.BOOT_COMPLETED 定义接收器

<!-- Start the Service if applicable on boot -->
<receiver android:name="com.prac.test.ServiceStarter">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

确保还包括已完成的启动权限。

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

使用Service 来保持任何效果。如果系统启动,则使用接收器接收Boot Up事件以重新启动服务..

启动时启动服务的代码。 Make Service负责检查短信或任何你想要的东西。你需要在MyPersistingService中定义自己的工作。

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class ServiceStarter extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent i = new Intent("com.prac.test.MyPersistingService");
        i.setClass(context, MyPersistingService.class);
        context.startService(i);
    }
}

答案 1 :(得分:7)

服务或引导已完成不是强制性的

事实上,您无需实施Service或注册android.intent.action.BOOT_COMPLETED

一些示例显示了在创建和销毁活动时如何注册/取消注册BroadcastReceiver。但是,这对于仅在打开应用程序时期望的意图(例如,用于Service / Activity之间的内部通信)非常有用。

但是,如果是短信,您希望始终收听意图(而不仅仅是在打开应用时)。

还有另一种方式

您可以创建class扩展BroadcastReceiver并通过AndroidManifest.xml注册到所需的意图。这样,BroadcastReceiver将独立于您的活动(并且不会依赖于活动的生命周期)

这样,即使您的应用已关闭,只要短信到达,您的BroadcastReceiver会自动通知。

<强>的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest>
    ...
    <uses-permission android:name="android.permission.READ_SMS"/>
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>

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

<强> MyCustomBroadcastReceiver.java

public class MyCustomBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent != null) {
            String action = intent.getAction();
            if(action != null) {
                if(action.equals("android.provider.Telephony.SMS_RECEIVED")) {
                    // DO YOUR STUFF
                } else if (action.equals("ANOTHER ACTION")) {
                    // DO ANOTHER STUFF
                }
            }
        }
    }
}

备注

您可以将其他意图过滤器添加到AndroidManifest,并在同一BroadcastReceiver中处理所有这些过滤器。

仅在执行长任务时启动服务。您只需要显示通知或更新某个数据库,只需使用上面的代码即可。

答案 2 :(得分:1)

在清单中添加广播接收者:

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

创建类BootReciever.java

public class BootReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent intent) {
       if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){

           // +++ Do Operation Here +++

       }
   }
}

答案 3 :(得分:0)

@Javanator旁边,我想提供一个(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)的Android版本保护套。就我而言,这适用于Android SDK 29(10)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
      context.startForegroundService(new Intent(context,FloatingWindow.class));
} else {
      context.startService(new Intent(context, FloatingWindow.class));
  }

答案 4 :(得分:0)

使用此代码,并还要提及清单中的广播:

// How bikes are shown
for s in fietshare.stands {
   lbAvailable.text = "Available Bikes: " + String(s.bikes.count) 
   nrOfAvailable.text =  String(b.distance) + "M"
}