安卓小组件的简单应用

         安卓手机小部件(widget)就是可以在手机桌面上运行显示的快捷小程序功能,如天气在桌面显示、功能开关在桌面显示等等。不需要再运行程序便可以操作。下面以简单的实例,简单的介绍下widget的用法

widget的创建一般需要四个步骤:

1.写布局文件(显示在手机桌面的样式,都在此布局文件中设置)


该处省略布局文件的截图,该实例布局文件根元素为LinearLayout,在该布局下有两个TextView 和一个Button,注意为三个控件添加Id,在接下来代码中要通过Id找到对应的控件。


***注意:对于widget的布局文件有限制!不是所有的组件都能够使用的。   
       容器类视图目前只支持四种:LinearLayout,RelativeLayout,FrameLayout,GridLayout
       容器类目前支持的视图组件:
             AnalogClock 模拟时钟
             ChronoMeter 电子时钟、计时器
             Button
             ImageButton
            TextView
             ImageView
             ViewFlipper
         等(随着SDK版本的迭代,可支持的视图数量在增加)

不能用的:自定义视图一概不能用(View)
          上述可用视图的子类一概不能用          (比如EditText)

2.写一个描述文件,用来描述widget的一些属性(在res/xml文件夹下新建xml文件,资源类型为APPWidget   Provider)
有四个属性必须声明(其他属性可根据自己的业务进行酌情添加):


        第一/二个属性:minWidht/minHeight:小组件拖动到屏幕上之后,系统会根据你指定的这两个值估算会占用多少格。
屏幕上会被系统划分为4*4个格子,每个格子具体尺寸,根据屏幕尺寸和密度的不同会有所
差异。Google早期给出了一个minWidth/minHeight的经验计算公式:70*n-30 dp(例如你需要占4X1(宽X高)的格子,需要设置宽为70x4-30=250dp,同理高度为40dp)
在高密度大尺寸屏幕下还有一个经验公式:74*n-2


第三个属性:updatePeriodMillis :系统会按照该时间间隔,通过发送系统广播的方式,来更新Widget的显示内容。发送的系统广播的action是android.appwidget.action.APPWIDGET_UPDATE,widget一旦受到该广播,会调用onUpdate方法。
updatePeriodMillis指定的时间间隔不得低于30分钟所对应的毫秒值。低于该值,则设定无效,系统依然会每隔半小时发送一次广播。

第四个属性:initialLayout  从字面的意思来理解该属性的作用是初始化widget的布局文件(在第一步骤中创建的布局文件)

3.在源文件中写一个类,继承自AppWidgetProvider类
通常需要重写5个方法:


onReceive:用来收广播,对广播进行处理
onEnable:当前仅当,第一个Widget被拖到桌面上的时候,该方法会被调用。在第一个widget被拖到到桌面的时候,系统会发送系统广播,onReceive方法收到该广播后会调用onEnable方法。
onUpdate:当Widget被拖动桌面上,该方法都会被调用一次。widget被拖到到桌面的时候,
系统会发送系统广播,onReceive方法收到该广播后会调用onUpdate方法。然后,每隔updatePerioidMillis时间,系统还会发送一次系统广播,该方法依然会被调用一次。


onDeleted:当一个Widget从桌面上被删除的时候,该Widget的onDeleted方法会被调用。

onDisable:当且仅当最后一个Widget从桌面上删除的时候,该Widget除了onDeleted方法会被调用之外,它的onDisable方法也会被调用。


在本案例中,只用到OnReceive方法和OnUpdate方法,具体设置如下图所示:


4.在AndroidManifest文件中,“注册”第3步写好的类

注册时使用的标签是<receiver>
需要至少指明1个可以接收的广播action(在该案例中需要添加service发来的广播action)
 <intent-filter>
 <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>

<action android:name="com.tarena.UPDATE_WIDGET"/>//service发来的广播action
 </intent-filter>
同时还必须声明一个<meta-data>标签:
 <meta-data
android:name="android.appwidget.provider"
android:resource="@xml/mywidget"
/>
有该标签才能说明,这是一个Widget而不是一个BroadcastReceiver



以上为设置widget的四个步骤,在本案例中,需要在往手机桌面添加widget的时候开启一个服务,然后服务通过定时发送广播的形式更新widget的textView值,服务的代码如下图所示:


以上为本案列的所有解释和部分代码,该案例的运行效果为,为手机桌面添加一个widget,触发onUpdate方法,该方法中为widgetButton添加一个监听,第一次点击创建一个服务,在该服务的OnCreate(服务创建该方法只执行一次)新建一个线程,该线程的作用是只要线程不销毁的情况下每过两秒发送一个广播给widget进行第一个数据的更新,每点击按钮的时候,调用service中的onStartCommand方法进行第二个TextView内容的更新!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值