Android系统实现开机自启第三方应用

提示:系统开机后-自动启动第三方应用


前言

系统有自己的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产品 的场景,也有相当大的定制需求场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

野火少年

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

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

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

打赏作者

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

抵扣说明:

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

余额充值