AronWOng
AronWOng
  • 发布:2016-06-17 17:00
  • 更新:2022-10-24 16:57
  • 阅读:18844

Android开机自启应用

分类:5+ SDK

问题场景

最近开发一个展示类应用项目,展示设备为若干个24小时运行的Android广告机。考虑到停电的情况该应用需要开机自启动

背景知识

  • 当Android启动时,会发出一个系统广播,内容为ACTION_BOOT_COMPLETED,它的字符串常量表示为 android.intent.action.BOOT_COMPLETED。

  • android开发中的基本概念:Activity。Activity简单的理解为android的视图,承载着android的人机交互。一个应用程序可以有多个Activity,其中有一个Activity为应用程序启动时最先启动的。 该Activity在AndroidManifest.xml中的具体形式如下。intent-filter中两项android.intent.action.MAIN android.intent.category.LAUNCHER表示该activity为应用程序启动主界面。

    <activity android:name=".MainActivity" android:label="@string/app_name">  
    <intent-filter>  
        <action android:name="android.intent.action.MAIN" />  
        <category android:name="android.intent.category.LAUNCHER" />  
    </intent-filter>  
    </activity>

到这里解决问题的思路就完整了,我们监听ACTION_BOOT_COMPLETED广播,并在监听逻辑中启动应用的对应的Main Activity

前提条件

由于我们需要自己写广播接收逻辑,所以应用的打包只能采用“离线打包”,这样我们才能调用android原生的api。

示例

  • 本地离线打包项目导入,环境配置。(略,请参考 Android离线打包

  • AndroidMainfest.xml中添加开机启动权限

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
  • 创建一个广播接收类

package io.dcloud.yourapp;  
import android.content.BroadcastReceiver;  
import android.content.Context;  
import android.content.Intent;  
import io.dcloud.PandoraEntry;  

public class BootBroadcastReceiver extends BroadcastReceiver {  

    static final String action_boot="android.intent.action.BOOT_COMPLETED";  

    @Override  
    public void onReceive(Context context, Intent intent) {  

        if (intent.getAction().equals(action_boot)){  

            // 注意H5+SDK的Main Activity为PandoraEntry(见AndroidMainfest.xml)  
            Intent bootMainIntent = new Intent(context, PandoraEntry.class);  

            // 这里必须为FLAG_ACTIVITY_NEW_TASK  
            bootMainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  

            context.startActivity(bootMainIntent);  
        }  

    }  
}
  • 在AndroidMainfest.xml中注册该广播接收类
    <!--开机自启动-->  
    <receiver android:name=".BootBroadcastReceiver">  
    <intent-filter>  
         <action android:name="android.intent.action.BOOT_COMPLETED" />  
         <category android:name="android.intent.category.LAUNCHER"></category>  
    </intent-filter>  
    </receiver>
  • 编译,调试

注意事项

  • 请注意BootBroadcastReceiver的命名空间,要保证AndroidMainfest.xml中receiver可以找的到我们创建的BootBroadcastReceiver类。

  • 应用程序必须在Android中启动一次,下次才可以开机启动。

5 关注 分享
BoredApe 朝心 f***@126.com 聚柚 湖东呀

要回复文章请先登录注册

湖东呀

湖东呀

回复 1***@qq.com :
这代码是离线打包的,或者你可以用插件试下https://ext.dcloud.net.cn/plugin?id=9328,不过大概率不行,小米电视这种都是魔改Android,应该会禁止开机广播。
2022-10-24 16:56
1***@qq.com

1***@qq.com

回复 湖东呀 :
小米电视能自启吗,方便发个包我放电视试下能自启不?
2022-09-15 17:33
铁柱

铁柱

实测可用,赞一个,谁能想到 16 年的教程这么好用,楼主解释的也很好,对于我们这种原生小白真的很友好
2022-08-31 20:38
湖东呀

湖东呀

实测可用,赞一个,另外补充一下,没有写优先级的静态注册开机自启接收挺慢的,加个优先级就好多了<intent-filter android:priority="999999999" android:sharedUserId="android.uid.system">
2022-08-31 17:37
这不是我没有

这不是我没有

回复 小毅尔勒 :
在AndroidMainfest.xml中注册该广播接收类
2021-01-28 10:05
小毅尔勒

小毅尔勒

回复 这不是我没有 :
您好,这个启动类应该怎么注册呢
2021-01-26 23:59
这不是我没有

这不是我没有

回复 这不是我没有 :
自己写的有问题错了,的确有效
2020-01-16 09:01
这不是我没有

这不是我没有

回复 1***@163.com :
就安装时自启动了,后面就无效了,是使用uni-app那个版本的?
2020-01-14 10:36
Jidea

Jidea

uni-app里面如何使用这个
2020-01-02 14:30
这不是我没有

这不是我没有

回复 飘叶 :
同问
2019-11-12 10:13