背景:
原生的aosp车载系统根本就不支持任何的appwidget,但是国内很多车机厂都有广泛适用appwidget的功能。
更多干货实战视频:https://www.bilibili.com/video/BV1ah411d7Y3/
明显左边的音乐,蓝牙电话等属于其他应用的画面,熟悉android手机同学就肯定知道,这个其实就是手机桌面上的appwidget。
移植小部件展示功能到车载桌面
1、首先确定车载系统是否有appwidget服务
确认方法可以通过如下命令:
emulator_car_x86_64:/ # service list | grep appwidget
如果系统有相关服务则有如下输出
emulator_car_x86_64:/ # service list | grep appwidget
53 appwidget: [com.android.internal.appwidget.IAppWidgetService]
如果没有,则显示一片空白,啥也没有
默认aosp情况其实是没有开放appwidget的,这里我们就需要考虑怎么开放appwidget功能
这里就需要对appwidget的加入servicemanager流程比较清晰:
其实它是在这里进行的启动加入,但是大家可以看到,这里其实是有判断条件的:
if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_APP_WIDGETS)
|| context.getResources().getBoolean(R.bool.config_enableAppWidgetService))
即系统是否有开放FEATURE_APP_WIDGETS或者说有config_enableAppWidgetService配置为true,正常手机FEATURE_APP_WIDGETS是有的,config_enableAppWidgetService为false,也就是说手机上其实靠有FEATURE_APP_WIDGETS这个Feature,而车机上没有是因为没有FEATURE_APP_WIDGETS这个Feature
那么我们就要考虑在车载要么 1、添加Feature 2、把config_enableAppWidgetService变成true
2选1即可以,这里我们选择简单一点的方案2,修改如下
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 31229e97024f..f46b0d3a76c0 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -3838,7 +3838,7 @@
<!-- True if the device requires AppWidgetService even if it does not have
the PackageManager.FEATURE_APP_WIDGETS feature -->
- <bool name="config_enableAppWidgetService">false</bool>
+ <bool name="config_enableAppWidgetService">true</bool>
<!-- True if the device supports Sustained Performance Mode-->
<bool name="config_sustainedPerformanceModeSupported">false</bool>
修改后进行整体编译,即可以有appwidget这个服务运行于整个系统了,那样才可以进行下一步的代码开发
2、在CarLauncher移植相关成为WidgetHost的代码
具体修改步骤如下:
1、准备好放置widget的layout,修改布局把左边空出一片区域,专门来放置widget
再接下来就是下图的几个步骤来实现
最后再把上面的layout.addView一下上面的mAppWidgetView
最后看一下相关的效果
左边是不是正常的展示出来时钟小部件
相关patch请关注公众号私聊我。