AppWidget就是桌面上显示天气,日期,时间那东西。有了它有些信息你就不需要点开另外的应用去获取了。
显示信息的进程是桌面程序,而提供信息和操作响应的是各个AppWidget的应用。它们运行在不同的进程,那么怎么把一个应用中的界面和相关操作信息在另外一个进程中实例化呢?
那就又回到android进程间通信:那肯定是binder了。为了使两个应用能断开关系,android主进程专门开了一个服务线程去管理他们俩个的关系。
具体的实现等有空了再瞅瞅源码,现在来看看怎么去使用他们。
1.那个服务线程必须知道,所有App Widget的信息,那就要求每个widget必须声明自己的信息,用最普遍的xml包括布局信息;
2.当你把一个widget拖到桌面时,桌面程序需要从服务线程中获取相关信息,并实例化界面对象;
3.实例化对象时,也要实例化它的操作相关信息,如点击操作之类;
4.其实是这样的,当桌面程序要在桌面上构建实例化一个界面并绑定事件时,会先向服务请求,服务再发信息给widget,widget需要把相关信息封装(布局了,点击事件了)在RemoteView中,然后报告给服务updateAppWidget,服务再把信息给桌面,桌面才能完成构造。
5.当一个点击事件发生时,一般是要发给widget信息,因为只有通过widget才能去调用updateAppWidget去更新桌面上那个显示的界面。在桌面程序中是干涉不了那个界面的。只有两种方式可以去改变它,一是它自身,二是widget。
6.为什么在widget中不能自定义view并传递给桌面?
通过实验发现,自定义的view在桌面中是找不到该类的,因为他们位于不同的进程,那为什么TextView可以呢?!
因为它在framework中,每个应用进程都可以访问它。
这就是公司同事解决的办法,自己写了个放到了framework中。
那为什么mtk居然在自己的package下的widget中放有自定义的view呢?
有待考察。
以上是现在的总结,等有空看看源码再来个重写。