命令行启动模拟器并以系统级程序方式安装运行launcher

以系统及程序的方式安装和运行Launcher,才能在Launcher启动的时候就让默认的AppWidget程序显示出来。否则将会出现

java.lang.SecurityException: bindGagetId appWidgetId=843 provider=ComponentInfo{com.android.quicksearchbox/com.android.quicksearchbox.SearchWidgetProvider}: User 10047 does not have android.permission.BIND_APPWIDGET 

这样的错误。

 

 

emulator -avd 1024_600_API8 -partition-size 128
——此处的 -partition-size 128 表示为 把system分区扩大为128MB,若有需要,此处可以设置为更大的system分区


adb remount
——使得/system分区可以进行写操作, 否则下面的push指令将会出现形如“failed to copy 'Launcher2_custom.apk' to system/app/Launcher2_meiling.apk': Read-only file system”的错误提示


adb push Launcher2_custom.apk /system/app

当不再需要这个定制化的Launcher apk的时候,直接 adb shell模式下删除/system/app下的对应apk文件即可


使用相同的原理,要使得某个AppWidget(例如ML的实时温控中心)开机即自动显示在桌面上,注解和步骤如下:

1、Launcher2源码的 res/xml/default_workspace.xml 中定义了Launcher中的各个子桌面的布局情况,每个子桌面对应于一个CellLayout(ViewGroup子类),每个CellLayout中又包含多个Cell,桌面上的每个组件都会在x/y方向上占用整数个Cell。

 

2、在Launcher2源码的Launcher.java中,定义如下:
    static final int SCREEN_COUNT = 4;  ——Launcher包含几个screen
    static final int DEFAULT_SCREEN = 0; ——Launcher启动后默认显示的是哪个screen
    static final int NUMBER_CELLS_X = 9; ——每个screen所对应的CellLayout中横向包括多少个Cells
    static final int NUMBER_CELLS_Y = 5; ——每个screen所对应的CellLayout中纵向包括多少个Cells

 


3、而在default_workspace.xml中添加的AppWidget的例子如下:

    <appwidget
        launcher:packageName="com.ml.apps"
        launcher:className="com.ml.apps.TimeTemperInfoReceiver"
        launcher:screen="0" ——在哪个screen中显示这个widget
        launcher:x="0"  ——这个AppWidget在screen中的起始cell-x
        launcher:y="0"  ——这个AppWidget在screen中的起始cell-y
        launcher:spanX="9" ——这个AppWidget在screen中的cell跨度-x
        launcher:spanY="5"  ——这个AppWidget在screen中的cell跨度-y
    />

 

4、上面在default_workspace.xml中添加的appwidget布局必须和对应应用程序中的AppWidget设定相适应,否则无法正确显示。AppWidget对应应用程序的res/xml/下包含一个widget布局描述文件,例如home_widget_provider.xml,对应内容如下:

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="
http://schemas.android.com/apk/res/android"
 android:minHeight="368dp" android:minWidth="664dp"
 android:initialLayout="@layout/cell_main" android:updatePeriodMillis="0">

</appwidget-provider>

 

注意: 此处在设置android:minHeight和android:minWidth的时候,实际是设置widget占据了多少个cell。 根据实践效果来看,貌似无论在dimens.xml文件中定义的workspace_cell_width 和 workspace_cell_height 的具体值是多少,在这里x和y方向一律按照每个cell 74dp 来设置android:minHeight和android:minWidth的值,即74×cell_numbers-2。例如上述(3)中定义的launcher:spanX="9",launcher:spanY="5",则在此处 android:minHeight="368dp"(5×74-2),android:minWidth="664dp"(9*74-2)


5、经过上述4步,基本工作就完成了,然后将AppWidget对应的应用程序和Launcher程序push进/system分区,即:
 adb push TimerTemperInfo.apk /system/app
 adb push Launcher2_meiling.apk /system/app

   即可。实践表明这两个apk程序push的顺序似乎没有什么影响

你可能感兴趣的:(命令行启动模拟器并以系统级程序方式安装运行launcher)