提示:系统开机后-自动启动第三方应用
前言
系统有自己的Launcher HOME,应用,但是需要实现开机后第一个打开的应用是 指定的第三方某个非HOME的应用。
一、 需求 - 场景
需求:Android 定制客户的案子,常见需求:把客户提供的自己开发的应用作为开机启动的第一个应用。
场景:为什么这么做:
- 展示产品特性
- 方便客户推广
- 广告业务实现
二、参考资料
MTKAndroid12-13-开机应用自启功能实现
Framework层实现HDMIN 自动检测弹框确认进入或取消
资料说明:
上面两篇文章是自己之前的两篇文章,最具代表性的参考资料:其实就是两种不同的Framework 场景,方案实现。
- 如果是自带系统Launcher:强烈建议在Launcher3中处理
- 如果是第三方Launcher 程序:那么就建议在系统的某个Service 里面处理
上面两篇参考资料就是实际的 带系统Launcher和不带系统Launcher 不同的两种场景的不同处理方式,后面再具体讲不通方式和实际的优劣。
三、修改文件-实现方案
这里以RK3576 Android15 版本为例,来进行需求实现。 其它SOC 芯片平台或者不同版本Android源码下 源码路径可能不一致,但是思想一致,可参考。
修改文件
这里选择在SystemUIService 中去处理
/frameworks/base/packages/SystemUI/src/com/android/systemui/SystemUIService.java
实现方案
// modify by somebody start
import android.app.ActivityManager;
import android.util.Log;
import android.content.pm.PackageManager;
import android.content.ContentResolver;
import android.content.ComponentName;
import android.content.Context;
// modify by somebody end
public class SystemUIService extends Service {
// modify by somebody start
Handler autoStartHander=new Handler();
// modify by somebody end
@Override
public void onCreate() {
super.onCreate();
....
// modify by somebody start
autoStartHander.removeCallbacksAndMessages(null);
autoStartHander.postDelayed(autoStartHanderRun,6*1000);
// modify by somebody end
}
// modify by somebody start
Runnable autoStartHanderRun=new Runnable() {
@Override
public void run() {
Log.d(SystemUIApplication.TAG," to check autoStartHanderRun");
launchApp(getApplicationContext(),"com.xt.taichi","com.xt.taichi.view.login.SplashActivity");
}
};
// modify by somebody end
public static void launchApp(Context context,String packageName,String pkgMainActivity) {
try {
Intent intent = new Intent();
ComponentName comp = new ComponentName(packageName, pkgMainActivity);
intent.setComponent(comp);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (null != intent) {
context.startActivity(intent);
}
} catch (Exception e) {
e.printStackTrace();
}
}
......
}
疑难杂症分析-提醒
如上方案其实有几个特别注意的点:如下简要说明
-
如果不延时-或者延时时间短 :在部分产品特别是内置应用比较多的时候,开机第一次,应用都未安装成功,虽然SystemUIService 启动了,但是PMS 里面的安装工作并没有完成。 所以这个时候启动时无效的。
-
如果延时时间长 : 本来内置的就有第三方Launcher HOME程序,延时时间太长的话 都进入到HOME 程序了,再去跳转到开机自启的 第三方应用。 这个体验特别尴尬,不允许的。
-
所以,这个延时时间,建议根据项目实际情况进行实现,调试最优时间。
四、相关知识点参考-延伸
- 首先要搞清楚,上面参考资料已经当前需求解决方案实现的不同的场景,以及如上疑难杂症分析提醒。都是实战中需要care 的核心点。 根据不同的场景采取不同的方案,不同方案里面又有特别注意的点。 都是为了更好的效果,最优解。
- 以前Android 低版本、第三方软件(酷狗、爱奇艺、QQ音乐等) 都有一个开机自启的功能。
所以,其实开机自启大概有三种实现方案:
- 有 系统默认Launcher HOME程序时候,在 Android Launcher3 中添加逻辑,这个实现方案最佳。不用顾虑在服务里面启动早晚时间问题。
- 没有系统原生Launcher3 HOME程序,客户定制的第三方Launcher 时候,那就必须借助服务来实现了。
- 还有一种开机广播实现,这种方案 在Android高版本周公越来越不可行的。
系统开机后打开第三方应用:核心对比总览
| 对比维度 | 开机服务启动方式 | 监听开机广播方式 |
|---|---|---|
| 本质区别 | 间接启动:广播 → 服务 → 应用 | 直接启动:广播 → 应用 |
| 架构层级 | 三级结构 | 二级结构 |
| 执行主体 | Service组件 | BroadcastReceiver |
| 生命周期 | 完整Service生命周期 | onReceive()方法执行周期 |
| 执行时间限制 | 无明确限制(但有后台限制) | 通常10秒内(Android建议) |
| 资源占用 | 较高(需维护Service) | 较低(临时对象) |
这里只是用服务代表系统服务 对比,监听广播启动应用存在一定的延时,达不到启动效果。
总结
- 这里用系统服务实现了从系统服务中开机后启动第三方应用的一个需求场景,非常适用。
- 联系以前的知识点,在Launcher3 中启动应用,特别是出国外GMS 产品、使用原生Launcher产品 的场景,也有相当大的定制需求场景。

被折叠的 条评论
为什么被折叠?



