将定制的Launcher设置为默认

上传人:zxc****hhs 文档编号:276974474 上传时间:2022-04-13 格式:PDF 页数:8 大小:16.88KB
返回 下载 相关 举报
将定制的Launcher设置为默认_第1页
第1页 / 共8页
将定制的Launcher设置为默认_第2页
第2页 / 共8页
将定制的Launcher设置为默认_第3页
第3页 / 共8页
将定制的Launcher设置为默认_第4页
第4页 / 共8页
将定制的Launcher设置为默认_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《将定制的Launcher设置为默认》由会员分享,可在线阅读,更多相关《将定制的Launcher设置为默认(8页珍藏版)》请在金锄头文库上搜索。

1、Android 如何将定制的Launcher成为系统中唯一的Launcher 2011-01-17 11:12 如果你要定制一个Android系统,你想用你自己的Launcher(Home)作主界面来替换Android自己的 Home你的 Launcher. 我们可以通过修改Framework来实现这样的功能。这里以 Android2.1的源代码为例来实际说明。1)首先了解一下Android的启动过程。 Android系统的启动先从Zygote开始启动,然后 (中间的过程就不说了).一直到了SystemServer(fram /* * This method is called from Zy

2、gote 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 (SamplingPro

3、filerIntegration.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

4、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(“a

5、ndroid.server.ServerThread”); thr.start(); 从 SystemServer的 main 函数开始启动各种服务。首先启动init1, 然后启动init2. 从上面的注释可以看到:init1这个方法时被Zygote调用来初始化系统的,init1会启动 native 的服务如Surf完以后会回调init2来启动 Android的 service 。这里我们主要来关注init2的过程。init2中启动 ServerThread线程,ServerThread中启动了一系列的服务,比如这些:ActivityManagerService EntropyService

6、PowerManagerService TelephonyRegistry PackageManagerService AccountManagerService BatteryService HardwareService Watchdog SensorService BluetoothService StatusBarService ClipboardService InputMethodManagerService NetStatService ConnectivityService AccessibilityManagerService NotificationManagerServi

7、ce MountService DeviceStorageMonitorService LocationManagerService SearchManagerService FallbackCheckinService WallpaperManagerService AudioService BackupManagerService AppWidgetService 这些大大小小的服务起来以后,开始(ActivityManagerService)ActivityManagerNative.getDefault().systemReady() 在 systemReady后开始开始启动Launc

8、her 。在寻找 Launcher的时候是根据HOME的 filter (在 Manifest中定义的 category android:name=”andro然后根据 filter出来的 HOME来启动,如果只有一个HOME ,则启动这个HOME ,如果用户自己装了HOME我们现在希望从这里弹出我们自己定制的Launcher,同时也不希望弹出选择HOME的界面,我们不希望用户修好多广告,以及强制安装的程序,不希望用户把它干掉。我们可以通过这样来实现:2) 定义一个私有的filter选项,然后用这个选项来过滤HOME. 一般情况下我们使用Manifest中定义的 category androi

9、d:name=”android.intent.category.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_H

10、OME相关的所有的地方,都改成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.hasCat

11、egory(Intent.CATEGORY_HOME_FIRST) /lixinso: Intent.CATEGORY_HOM 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- frameworks/policies/base/mid/co

12、m/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).addCateg

13、ory(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_HOM

14、E_FIRST); /lixinso frameworks/policies/base/phone/com/android/internal/policy/impl/RecentApplicationsDialog.java中 /ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Inte改成 ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Inso 4)

15、写一个自己的Launcher. 可以参考 android sample中的 Launcher ,或者 android源代码中的/packages/apps/Launcher 来写。在 Launcher中标记其是不是Launcher的最关键的代码时Manifest中的 filter:android:name=”android现在我们定义了自己的filter, 那么,我们在我们自己写的Launcher中将 Manifest改为:application android:process=”android.process.acore3android:icon=”drawable/icon” and 然后

16、将编译好的apk 放到 /out/target/product/generic/system/app目录下。5)将 Android自带的 Launcher删除掉,包括源代码(packages/apps/Launcher)和 apk(/out/target/produc6) 做完这些工作,就可以重新编译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 现在可以启动Android模拟器来看效果了。首先设置环境变量:$ export ANDROID_PRODUCT_OUT= ./out/target/product/generic 然后切换到$

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号