这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战
这篇文章要基于前面的基础,我们才能继续下面的内容,建议阅读。
Qt for Android(一) —— QT 中如何调用android方法
Qt for Android(二) —— QT 中调用自定义Android方法详细教程(获取Android设备的SN号)
Qt for Android(三) —— QT 中获取 Android 的Services,并调用需要Context参数的 c方法(设置音量、亮度等)
背景
在前面我们讲了一些基础操作,包括怎么在 qt 添加 java代码,如何去调用这些代码等。但是要做到开机自启动,是需要新增 java 代码的,单纯的在 C++ 层是做不到的。
分析
首先要知道当Android系统启动时,会发出一个系统广播 ACTION_BOOT_COMPLETED,它的字 符串常量表示为 android.intent.action.BOOT_COMPLETED,代表了系统开机完成。 我们只要在程序中监听到这个广播,再跳转到主Activity 并启动自身Activity即可。 因此我们要注册一个BroadcastReceiver类。
案例
1、基于文章二,在相同的目录下新增java文件BootBroadcastReceiver.java,当然名字可以自定义。
2、在类中添加代码:
package com.qht.test;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class BootBroadcastReceiver extends BroadcastReceiver {
static final String action_boot="android.intent.action.BOOT_COMPLETED";
final String CLASS_NAME = "BootBroadcastReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.i(CLASS_NAME, "recv broacast, action = "+intent.getAction());
if (intent.getAction().equals(action_boot)){
try {
Log.i(CLASS_NAME, "recv broacast, ready sleep");
Thread.sleep(2000);
Log.i(CLASS_NAME, "recv broacast, after sleep ");
} catch (InterruptedException e) {
e.printStackTrace();
}
Intent StartIntent=new Intent(context, org.qtproject.qt5.android.bindings.QtActivity.class); //接收到广播后,跳转到主Activity
StartIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Log.i(CLASS_NAME, "startActivity");
context.startActivity(StartIntent);
}
}
}
上面代码中的org.qtproject.qt5.android.bindings.QtActivity即为QT程序在android下运行的默认主Activity,当然这个 Activity是可以自定义,后面的文章我们再讲这块。
3、打开 android 目录下的 AndroidManifest.xml 文件,在 application 节点下注册一个receiver:
然后我们给加上开机自启动的权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
至此,QT for Android的开机自启动功能就完成了,我们可以用一个简单的APK测试一下。
注意:这种方式需要启动一次程序,完成广播的注册。等下次手机开机时,软件即会自动启动。