Qt for Android实现开机自启动

前言

最近项目需要,在Android上编写的程序,需要实现开机自启动。笔者查询了下资料,基本原理如下:

当Android启动时,会发出一个系统广播,内容为ACTION_BOOT_COMPLETED,它的字符串常量表示为 android.intent.action.BOOT_COMPLETED。 只要在程序中“捕捉”到这个消息,再启动程序入口之即可。 我们要做的是做好接收这个消息的准备,而实现的手段就是实现一个BroadcastReceiver类

一、确定包名

首先切换到Android的开发套件上,生成AndroidManifest.xml文件,操作步骤如下所示

 

 

 Qt开发的android程序,默认包名可能是org.qtproject.example,一般会自定义一个包名。

二、创建java文件

根据找到的包名,创建java文件。以org.qtproject.example为例,需要在android目录下创建src/org/qtproject/example目录。新建java文件BootBroadcastReceiver.java,并放入指定的目录中。

java文件内容如下

package org.qtproject.example;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

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)){
            Intent StartIntent=new Intent(context,org.qtproject.qt.android.bindings.QtActivity.class); //接收到广播后,跳转到MainActivity
                        StartIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        context.startActivity(StartIntent);
                }
        }
}

说明:

1.java文件中的包名,必需与应用程序中的包名对应 

2.Intent()中第二个参数,需要在AndroidManifest.xml文件中查找,必须对应

若是Qt5,可能是org.qtproject.qt5.android.bindings.QtActivity.class 

三、修改AndroidManifest.xml文件

1.在application标签内,添加receiver

<receiver android:name=".BootBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
        <category android:name="android.intent.category.HOME"/>
    </intent-filter>
</receiver>

2.添加启动权限

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

整个 AndroidManifest.xml文件如下所示

四、运行测试

添加完成后,就可以运行测试了。但记住,需要分配足够的权限,且需要至少运行一次才能生效。

笔者测试使用的源码下载

后记

笔者在多个android设备上测试均正常,但在华为鸿蒙上未成功

Qt for Android中,要实现开机自启的功能,可以通过以下步骤实现: 1. 在AndroidManifest.xml文件中添加启动广播接收器的声明。可以使用Qt提供的Android源文件模板进行修改,加入以下代码: ```xml <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <receiver android:name="your.package.name.BootReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> ``` 2. 在qtandroidextras模块中创建一个新的JNI类,并继承QtService。这个类将作为启动服务的入口点。可以使用以下代码: ```cpp #include <QtAndroidExtras/QAndroidJniObject> #include <QtAndroidExtras/QAndroidJniEnvironment> #include <QtAndroidExtras/QtAndroid> #include "yourjni.h" void YourJNI::startService() { QAndroidJniObject::callStaticMethod<void>("your/package/name/BootService", "start", "()V"); } ``` 3. 在YourJNI类中,创建一个静态的start方法,该方法将由Android的BootReceiver类调用。在这个方法中,你可以编写开机自启动的逻辑代码,例如启动你的Qt应用程序。 4. 在BootReceiver类中,重写onReceive方法,并在其中调用YourJNI类的startService方法,来启动你的服务。 5. 编译和部署你的Qt应用程序到Android设备。 这样,当Android设备开机后,BootReceiver类将会接收到BOOT_COMPLETED广播,并调用YourJNI类的startService方法,从而启动你的Qt应用程序。 请注意,需要在Qt for Android项目的.pro文件中添加以下行,以包含所需的模块和类: ``` QT += androidextras ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

꧁白杨树下꧂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值