平台:全志 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 |
|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )
GMT+8, 2024-11-22 16:17
Powered by Discuz! X3.4
© 2001-2013 Comsenz Inc.