1.如图所示,直接创建一个widget,一直下一步即可
创建好后 会生成响应的布局xml文件
xml文件下会生成一个配置的文件
点开之后会看见一些配置,initiallayout指定引用的布局,previewImage是展示给调用者看的界面效果图片,直接引用即可,updatePeriodmillis是默认的界面更新时间,官方默认30分钟,当设置小于30分钟时候,自动转成30分钟,如果你要实时刷新,只能写到service里边
manifest里会生成一个receiver,
至此一个widget就生成了。如果你要手动生成一个,需要把这些文件都创建了,不能有遗漏。现在打开桌面小部件,就会看到一个你新建的widget
2.点击事件,我们可以看到大多数应用的app提供的widget都是可以点击互动的。接下来我们就开始写一下点击事件
2.1.我们先了解一个类PendingIntent
那么PendingIntent是什么?我的理解是可以让外部程序执行当前程序的意图。
因为PendingIntent持有当前app的context引用,所以,它与Intent的区别有,它可以在外部执行PendingIntent里面的Intent。
Intent是立即执行,PendingIntent不是立刻执行的。
2.2.如何使用PendingIntent?
可以通过PendingIntent.getActivity(Context context,int RequestCode,Intent intent,int flags),或者getBroadcast()、getService()去获取实例。
根据pending获取的实例,就是我们可以做的三个点击事件
2.3.1跳转activity
简单的一个线性布局
java代码如下图,新建一个RemoteViews ,这里调用settextViewText方法去更改了一下textview的值,创建一个PendingIntent 传入一个Intent和context
最关键的一步来了,就是绑定点击事件 setOnClickPendingIntent。传入id和pendingIntent,顾名思义,就是在点击这个View时候,执行之前准备好的intent
这是不带参数的时候,跳转activity
带参数的时候将PendingIntent的最后一个参数改成PendingIntent.FLAG_CANCEL_CURRENT
最后调用 appWidgetManager.updateAppWidget(appWidgetId,views);更新一下界面即可,每当我我们要改变界面的时候都不要忘了更新界面这句话。
2.3.2开启服务
代码和上边差不多。首先新建一个服务,这里就不说如何创建了,依旧是通过PendingIntent类的getService来获取一个服务的实例,然后绑定点击id
2.3.3发送按钮动作action
这次点击按钮我们发送一个动作,当然这要先在manifest注册动作
动作注册好了,我们将他打包发送过去
说一下如何接收 重写onrecevie方法,这里我通过判断动作改一下图片显示,首先还是新建remoteviews,调用更改图片资源的方法,最后更新一下界面,刚在updateAppWidget里我们直接调用更新即可,但是在外边如何调用?
//获得appwidget管理实例,用于管理appwidget以便进行更新操作
AppWidgetManagermanger=AppWidgetManager.getInstance(context);
// 相当于获得所有本程序创建的appwidget
ComponentNamethisName=newComponentName(context,NewAppWidget.class);
//更新widget
manger.updateAppWidget(thisName,remoteViews);
现在我们就更新好了,可以运行一下试试了
总结:通过这一篇文章我学会了创建一个widget,和点击事件。快去给你得应用也填上widget试试吧 下次我们讲讲如何自己编写一个app动态读取别人提供的widget。
代码地址 github.com/daixa/WidgetCreate/tree/master/MyClickWidget