在Android中替换掉原有的HOME,实现自主的控制Launcher

android自定义桌面应用 这篇文章主要讲下自定义桌面应用.效果主要是调用packageManager来获取当前所有的程序,并在自定义桌面程序中展示,并支持跳转. 阅读详情
 一:用户可自行添加HOME
        Android2.3.7共有两个home,一个在packages/apps/Launcher2、另一个在development/samples/Home。
1:launcher2,系统默认的。去除launcher2 直接修改它的AndroidManifest.xml中的
<category android:name="android.intent.category.HOME" />注释掉
2:samples下的Home只是个样例,但是也在Intent过滤器里注册了Home,所以,如果单单干掉Launcher2,这个还是在的,还是会出现选择Home的选项,我们可以将两个Home都干掉,替换成自己的。修改samples/Home/AndroidManifest.xml。
将里面的<category android:name="android.intent.category.HOME" />这句注释掉
3:替换成自己的launcher

修改AndroidManifest.xml。在<intent-filter>里的值改为:

                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.MONKEY"/>

这一块可以直接用第三方apk,将第三方apk放在/vendor/mediatek/nollec73_gb/artifacts/out/target/product/nollec73_gb/system/app下

然后重新编译提取iamge烧到板子中就可以了
二:定制自己的Home 用户无法重新安装第三方home
如果你要定制一个Android系统,你想用你自己的Launcher(Home)作主界面来替换Android自己的Home,而且不希望用户安装的Launcher来替换掉你的Launcher. 
我们可以通过修改Framework来实现这样的功能。 

1)首先了解一下Android的启动过程。 
  Android系统的启动先从Zygote开始启动,然后......(中间的过程就不说了).....一直到了SystemServer(framework)这个地方,看到这段代码:

/**     * This method is called from Zygote to initialize the system. This will cause the native     * services (SurfaceFlinger, AudioFlinger, etc..) to be started. After that it will call back     * up into init2() to start the Android services.     */    native public static void init1(String[] args);    public static void main(String[] args) {        if (SamplingProfilerIntegration.isEnabled()) {            SamplingProfilerIntegration.start();            timer = new Timer();            timer.schedule(new TimerTask() {                @Override                public void run() {                    SamplingProfilerIntegration.writeSnapshot("system_server");                }            }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);        }        // The system server has to run all of the time, so it needs to be        // as efficient as possible with its memory usage.        VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);        System.loadLibrary("android_servers");        init1(args);    }    public static final void init2() {        Log.i(TAG, "Entered the Android system server!");        Thread thr = new ServerThread();        thr.setName("android.server.ServerThread");        thr.start();    }}

 

 

从SystemServer的main函数开始启动各种服务。 
首先启动init1,然后启动init2. 
从上面的注释可以看到:init1这个方法时被Zygote调用来初始化系统的,init1会启动native的服务如SurfaceFlinger,AudioFlinger等等,这些工作做完以后会回调init2来启动Android的service。

这里我们主要来关注init2的过程。 
init2中启动ServerThread线程, 
ServerThread中启动了一系列的服务,比如这些:

ActivityManagerService 
EntropyService 
PowerManagerService 
TelephonyRegistry 
PackageManagerService 
AccountManagerService 
BatteryService 
HardwareService 
Watchdog 
SensorService 
BluetoothService 
StatusBarService 
ClipboardService 
InputMethodManagerService 
NetStatService 
ConnectivityService 
AccessibilityManagerService 
NotificationManagerService 
MountService 
DeviceStorageMonitorService 
LocationManagerService 
SearchManagerService 
FallbackCheckinService 
WallpaperManagerService 
AudioService 
BackupManagerService 
AppWidgetService

这些大大小小的服务起来以后,开始 
((ActivityManagerService)ActivityManagerNative.getDefault()).systemReady() 
在systemReady后开始开始启动Launcher。

在寻找Launcher的时候是根据HOME的filter(在Manifest中定义的<category android:name="android.intent.category.HOME" />)来过滤。 
然后根据filter出来的HOME来启动,如果只有一个HOME,则启动这个HOME,如果用户自己装了HOME,那就会弹出来一个列表供用户选择。

我们现在希望从这里弹出我们自己定制的Launcher,同时也不希望弹出选择HOME的界面,我们不希望用户修改我们的home,比如我们的home上放了好多广告,以及强制安装的程序,不希望用户把它干掉。

我们可以通过这样来实现:

2) 定义一个私有的filter选项,然后用这个选项来过滤HOME. 
   一般情况下我们使用Manifest中定义的<category android:name="android.intent.category.HOME"来过滤的,我们现在增加一个私有的HOME_FIRST过滤。

     在Intent.java(frameworks/base/core/java/android/content/Intent.java)中添加两行代码

    //lixinso:添加CATEGORY_HOME_FIRST 
    @SdkConstant(SdkConstantType.INTENT_CATEGORY) 
    public static final String CATEGORY_HOME_FIRST = "android.intent.category.HOME_FIRST";

3)修改和CATEGORY_HOME相关的所有的地方,都改成HOME_FIRST,主要是framework中的这几个地方:

    frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中 
    //intent.addCategory(Intent.CATEGORY_HOME); 
    改成intent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinso: 
    //if (r.intent.hasCategory(Intent.CATEGORY_HOME)) { 
    改成if (r.intent.hasCategory(Intent.CATEGORY_HOME_FIRST)) { //lixinso: Intent.CATEGORY_HOME -> Intent.CATEGORY_HOME_FIRST 
   frameworks/base/services/java/com/android/server/am/HistoryRecorder.java中 
   // _intent.hasCategory(Intent.CATEGORY_HOME) && 
   改成 _intent.hasCategory(Intent.CATEGORY_HOME_FIRST) && //lixinso: Intent.CATEGORY_HOME->Intent.CATEGORY_HOME_FIRST

   frameworks/policies/base/mid/com/android/internal/policy/impl/MidWindowManager.java中 
   //mHomeIntent.addCategory(Intent.CATEGORY_HOME); 
   改成 mHomeIntent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinso 
  frameworks/policies/base/mid/com/android/internal/policy/impl/RecentApplicationsDialog.java中 
   //new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),0); 
   改成 new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME_FIRST),0); //lixinso

  frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java中 
   //mHomeIntent.addCategory(Intent.CATEGORY_HOME); 
   改成 mHomeIntent.addCategory(Intent.CATEGORY_HOME_FIRST); //lixinso

  frameworks/policies/base/phone/com/android/internal/policy/impl/RecentApplicationsDialog.java中 
   //ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),0); 
   改成 ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME_FIRST),0); //lixinso

4) 写一个自己的Launcher. 
   可以参考android sample中的Launcher,或者android源代码中的 /packages/apps/Launcher 来写。 
   在Launcher中标记其是不是Launcher的最关键的代码时Manifest中的filter:android:name="android.intent.category.HOME" 
   现在我们定义了自己的filter,那么,我们在我们自己写的Launcher中将Manifest改为: 
    <application  android:process="android.process.acore3" android:icon="@drawable/icon" android:label="@string/app_name"> 
        <activity android:name=".FirstAppActivity" 
                  android:label="@string/app_name"> 
            <intent-filter> 
                                <action android:name="android.intent.action.MAIN" /> 
                <category android:name="android.intent.category.HOME_FIRST" /> 
                <category android:name="android.intent.category.DEFAULT" /> 
                <category android:name="android.intent.category.MONKEY" /> 
            </intent-filter> 
        </activity> 
    </application>

然后将编译好的apk放到/out/target/product/generic/system/app目录下。

5)将Android自带的Launcher删除掉,包括源代码(packages/apps/Launcher)和apk(/out/target/product/generic/system/app/Launcher.apk)。

6) 
做完这些工作,就可以重新编译Android了,我们可以编译修改过的几个相关的包。 
如果之前编译过了Android源码,可以用mmm命令来编译部分的改动。 
这里需要这样编译:

$ . build/envsetup.sh 
$ mmm frameworks/base 
$ mmm frameworks/base/services/java 
$ mmm frameworks/policies/base/mid 
$ mmm frameworks/policies/base/phone

7) 
编译完成后重新生成img文件。 
$ make snod

8) 现在可以启动Android模拟器来看效果了。 
首先设置环境变量: 
$ export ANDROID_PRODUCT_OUT= ./out/target/product/generic 
然后切换到 
$ cd ./out/host/linux-x86/bin 
运行 
$ ./emulator

这样我们启动的模拟器里面用的image就是我们刚才编译好的自己定制的东西了。 
从模拟器上可以看到启动的Launcher是我们自己的Launcher,不会出现默认的Launcher了,也不会出现选择界面。

9)我们再验证一下,如果用户装上了一个其他的Launcher(Home)会怎么样。 
  从网上找一个一般的Launcher或者自己写一个一般的Launcher装上去,重新启动,不会出现选择界面。 
  按HOME键也不会出来两个HOME来选择。

这样我们就牢牢控制了用户的桌面。 
只有我们自己定制的HOME才能装上。 这对于定制Android设备的厂商很有用处.

个性化定制, 车载Launcher实战开发 需求分析:在开始开发之前,深入了解目标受众的需求和期望是至关重要的。通过用户研究和调研,确定功能和特性,并设计出满足用户需求的界面和交互方式。UX设计:用户体验是一个关键因素,保证Launcher界面简洁、直观且易于使用。合理布局、明确的导航和操作流程能提高用户的满意度和黏性。开发技术选择:选择适合开发Launcher的技术框架和工具。常见的选择包括Android开发平台(Java或Kotlin)、React Native等,根据目标平台、开发成本和团队的熟悉程度做出选择。 阅读详情

相关推荐

Android开机霸屏与自启:从CATEGORY_HOME到系统定制的完整实现方案

在操作系统启动流程中,开机自启动是系统服务与应用初始化的重要机制。其核心原理在于系统启动完成后,通过广播或特定Intent触发预设组件的加载。在Android生态中,这一机制通过BOOT_COMPLETED广播和CATEGORY_HOME Intent实现,前者用于后台服务启动,后者则用于桌面应用接管。从技术价值看,这为智能设备、工业控制、自助终端等场景提供了设备即服务的可能性,确保设备开机即进入专用工作状态。在应用场景层面,广告机、餐饮终端、工控平板等设备都需要开机后直接进入全屏应用界面,避免用户误操作退

weixin_30615767的博客 401

Android开发-如何判断当前页面是否是桌面(Home)

在Android系统中,任何一个可见的界面都属于一个应用程序,桌面也是一个应用程序。例如,我们通常打开手机看到的第一个界面就属于桌面应用。Android系统会自带一个桌面应用,这个桌面App是系统App。同时,也有人(或公司)会开发第三方桌面应用,这类属于用户App,例如,Go桌面,点心桌面,MiUi的桌面。...

记录和分享程序人生的点点滴滴 4914

Android 13系统开发:如何优雅地内置第三方桌面并保留原生Launcher3的切换能力

本文深入探讨了在Android 13系统中如何优雅地内置第三方桌面启动器,同时保留原生Launcher3的切换能力。通过解析Android 13的桌面管理机制、提供系统集成方案和切换实现细节,帮助开发者实现多Launcher的无缝切换与资源优化,提升系统定制灵活性和用户体验。

weixin_29255731的博客 459

android.intent.category以及android.intent.action.MAIN

一. android.intent.category.LAUNCHER与android.intent.category.HOME的区别 android.intent.category.LAUNCHER:android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里,就是android开机后的主程序列表。 android.intent.category.

zzobin的专栏 1616

Android系统 设置第三方应用为默认Launcher实现和原理分析

本文介绍了Android系统中launcher应用的启动和切换的原理,以及如何通过修改源码来实现设置第三方应用为默认launcher的功能。

我其实什么都不会 5298

安卓10源码开发定制(27)开发内置自定义Launcher之开发自己的Launcher

一、前言 Launcher是安卓系统中的桌面启动器,安卓系统的桌面UI统称为Launcher。手机在和用户交互的过程中,Launcher为用户提供了各种App启动的入口。有了Launcher就可以对App进行很多操作,比如清理缓存、卸载、权限设置等等。由于系统自带的Launcher都是功能比较标准的,有时候想通过定制个性化的Launcher来替换系统的Launcher来实现一些扩展功能。通过Launcher可以实现很多特殊的功能。列举如下几个: 禁止卸载App 控制App是否隐藏...

xiaomaNo01的专栏 1654

自定义一个界面来替换Android自带的Home界面

如果你要定制一个Android系统,你想用你自己的Launcher(Home)作主界面来替换Android自带的Home,而且不希望用户安装的Launcher来替换掉你的Launcher,应该如何来实现呢? 我们可以通过修改Framework层来实现这样的功能。 首先了解一下Android的启动过程。 Android系统的启动先从Zygote开始启动,然后…(中间的过程就不说了)…一直到了Sys...

feifan12311的博客 984

android各组件详解- Intent.

android各组件详解- Intent.

让你自己写的Android的Launcher成为系统中第一个启动的,也是唯一的Launcher.

转自:http://tieba.baidu.com/p/2902014926 关注嵌入式物联网行业及人才培养,每日更新,欢迎订阅及留言讨论~~~ 作者:倪键树,嵌入式物联网讲师。 让你自己编写的Android的Launcher成为系统中第一个启动应用程序,也是唯一的Launcher 如果你要定制一个Android系统,你想用你自己的Launcher(Home)作主界面来替换Andr

u014463713的专栏 1293

Pspice开关电源仿真:从零实现反激式电源设计实战案例

通过Pspice仿真工具,手把手实现反激式开关电源的设计与优化,深入剖析关键参数设置与波形分析,帮助掌握Pspice在电源开发中的实际应用技巧。

weixin_35756690的博客 1155

北斗三号PPP-B2b信号实战指南:从接收机配置到精度验证全流程

本文提供了北斗三号PPP-B2b信号从硬件配置到数据处理的全流程实战指南。详细解析了信号特性、接收机关键参数设置,并以飞纳接收机和Mass软件为例,演示了数据解算与精度验证方法。通过覆盖中国多地区的联调测试案例,验证了PPP-B2b服务可实现分米级实时定位精度,为无网络地区高精度应用提供了可靠解决方案。

nn3456的博客 550

定制替换Android桌面

定制替换Android桌面(home screen) 发表于304 天前 ⁄ 编程开发 ⁄ 评论数 1 替换Android桌面的相关问题: 1、想将home screen换成自己写的activity,该如何实现? 在你要设置为home screen的那个ac...

chuhuangqiao1461的博客 385

Hifiasm参数调优实战:当N50不理想时的7个排查方向与解决方案

本文详细解析了Hifiasm参数调优实战,针对基因组组装中N50不理想的7个排查方向与解决方案。通过调整--hom-cov、-D、-N等核心参数,结合HiFi数据和参考基因组分析,有效提升组装质量。文章以猪毛菜基因组为例,展示了从2.1MB到4.3MB的N50优化过程,为生物信息学研究者提供实用指南。

weixin_30642561的博客 425

GMS之Launcher中去除默认Search或替换为Chrome Search

在源码中是通过launcher3中的BuildConfig.java去获取变量(默认true),那么在这里将变量修改为false即可(自行添加系统变量进行灵活控制也行)最近在Android 13平台修改以上代码后,在Launcher中并不生效,后来发现,如果SearchLauncherQuickStep,因此在这里也需要把它注释掉。将FeatureFlags.java文件中的QSB_ON_FIRST_SCREEN变量修改为false。

不要用过去的错误约束现在的自己。 1993

分布式 Agent 系统设计:高并发场景下的挑战与解决方案

分布式 Agent 系统由多个分布在不同节点上的智能 Agent 组成,这些 Agent 具有自主决策能力,能够通过通信协作完成复杂任务。每个 Agent 可以看作是一个独立的实体,具备感知环境、处理信息、执行动作的功能,它们相互协作,共同实现系统的整体目标。分布式 Agent 系统在高并发场景下面临着资源调度、通信延迟、状态一致性、容错处理和性能瓶颈等诸多挑战。通过采用动态资源分配、高效通信协议、分布式共识算法、冗余备份等解决方案,可以有效应对这些挑战,提高系统的性能、可靠性和可用性。

shuizhudan223的博客 1290

(蓝桥杯)STM32G431RBT6(SysTick timer)

选用最基础的定时器。

2301_81764359的博客 1899

Android开机自启动Launcher定制

让你自己编写的Android的Launcher成为系统中第一个启动应用程序,也是唯一的Launcher 如果你要定制一个Android系统,你想用你自己的Launcher(Home)作主界面来替换Android自带的Home,而且不希望用户安装的Launcher来替换掉你的Launcher,应该如何来实现呢? 我们可以通过修改Framework层来实现这样的功能。 1) 首先了解一...

akq45568的博客 333

闲置服务器之代理服务器篇

这台服务器是在阿里云免费白嫖的,天工开物计划,阿里给的300块无门槛优惠券,买了一台新加坡的境外服务器,288,刚刚抵扣完,因为是境外服务器,能够访问一些国内不能访问的网站,所以本文章仅从技术的角度来搭建代理服务器,使用时,请自觉遵守国家相关规定,如有任何违法行为,与本人无任何关系!!!。本文使用tinyproxy来搭建代理服务器。

m0_50281408的博客 2104

c语言控制安卓桌面,让你自己编写的Android的Launcher成为系统中第一个启动应用程序,也是唯一的Launcher...

关注嵌入式安卓物联网行业及人才培养,每日更新,欢迎订阅及留言讨论~~~作者:倪键树,嵌入式安卓物联网讲师。让你自己编写的Android的Launcher成为系统中第一个启动应用程序,也是唯一的Launcher如果你要定制一个Android系统,你想用你自己的Launcher(Home)作主界面来替换Android自带的Home,而且不希望用户安装的Launcher来替换掉你的Launcher,应该...

weixin_29655587的博客 392

利用GPAC生成MP4文件

GPAC主要针对学生和内容创作者,代表了一个跨平台的多媒体框架,开发人员可以使用它在 LGPL 许可下制作开源媒体。GPAC多媒体框架兼容范围广泛的流行文件类型,从常见格式(如 AVI、MPEG 和 MOV)到复杂格式(如 MPEG-4 系统或 VRML/X3D)和 360 电影。

深之JohnChen的专栏 1770

【同等学力】2004-数学⭐✨

1.有些人勤奋,但并非所有人都勤奋。2.不管白猫黑猫,抓住老鼠就是好猫

super_mochi1 510

Android 6.0替换原系统Launcher傻瓜教程

  这个事情我也是搞了将近一个礼拜,因为是第一次接触Android源码开发,所以速度比较慢。 首先,要清除原有Home和Launcher,具体如下 步骤①     删除源码\packages\apps\Launcher2文件夹     步骤②     打开build\target\product\core.mk   删除行“Launch...

不卡机的博客 3616

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

launcher定制

应用的图标--- 在ApplicationInfo中有个Bitmap类型的成员是iconBitmap,在Launcher.java文件中,有一些方法是去bind all apps,bind apps added,bind apps updated,在这些地方,可以将这个ico

pgalxx的专栏 3119

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

定制你自己的Andoird桌面Launcher

如果你要定制一个Android系统,你想用你自己的Launcher(Home)作主界面来替换Android自己的Home,而且不希望用户安装的Launcher来替换掉你的Launcher. 我们可以通过修改Framework来实现这样的功能。 这里以Android2.1的源代码为例来实际说明。 1)首先了解一下Android的启动过程。   Android系统的启动先从Zygote开始启动

mr_raptor的专栏 5630

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

OpenHarmony开机自启动与Launcher替换深度解析

OpenHarmony的开机自启动和Launcher机制并非Android式配置驱动,而是基于分层服务架构(init→bootstrap→samgr→AMS)与严格安全校验(签名域、设备类型、API版本)的系统级能力。其核心原理在于StartupConfig注册、BundleManager白名单仲裁及WindowManager窗口接管等协同流程,技术价值体现在保障商业终端(如POS机、工控屏)的出厂固化体验与安全可控性。典型应用场景包括系统应用开机直启服务、OEM定制默认桌面、硬件级快速初始化等。本文聚焦s

weixin_34405557的博客 451
上一篇: Android中如何启动第三方程序?
AndroidDevWjm
博客等级 码龄15年 6粉丝 17原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值