概述
上节内容是后台服务,后台服务是app后台默默运行,分为两类,一是后台服务,一是前台服务
- 后台服务,执行用户不会直接注意到的操作,如数据处理,日志清理等,资源不足可能会被系统终止
- 前台服务,执行用户能注意到的操作,必须显示一个Notification,优先级高,系统不容易主动终止它 Android 四大组件,已经完成Activity(活动)与Service(服务)。嘟宝是一个在后台程序常驻程序,但若手机开关机,要随着手机手机重新启动,这就需用到四大组件之一Broadcast Receiver(广播接收器)。
Broadcast Receiver(广播接收器)
Broadcast Receiver监听系统或应用发出的全局广播消息,并做出响应。例如:监听网络变化、电量低、开机完成、接收到短信等。 简单说,它的基本功能就是接收消息。消息来源有两个,
- 一则是系统发出的消息(称为广播),如点亮变化消息、开机消息等;
- 一则是app发出的消息(称为自定义消息)

开机广播
Andorid 系统每次开机,发出一条名为 android.intent.action.BOOT_COMPLETED 的系统级广播。该广播会发送给每个注册了监听的应用程序,app收到该广播后,启动自己的Service(服务),从而轻松实现开机启动。
- 创建广播接收器BootReceiver
- 在AndroidManifest.xml 注册监听开机广播
- 在AndroidManifest.xml 添加开机广播权限
- BootReceiver类中处理开机广播消息
- 手机设置允许app自启动 以上五点内容,必须满足,才能实现自启动。
创建广播接收器BootReceiver
右键点击APP > new > Other > Broadcast Receiver
Android studio默认生成的内容有两部分,一是生成BootReceiver类文件,一是在AndroidManifest文件注册 BootReceiver源码
scala
package com.zilong.dubao;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
throw new UnsupportedOperationException("Not yet implemented");
}
}
AndroidManifest注册内容
ini
<receiver
android:name=".BootReceiver"
android:enabled="true"
android:exported="true">
</receiver>
该操作,简单创建广播接收器,它并未表明接收什么类型的广播,需要我们手动指定接收广播内容。
在AndroidManifest.xml 注册监听开机广播
修改AndroidManifest中receiver内容
ini
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
在AndroidManifest.xml 添加开机广播权限
ini
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.intent.action.BOOT_COMPLETED" />
BootReceiver类中处理开机广播消息
在BootReceiver类中回调函数onReceive,接收开机广播信息,启动前台服务。
csharp
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
Intent i = new Intent(context, MyService.class);
context.startForegroundService(i);
}
}
手机设置允许app自启动
#开机广播详细代码 AndroidManifest.xml内容
ini
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.zilong.dubao">
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.intent.action.BOOT_COMPLETED" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@drawable/fav"
android:label="@string/app_name"
android:roundIcon="@drawable/favround"
android:supportsRtl="true"
android:theme="@style/Theme.DuBao"
tools:targetApi="31">
<receiver
android:name=".BootReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
<service
android:name=".MyService"
android:enabled="true"
android:exported="true" />
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
BootReceiver内容
scala
package com.zilong.dubao;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
Intent i = new Intent(context, MyService.class);
context.startForegroundService(i);
}
}
}
adb模拟系统发送启动广播
通过adb命令,模拟Andorid 手机,发送android.intent.action.BOOT_COMPLETED 的系统级广播。
- adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
- adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -p com.zilong.dubao
- adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -p com.zilong.dubao/.BootReceiver 三个指令分别是向所有程序发送、向嘟宝发送、向嘟宝.BootReceiver发送广播,但都提示失败,原因是权限不足,现今手机基本不允许再发送该条广播给应用用于测试。
