嵌入式爱好者

Android 应用APP开机自启

2023-9-25 09:24| 发布者: 香飘飘~~~| 查看: 97| 评论: 0

类目: A40i/T3系列产品  >  Android     文档编号: 1129

平台:全志 A40i
系统:Android7.1 一、广播方式自启
全志 A40I Android7.1 系统开机自启动,也适用于其他 Android 系统。Android 系统的自
启动不同于 Linux 系统,linux 直接在内核 init.rc 中修改,应用层不用修改,而 Android 要在
应用层中修改
1. 在 Android 系统内核中首先应确保系统能够发送广播信号
在 Android 内核中
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
查看
skipPackages =
intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
} else {
- mBackgroundManagerService.resolverReceiver(intent, receivers);
+ if(!Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())){
+ mBackgroundManagerService.resolverReceiver(intent, receivers);
+ }
}
if (skipPackages != null && (skipPackages.length > 0)) {
for (String skipPackage : skipPackages) {
在 接 收 到 广 播 意 图 时 , 如 果 该 广 播 不 是 系 统 启 动 完 成 的 广 播 , 则 利 用
mBackgroundManagerService 对象来解析和处理这个广播事件。具体的处理逻辑需要查看
resolverReceiver() 方法的实现。
2. 在 AndroidManifest.xml 中增加相关启动权限
<?xml version="1.0" encoding="utf-8"?>
<manifest
............. <!-- 开机启动权限 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
......... <application
......... <receiver
android:name=".SysBootReceiver"
android:enabled="true" android:exported="true" android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter android:priority="1000">
<!--.接收启动完成的广播-->
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
</manifest>
3. 创建一个广播接收类
public class SysBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
LogV("action=" + action);
if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
// 服务自启动
Intent intent = new Intent(context, MainActivity.class); // 要启动的 Activity
intent .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
}
二、开机自启脚本
安卓开机自启动 APP,一般都是获取开机广播,实现 APP 自启动的,但有写客户不会获取开
机广播,可以使用下面方法启动 APP。实现过程是编写一个 shell 的启动脚本,开机自动运
行这个脚本,通过脚本启动 APP。
实现方法分为两个步骤,第一是预装 app,第二是修改 android 源码,用脚本启动 app。
1、 app 预装
1) 在 android/device/softwinner/a40-p1/目录下创建一个 myapp 的文件夹,把 APP 放到 myapp
文件夹上,App 文件夹包含 appname.apk 安装包和一个 android.mk 文件。
###############################################################################
# android.mk 文件
LOCAL_PATH := $(call my-dir)
###############################################################################
#
include $(CLEAR_VARS)
LOCAL_MODULE := name
LOCAL_MODULE_TAGS := optional
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_DEX_PREOPT := false
LOCAL_MODULE_PATH := $(TARGET_OUT)/app
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
include $(BUILD_PREBUILT)
2) 修改 android/device/softwinner/a40-p1 目录下的 a40_p1.mk 文件,在
PRODUCT_PACKAGES+=下添加 App 名,添加文件的路径,使编译的时候能编译的 App 文件。
到这里预安装就完成了。
2、 脚本启动 app
1) 安卓的终端中,我可以用 am start -n 包名类名的方式启动 App,具体操作流程可以查看
readme 文件。就是我们可以写一个脚本文件运行 am start -n 命令,现实开机自启动 app。
2) 写一个 shell 脚本
其中 com.tyjxsm.androidgpiodemo 是 APP 的包名,com.tyjxsm.eprfbc.MainMenu 是 APP 的类
名。
#!/system/bin/sh
am start -n com.tyjxsm.androidgpiodemo/com.tyjxsm.eprfbc.MainMenu
把脚本app.sh文件放在android/device/softwinner/a40-p1目录,并在当前目录下的a40_p1.mk
文件添加一下代码,目的是把当前的 app.sh 文件编译到系统的 system/bin/目录中。
PRODUCT_COPY_FILES += \
device/softwinner/a40-p1/app.sh:system/bin/app.sh
3) 在 android/system/core/rootdir/ init.rc 文件中添加
service app /system/bin/sh /system/bin/app.sh
class main
user root
group root
oneshot
on property:sys.boot_completed=1
start app
exec /system/bin/sh /system/bin/app.sh
这里是开机运行 app.sh 脚本,同过脚本启动 APP

已解决

未解决

只是看看

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-5-1 15:38

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

返回顶部