替换Android桌面的相关问题:

1、想将home screen换成自己写的activity,该如何实现?

在你要设置为home screen的那个activity的androidManifest.xml中的<intent-filter>标签中加上这几句 话<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />运行后,重启模拟器会弹出一个选择进入哪个界面的对话框

2、怎样将系统默认的home screen删除?

重新编译launcher源码,去掉配置文件中的home属性和HOME属性。。
在自己的activity中加入这两个属性,然后重新烧系统。

以下是定制Android的完整思路和步骤:

如果你要定制一个Android系统,你想用你自己的Launcher(Home)作主界面来替换Android自己的Home,而且不希望用户安装的Launcher来替换掉你的Launcher.
我们可以通过修改Framework来实现这样的功能。

这里以Android2.1的源代码为例来实际说明。

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

  1. /**
  2. * This method is called from Zygote to initialize the system. This will cause the native
  3. * services (SurfaceFlinger, AudioFlinger, etc..) to be started. After that it will call back
  4. * up into init2() to start the Android services.
  5. */
  6. native public static void init1(String[] args);
  7. public static void main(String[] args) {
  8. if (SamplingProfilerIntegration.isEnabled()) {
  9. SamplingProfilerIntegration.start();
  10. timer = new Timer();
  11. timer.schedule(new TimerTask() {
  12. @Override
  13. public void run() {
  14. SamplingProfilerIntegration.writeSnapshot(“system_server”);
  15. }
  16. }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);
  17. }
  18. // The system server has to run all of the time, so it needs to be
  19. // as efficient as possible with its memory usage.
  20. VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
  21. System.loadLibrary(“android_servers”);
  22. init1(args);
  23. }
  24. public static final void init2() {
  25. Log.i(TAG, “Entered the Android system server!”);
  26. Thread thr = new ServerThread();
  27. thr.setName(“android.server.ServerThread”);
  28. thr.start();
  29. }
  30. }

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

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

  1. ActivityManagerService
  2. EntropyService
  3. PowerManagerService
  4. TelephonyRegistry
  5. PackageManagerService
  6. AccountManagerService
  7. BatteryService
  8. HardwareService
  9. Watchdog
  10. SensorService
  11. BluetoothService
  12. StatusBarService
  13. ClipboardService
  14. InputMethodManagerService
  15. NetStatService
  16. ConnectivityService
  17. AccessibilityManagerService
  18. NotificationManagerService
  19. MountService
  20. DeviceStorageMonitorService
  21. LocationManagerService
  22. SearchManagerService
  23. FallbackCheckinService
  24. WallpaperManagerService
  25. AudioService
  26. BackupManagerService
  27. AppWidgetService

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

在寻找Launcher的时候是根据HOME的filter(在Manifest中定义的<categoryAndroid: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)中添加两行代码

  1. //添加CATEGORY_HOME_FIRST
  2. @SdkConstant(SdkConstantType.INTENT_CATEGORY)
  3. public static final String CATEGORY_HOME_FIRST = “android.intent.category.HOME_FIRST”;

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

  1. frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中
  2. //intent.addCategory(Intent.CATEGORY_HOME);
  3. 改成intent.addCategory(Intent.CATEGORY_HOME_FIRST);
  4. //if (r.intent.hasCategory(Intent.CATEGORY_HOME)) {
  5. 改成if (r.intent.hasCategory(Intent.CATEGORY_HOME_FIRST)) { //Intent.CATEGORY_HOME -> Intent.CATEGORY_HOME_FIRST
  6. frameworks/base/services/java/com/android/server/am/HistoryRecorder.java中
  7. // _intent.hasCategory(Intent.CATEGORY_HOME) &&
  8. 改成 _intent.hasCategory(Intent.CATEGORY_HOME_FIRST) && //Intent.CATEGORY_HOME->Intent.CATEGORY_HOME_FIRST
  9. frameworks/policies/base/mid/com/android/internal/policy/impl/MidWindowManager.java中
  10. //mHomeIntent.addCategory(Intent.CATEGORY_HOME);
  11. 改成 mHomeIntent.addCategory(Intent.CATEGORY_HOME_FIRST);
  12. frameworks/policies/base/mid/com/android/internal/policy/impl/RecentApplicationsDialog.java中
  13. //new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),0);
  14. 改成 new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME_FIRST),0);
  15. frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java中
  16. //mHomeIntent.addCategory(Intent.CATEGORY_HOME);
  17. 改成 mHomeIntent.addCategory(Intent.CATEGORY_HOME_FIRST);
  18. frameworks/policies/base/phone/com/android/internal/policy/impl/RecentApplicationsDialog.java中
  19. //ResolveInfo homeInfo = pm.resolveActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),0);
  20. 改成 ResolveInfo homeInfo = pm.resolveActivity(newIntent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME_FIRST),0);

4) 写一个自己的Launcher.
可以参考Android sample中的Launcher,或者android源代码中的 /packages/apps/Launcher 来写。
在Launcher中标记其是不是Launcher的最关键的代码时Manifest中的filter:android:name=”android.intent.category.HOME”
现在我们定义了自己的filter,那么,我们在我们自己写的Launcher中将Manifest改为:

  1. <application android:process=”android.process.acore3″ android:icon=”@drawable/icon” android:label=”@string/app_name”>
  2. <activity android:name=”.FirstAppActivity”
  3. android:label=”@string/app_name”>
  4. <intent-filter>
  5. <action android:name=”android.intent.action.MAIN” />
  6. <category android:name=”android.intent.category.HOME_FIRST” />
  7. <category android:name=”android.intent.category.DEFAULT” />
  8. <category android:name=”android.intent.category.MONKEY” />
  9. </intent-filter>
  10. </activity>
  11. </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命令来编译部分的改动。
这里需要这样编译:

  1. $ . build/envsetup.sh
  2. $ mmm frameworks/base
  3. $ mmm frameworks/base/services/java
  4. $ mmm frameworks/policies/base/mid
  5. $ mmm frameworks/policies/base/phone

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

  1. $ make snod

现在可以启动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设备的厂商很有用处。

Android定制Home,以及launcher的自定义相关推荐

  1. Android 定制自己的launcher

    launcher是安卓系统中的桌面启动器,安卓系统的桌面UI统称为Launcher.Launcher是安卓系统中的主要程序组件之一,安卓系统中如果没有Launcher就无法启动安卓桌面,Launche ...

  2. Android定制实现上网限制iptables

    随着智能手机和平板的普及,现在的孩子几乎人手一部手机或平板,所以常常能看到一些孩子抱着手机玩游戏或是浏览网页,一玩就是一整天,家长们不免担心自己的孩子是不是会浏览不适合他们看的网页?是不是玩的时间太长 ...

  3. Android定制组件之图文展示之中国好声音

    传送门☞轮子的专栏☞转载请注明☞http://blog.csdn.net/leverage_1229 今天我们学习如何自定义TextView组件,让它既能显示文本,又能显示图像,达到"图文并 ...

  4. Launcher 记录自定义桌面

    Launcher 记录自定义桌面 自定义桌面数据的创建.更新和删除. 前置文章 <Launcher的启动过程 > < Launcher界面结构 > <Launcher拖拽 ...

  5. Android基于高德SDK的开发——自定义地图主题样式(悬浮按钮+底部弹窗)

    日常的地图使用中,平台一般只会给我们提供地图的标准样式,造成了一定程度上的审美疲劳,那么如何实现地图的自定义样式呢?本文使用Android Studio 4.1,给开发者提供了一个基于高德地图SDK进 ...

  6. Android定制争夺战 三大主流ROM横评

    随着MIUI在广大"机油"们心目中位置的逐渐攀升,越来越多的厂商也相继推出了属于自己的定制Android ROM,想以此来抢占这一新兴市场,像点心OS.腾讯的Tita以及近期比较热 ...

  7. android 定制

    Launcher 总结: 1.launcher的布局太居中,要想两边拉伸 <\packages\apps\Launcher2\res\values\dimens.xml> <dime ...

  8. Android View体系(十)自定义组合控件

    相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源 ...

  9. android开发出现No Launcher activity found!解决方案

    android开发出现No Launcher activity found!解决方案 参考文章: (1)android开发出现No Launcher activity found!解决方案 (2)ht ...

最新文章

  1. App开放接口api安全:Token签名sign的设计与实现
  2. python爬虫beautifulsoup实例-Python爬虫学习(二)使用Beautiful Soup库
  3. ubuntu下的win交叉编译
  4. GDB调试:观察点(数据断点)【GDB调试】
  5. linux硬链接不能创建目录,为什么硬链接不允许用于目录?
  6. 如何把winPE装到硬盘隐藏起来
  7. linux中的ftp是什么意思,什么是linux的ftp
  8. pprof 的原理与实现
  9. python返回unicode_我们如何从python中的字形id获取unicode?
  10. 【启智树NOIP模拟】奇偶【卢卡斯定理】【背包】【bitset】
  11. css3自适应布局单位vw,vh你知道多少?
  12. bzoj 1800: [Ahoi2009]fly 飞行棋
  13. 推荐一款基于bootstrap的漂亮的前端模板—inspinia_admin
  14. Betwin实现电脑一分为二
  15. word中-文字尾部空格自动添加下划线的步骤
  16. 211逆袭浙大-计算机及相关衍生专业保研之路纪实(深度长文,收藏了)
  17. 单片机延时程序分析(汇编详细版)
  18. LeetCode刷题记 --- pta 7- 4
  19. 企业品牌私域化运营,私域流量只是起步
  20. matlab之ARMA(p,q)模型

热门文章

  1. 新唐芯片学习笔记——GPIO
  2. 美国IT业第一季度裁员4.9万人 失业率超过5%
  3. Android 打开 GPS 导航并获取位置信息
  4. matlab中Cci,MATLAB量化交易策略之 CCI择时
  5. 【转】俞敏洪演讲:度过有意义的生命
  6. 基于php的乐山旅游攻略网站
  7. React Native 实现chat 即时聊天(第1天)
  8. 电子商务编程C语言考试,计算机络级计算机的络与电子商务专业《c语言程序设计》试卷.doc...
  9. ubuntu进入系统黑屏问题
  10. 美拍应该如何引流?如何利用美拍引流?美拍引流方法