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

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***@163.com

1***@163.com

好用 赞
2019-10-12 15:19
飘叶

飘叶

uni-app里面如何使用这个
2019-09-11 14:42
3***@qq.com

3***@qq.com

为什么我的只是第一次安装的时候第一次开机自动启动启动了一次,往后就不行了
2019-04-15 11:32
Flymen

Flymen

使用的最新版的sdk,无法接受广播,APP无法开机启动
2018-09-01 15:44
AronWOng

AronWOng (作者)

回复 orchie :
你可以随意,在注册广播接受类的时候指定其包名就可以了(让程序知道你这广播类在哪里)
2017-06-04 15:34
orchie

orchie

请问广播接收类放在哪?package io.dcloud.yourapp; yourapp替换为什么?
我实测放在这个位置 StudioProjects\HBuilder-Hello\HBuilderHello\src\main\java\io\dcloud
yourapp写APP manifest里的ID ,编辑器提示出错
参考同目录另一个演示自带的类RInformation.java ,
写成package io.dcloud;不出错
但import io.dcloud.PandoraEntry; 提示未使用状态
求指教啊大佬~~~
2017-05-26 09:58
orchie

orchie

请问广播接收类放在哪?package io.dcloud.yourapp; yourapp替换为什么?
我实测放在这个位置 StudioProjects\HBuilder-Hello\HBuilderHello\src\main\java\io\dcloud
yourapp写APP manifest里的ID ,编辑器提示出错
参考同目录另一个演示自带的类RInformation.java ,
写成package io.dcloud;不出错
但import io.dcloud.PandoraEntry; 提示未使用状态
求指教啊大佬~~~
2017-05-26 09:58