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

Ras*_*art 51 android broadcastreceiver

我正在监控收到的短信.

我的应用程序与a完美配合BroadcastReceiver.但它是从一个Activity开始工作,并希望一直保持BroadcastReceiver运行(而不仅仅是我的Activity运行时).

我怎样才能做到这一点?我已经查看了生命周期,BroadcastReceiver但文档中提到的所有内容都是生命周期仅限于onReceive方法,而不是保持BroadcastReceiver检查传入SMS 的生命周期.

我怎么能坚持这个?

谢谢

Jav*_*tor 145

您需要在清单中使用操作名称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>
Run Code Online (Sandbox Code Playgroud)

确保还包括已完成的引导权限.

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

使用服务可以使任何事情持续存在.如果系统启动,则使用接收器接收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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您可能还需要确保在应用清单文件中定义了"RECEIVE_BOOT_COMPLETED"权限才能使其生效. (14认同)
  • 同样重要的是要注意,如果您的应用程序安装到内部存储器,您将只接收启动完成广播,如果允许在外部存储器上,则不会获得广播.如果您的应用程序获得启动接收广播至关重要,您可能需要考虑仅允许内部安装.http://developer.android.com/guide/topics/data/install-location.html (13认同)

W0r*_*0le 7

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

实际上,您不需要实现Service或注册android.intent.action.BOOT_COMPLETED

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

但是,如果是SMS,您希望始终收听意图(而不仅仅是在打开应用程序时).

还有另一种方式

您可以创建一个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>
Run Code Online (Sandbox Code Playgroud)

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

笔记

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

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