1、General

抽象类StateTracker

每个按钮实现一个StateTracker的子类(亮度按钮特殊处理不实现该类):

WifiStateTracker

BluetoothStateTracker

GpsStateTracker

SyncStateTracker

2、创建流程:

1、将PowerSave widget 拖出来后,系统调用回调onUpdate

// Update each requested appWidgetId

RemoteViews view = buildUpdate(context);

for (int i = 0; i <appWidgetIds.length; i++) {

appWidgetManager.updateAppWidget(appWidgetIds[i], view);

}

appWidgetManager.updateAppWidget(appWidgetIds[i],view)为调用系统函数不做解释。

BuildUpdate:

1、创建一个RemoteViews 指定layout

views =new RemoteViews(context.getPackageName(),R.layout.widget);

2、设置按键响应

views.setOnClickPendingIntent(R.id.btn_wifi,getLaunchPendingIntent(context,BUTTON_WIFI))

views.setOnClickPendingIntent(R.id.btn_wifi,getLaunchPendingIntent(context,BUTTON_BT))

………………..

3、获取各种Wifi BT等状态,更新图标

updateButtons

4、Done

updateButtons

sWifiState.setImageViewResources(context,views);

sBluetoothState.setImageViewResources(context,views);

……

setImageViewResources为抽象父类实现。

1、  获取按钮和按钮下面指示器的id

getButtonId()、getIndicatorId()此两者子类负责实现,提供给父类id信息

2、  获取指示器的位置(左中右),父类默认为中、wifi为重写该方法,返回左

3、  getTriState获取开、关、切换中三种状态 该方法调用子类的getActualState方法,负责返回所代表部件的状态。PS: getActualState返回的是五种状态之一:开、关、正在开、正在关、未知状态(异常)。getTriState将五种状态转换成三种状态,以供指示器显示。

4、  根据以上三步收集的信息 调用views.setImageViewResource绘出按钮以及指示器

创建流程至此结束。

2、widget如何响应按钮事件

由于widget里面是RemoteViews,所以没有OnClickListener,只能通过intent发送给Host来执行

先来看下创建是设置的getLaunchPendingIntent,

launchIntent.addCategory(Intent.CATEGORY_ALTERNATIVE);

launchIntent.setData(Uri.parse("custom:" + buttonId));

PendingIntent pi =PendingIntent.getBroadcast(context, 0 /* no requestCode */,

launchIntent, 0 /* no flags*/);

可以看出,intent携带了buttonId的数据来区别到底是哪个按钮事件,然后getBroadcast表明,按键事件将通过broadcast事件来通知widget。在onReceive中

else if (intent.hasCategory(Intent.CATEGORY_ALTERNATIVE)){

Uri data = intent.getData();

int buttonId = Integer.parseInt(data.getSchemeSpecificPart());

if(buttonId == BUTTON_WIFI) {

sWifiState.toggleState(context);

}

else if (buttonId == BUTTON_BRIGHTNESS) {

toggleBrightness(context);

}else if (buttonId == BUTTON_SYNC) {

sSyncState.toggleState(context);

}

}

ToggleState

1、获取当前部件的状态。getTriState,根据当前状态确定是否需要进行状态切换

2、如果需要状态切换,调用子类的requestStateChange,子类负责切换所代表部件的状态。由于切换状态需要与硬件、网络交互。耗时长,所以内部使用AsyncTask进行异步切换

3、widget如何感知外部状态的变化

当用户在设置里面更改了Wifi、BT等状态,widget如何能及时知道,并修改按钮的图片

当外部状态变化时,widget的onReceive将收到消息,如果该部件不是通过broadcast来发送消息的,那么就注册一个Observer来监视该部件的变化(如亮度按钮)

根据intent识别是哪个部件发生变化

String action =intent.getAction();

if(WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {

sWifiState.onActualStateChange(context,intent);

} else if(BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {

sBluetoothState.onActualStateChange(context, intent);

}

………………..

updateWidget(context);

子类调用onActualStateChange,由于是外部发生变化,子类不需要其他操作,所以onActualStateChange实现没做什么事情。

updateWidget(context);内部调用buildUpdate来更新按钮状态

android原生widget 电量控制(PowerSave)设计浅析相关推荐

  1. 远程终端 android,基于Android的远程家电控制终端设计

    (3)应用程序框架层 应用程序框架层为开发者提供开发所需的各种API,常用的组件有:UI组件.Content Providers(提供一种使应用程序之间可以实现数据互相访问和共享的服务).资源管理(管 ...

  2. android 键盘风格,小键盘大细节:浅析Keyboard在移动产品中的设计

    虚拟键盘即Keyboard,在移动端我们无时无刻不在与它打交道.它并不是真实的物理键盘,而是在屏幕内拥有键盘样式和功能的控件,可以按需随时改变样式和位置.在文本输入的交互操作中,移动端虚拟按键的交互体 ...

  3. Android实现电量控制降低耗电

    Android实现电量控制降低耗电? 如何才能降低Android应用程序的耗电量呢? 如何有效地控制耗电量问题? 这一个接一个的问题,都和电池的电量有关,下面我们进行详细的有关分析: Android手 ...

  4. android studio 课程表,基于课程表的安卓Android手机控制APP设计(AndroidStudio,SQLite)(含录像)...

    基于课程表的安卓Android手机控制APP设计(AndroidStudio,SQLite)(含录像)(毕业论文12000字,程序代码) 摘 要 随着IT技术的发展,以前老套的课程表内容查询管理方式已 ...

  5. 符号执行android,基于符号执行的android原生代码控制流图提取方法symbolic.pdf

    基于符号执行的android原生代码控制流图提取方法symbolic 第3 卷第7 期 网络与信息安全学报 Vol.3 No.7 2017 年7 月 Chinese Journal of Networ ...

  6. android 电量控制

    这个插件是属于设置的一部分,可以在 1 packages\apps\Settings\res\drawable-hdpi 这个文件夹里面查看,呵呵,有没有看到上面目录的斜杠方向,懂吧. 这里找到一个文 ...

  7. android实现电量控制,Android 删除/定制桌面电量控制插件

    这个插件是属于设置的一部分,可以在 packages\apps\Settings\res\drawable-hdpi 这个文件夹里面查看,呵呵,有没有看到上面目录的斜杠方向,懂吧. 这里找到一个文件名 ...

  8. Android原生系统开发如何优雅的提供系统级的API供第三方程序调用?

    目录 故事背景 二.开发步骤 Step1.添加一个专属系统级服务 2.1.1.模仿Android原生服务接口,如WifiManager,规划自己的Manager 2.1.2.为我们的Manager生成 ...

  9. 基于Android的期刊投稿网站的设计与开发

    摘 要 在我国,3G/4G移动互联网技术飞速发展,甚至第五代移动通信网络也正在研究中,手机的普及化让诸多行业有了改进的机遇.本课题借助于互联网和智能手机的飞速发展针对现在的期刊投稿情况,希望可以让作者 ...

最新文章

  1. easyui combogrid分页加载默认值时无法自动跳转到相应页的解决方案
  2. 25元、264KB内存的微处理器,树莓派官方出品,自带快速休眠模式
  3. python heapq模块使用
  4. python利器怎么编程-Linux 利器- Python 脚本编程入门(一)
  5. [O(N)的我不会]树网的核
  6. 两个时间计算毫秒在线_蹲坑英语时间之in a jiffy
  7. 磁盘与文件系统管理( 认识磁盘,了解磁盘,文件系统的建立与自动挂载)
  8. 奥尼尔的话剧《榆树下的欲望》
  9. 前端学习(285):移动端简单知识
  10. 数组复制速度 System.arraycopy()clone() Arrays.copyof() for()探究
  11. 用vs2011 编译 orchard 源代码
  12. vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess 1
  13. maya对象属性_了解每粒子属性和每对象属性
  14. Introduction to Oracle9i: SQL------- left join 和 left outer join 的区别
  15. Hadoop大数据开发技术
  16. Unity UGUI 流光特效
  17. 阿里云SFTP配置方法及故障排查
  18. 三分钟帮你集成极光推送——和那些你可能不知道的事
  19. 苹果系统中国日历服务器,ios日历中国节日不见了(2021年苹果日历订阅地址)...
  20. python列表转化为数字信号的过程_如何用python写一个简单的数字信号处理计算器(文章末公开代码)?...

热门文章

  1. C++ 家族关系查询
  2. 小白学 Python(23):Excel 基础操作(上)
  3. unity 2d文字跟随主角移动_使用 Unity 粒子系统实现 2D 人物足迹效果
  4. [转帖]奋斗5年 从月薪3500到700万!
  5. Vue手把手带你入门(一) nodejs安装配置以及vue-cli脚手架创建第一个vue项目(超级详细)
  6. 《通用版CISCO交换机配置命令及释义》——【全面、通用,含部分功能的注释】
  7. 程序员的十个等级(最详尽)
  8. bzoj 4833: [Lydsy1704月赛]最小公倍佩尔数
  9. 知数堂郑松华:MySQL 8.0 SQL优化之CTE 、窗口函数的应用
  10. Settings简介