Android手把手编写儿童手机远程监控App之广播开机自启动

概述

上节内容是后台服务,后台服务是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发送广播,但都提示失败,原因是权限不足,现今手机基本不允许再发送该条广播给应用用于测试。
相关推荐
su_ym81102 小时前
Android SELinux
android·selinux
阿巴斯甜2 小时前
Android中项目架构:
android
程序员陆业聪4 小时前
线上监控与防劣化:让启动优化成果不再回退 | Android启动优化系列(五·完结)
android
程序员陆业聪4 小时前
首帧渲染优化:从白屏到内容可见的最后一公里
android
AI玫瑰助手4 小时前
Python基础:字符串的常用内置方法(查找替换分割)
android·开发语言·python
xiangxiongfly9155 小时前
Android 使用WebSocket通信
android·websocket·网络协议·okhttp
su_ym81106 小时前
Android属性系统
android·framework·property
明天就是Friday6 小时前
Android实战项目③ Room+Clean Architecture开发待办事项App 完整源码详解
android
没有了遇见6 小时前
《彻底搞懂 ViewModel:作用、原理与源码分析》
android