DisplayàDaydream勾选Clock,点击旁边的Settings button,出现”Settings已终止”;
解决思路
1. 进入package/apps/Settings/src/com/android/settings/DisplaySettings.java
找到他加载的preference.xml 为display_settings
2 查找xml/display_setting内容 很明显可以知道 Daydream对应的preference为screensaver
其对应的标签fragement 为"com.android.settings.DreamSettings" 说明点击Daydream会直接进入这个类
3 查看com.android.settings.DreamSettings 因为界面内容类似ListView,所以找到相关Adapter的getView,从中找到相应的setting button
对应的事件时调用DreamBacked.launchSettings
4 进入DreamBacked.java 中的launchSettings方法,直接通过设置Compoment启用intent,Compoment数据从getSettiingsCompoment获取
getSettiingsCompoment 执行 XmlResourceParser parser = resolverInfo.serviceinfo.loadXmlMedaData(pm.DreamService.Dream.META_DATA)
加载相关xml,解析其中的数据v
其中 resolver 在getDreamInfos函数中是过滤了Intent action为DreamService.SERVICE_Interface(android.service.dreams.DreamService)
和PackageManager.get_META_DATA,
然后就去系统所有的AndroidManifest搜索Intent 为"android.service.dreams.DreamService" ,DeskClock正好找到,并且meta_data 中指定了所需解析的xml文件,在xml/dream_info中的内容就是需要的compoment
我们发现其内容为“com.google.android.deskclock/com.android.deskclock.ScreensaverSettingsActivity”
很明星包名中的红色字体是多余的
收获:从解这个问题,也可以知道Android中的某个app是可以解析其他app的xml文件的 通过intent和meta_data来关联