Android系统企业级定制

在做Android产品开发的过程中,经常会有客户说:“我们不想让我们的产品开机后看到Android系统的桌面,我们希望设备开机会直接进入我们自己的程序“。“我们的产品就是直接面对最终用户的,其它的无关的功能不需要。”比如说,之前我们开发的一款社区医疗软件,通过蓝牙和心电仪、血糖仪等采集外设通信,客户要求开机进入医疗软件,通过底层蓝牙通信,我们采用的就是定制的Android平板的桌面。

通常定制应用程序开机启动有两种实现方式:

Ø  接收系统启动广播:BOOT_COMPLETED,在广播接收器代码里实现应用程序的启动。

Ø  编写一个桌面程序,替换掉系统默认的Launcher应用。

第一种方式实现简单,但是这个应用程序是在Android系统桌面出现之后再启动的,不是真正意义上的产品定制,并且,如果当前的应用程序崩溃了退出后,会回到桌面上,当然我们可以实现崩溃后再次重新启动,但是,这终究不是真正意义上的定制。

第二种实现方式思路:当系统启动完毕之后,系统会发出一个Actionandroid.intent.action.MAINcategoryandroid.intent.category.HOMEIntent,默认系统的Launcher桌面会响应这个Intent,那么,我们可以编写一个应用程序,让它去响应这个Intent,然后我们将这个应用程序替换掉系统默认的Launcher桌面。系统重新启动之后,会自动启动我们自己的应用。但是,如果一些非法程序也响应这个Intent,那么照样不能达到客户的目的。这个时候,我们就要去修改系统框架代码,让Android系统启动完毕之后发送我们自己定义的Intent而不是公开的categoryHOME Intent

思路如下:

Ø  添加一个新的categoryandroid.intent.category.FS_HOME

Ø  将框架里面所有发送android.intent.category.HOMEIntent全部改成android.intent.category.FS_HOME

category的定义文件在:

@ frameworks/base/core/java/android/content/Intent.java

[java]  view plain copy
  1. 2218     /** 
  2. 2219      * This is the home activity, that is the first activity that is displayed 
  3. 2220      * when the device boots. 
  4. 2221      */  
  5. 2222     @SdkConstant(SdkConstantType.INTENT_CATEGORY)  
  6. 2223     public static final String CATEGORY_HOME = "android.intent.category.HOME";  

CATEGORY_HOME后面添加下面两行代码:

[java]  view plain copy
  1. 2224     @SdkConstant(SdkConstantType.INTENT_CATEGORY)  
  2. 2225     public static final String CATEGORY_FS_HOME = "android.intent.category.FS_HOME";  

通过grep CATEGORY_HOME frameworks/ -R命令查找所有使用CATEGORY_HOME的文件:

[plain]  view plain copy
  1. ./frameworks/ex/carousel/test/src/com/android/carouseltest/TaskSwitcherActivity.java  
  2. ./frameworks/base/services/java/com/android/server/am/ActivityManagerService.java  
  3. ./frameworks/base/services/java/com/android/server/am/ActivityRecord.java  
  4. ./frameworks/base/services/java/com/android/server/UiModeManagerService.java  
  5. ./frameworks/base/tests/StatusBar/src/com/android/statusbartest/NotificationTestList.java  
  6. ./frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java  
  7. ./frameworks/base/policy/src/com/android/internal/policy/impl/RecentApplicationsDialog.java  
  8. ./frameworks/base/packages/SystemUI/src/com/android/systemui/recent/RecentTasksLoader.java  

将文件里使用CATEGORY_HOME常量的地方全部改为CATEGORY_FS_HOME

新建一个Android应用:MyLauncher,在其AndroidManifest.xml里,<intent-filter>标签里添加上响应CATEGORY_FS_HOME的代码:

[html]  view plain copy
  1. <span style="font-size:10px;"><activity android:name=".MyLauncherActivity">  
  2.         <intent-filter>  
  3.                 <action android:name="android.intent.action.MAIN" />  
  4.                 <category android:name="android.intent.category.FS_HOME" />  
  5.                    <category android:name="android.intent.category.DEFAULT" />  
  6.         </intent-filter>  
  7. </activity></span>  

重新编译frameworks/baseframeworks/ex

[plain]  view plain copy
  1. $ source build/envsetup.sh  
  2. $ make  

重新运行模拟器,使用新编译的Android系统,可以看到系统启动起来就进入我们的MyLauncher应用,从实现实现桌面的替换。

 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值