商城网站建设服务,株洲制作网站,百度小程序还需要做网站吗,安徽省建设工程信息管理平台widget的概念最早是由一名叫Rose的苹果工程师提出#xff0c;后来经过多方面机缘巧合的发展下#xff0c;便有了今天Android平台上的小组件widget#xff0c;一般APP开发可能应用场景较少#xff0c;最常见的莫过于天气APP的widget。但对于从事IOT或车载方向的同学#xf…widget的概念最早是由一名叫Rose的苹果工程师提出后来经过多方面机缘巧合的发展下便有了今天Android平台上的小组件widget一般APP开发可能应用场景较少最常见的莫过于天气APP的widget。但对于从事IOT或车载方向的同学定制化Launcher涉及修改的widget的相关业务则可能不少。
Android widget即桌面插件如下图红框所选中皆是插件 其启动、加载运行流程全在Launcher中其实现细节我们可以不关注如果想了解需翻阅Launcher源码只需要了解如何使用即可。实现步骤如下
1、创建布局
在res/layout/目录中创建相应布局
?xml version1.0 encodingutf-8?
RelativeLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_height200dpandroid:background#ccaImageViewandroid:idid/iconandroid:layout_width60dpandroid:layout_height60dpandroid:layout_centerInParenttrueandroid:srcdrawable/ic_launcher_round/TextViewandroid:idid/tv_widgetandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_belowid/iconandroid:text123android:layout_centerHorizontaltrue//RelativeLayout这里要注意的是widget中并不支持所有布局控件目前所支持的布局如下
FrameLayout
LinearLayout
RelativeLayout
GridLayout所支持的控件如下
AnalogClock
Button
Chronometer
ImageButton
ImageView
ProgressBar
TextView
ViewFlipper
ListView
GridView
StackView
AdapterViewFlipper不支持自定义View、这些类的子类以及包括RecyclerView在内的其他没有声明的控件是的这些都不支持。
2、创建配置文件
在res/xml/目录中创建相应文件
?xml version1.0 encodingutf-8?
appwidget-provider xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:minHeight180dpandroid:minWidth300dpandroid:previewImagedrawable/ic_launcher_backgroundandroid:initialLayoutlayout/layout_widget_infoandroid:updatePeriodMillis10000android:resizeModehorizontal|verticalandroid:widgetCategoryhome_screen/appwidget-provider其各参数含义如下 ·minWidth 、 minHeightwidget的最小宽、高在Launcher上widget可以通过拉伸宽高来改变尺寸大小。
·previewImage添加widget前的预览图片。
·initialLayoutwidget所使用的布局。
·updatePeriodMilliswidget更新周期时间。(在 1.6 以后的版本中Google从省电的角度规定当 updatePeriodMillis 设置的值小于30min时就会失效。也就是通过设置这个属性值最短的更新间隔是30min。)
·resizeModewidget尺寸调整规格、拉伸方向“horizontal代表可以水平拉伸“vertical”代表可以竖向拉伸“none”代表不能拉伸默认为none”。
·widgetCategorywidget的显示区域“home_screen” 或 “keyguard”。
3、创建AppWidgetProvider
widget的功能都是通过AppWidgetProvider实现的先继承此类然后复写相关方法例如
public class MainWidgetProvider extends AppWidgetProvider {Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {super.onUpdate(context, appWidgetManager, appWidgetIds);}Overridepublic void onEnabled(Context context) {super.onEnabled(context);}Overridepublic void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions);}Overridepublic void onDeleted(Context context, int[] appWidgetIds) {super.onDeleted(context, appWidgetIds);}Overridepublic void onDisabled(Context context) {super.onDisabled(context);}Overridepublic void onReceive(Context context, Intent intent) {super.onReceive(context, intent);}
}其个参数含义如下
·onUpdate()用户添加widget时或者根据updatePeriodMillis定义的刷新时间到了的时候会调用此函数刷新可以在此函数里进行部分初始化刷新业务也可以在这里设置点击事件等。
·onEnabled()widget第一次被添加时调用比如用户添加widget后再删除再添加一次只有第一次添加的时候会回调。
·onDisabled()当最后一个widget在Launcher桌面上被移除后调用这时候适合做一些数据重置归零业务。
·onReceive()广播接收时调用。
·onAppWidgetOptionsChanged()widget 第一次添加或者拉伸等引起大小尺寸发生变化时调用该方法
·onDeleted()小插件被移除时会调用。亲测不是所有机型都有效
这里面最常使用的也就是onUpdate()和onReceive()了。
4、在AndroidManifest.xml中添加相关信息
我们观察下AppWidgetProvider的源码会发现这其实就是个广播类 因此我们的MainWidgetProvider 在清单文件中也要以广播的形式注册
receiverandroid:name.MainWidgetProviderandroid:label小组件intent-filteraction android:nameandroid.appwidget.action.APPWIDGET_UPDATE //intent-filtermeta-dataandroid:nameandroid.appwidget.providerandroid:resourcexml/widget_provider /
/receiver这里的android.appwidget.action.APPWIDGET_UPDATE 动作的广播是所有widget都会接受到的广播该广播根据android:updatePeriodMillis设定的间隔时间发出广播用于定时更新桌面上的所有窗口小部件部分机型可能无效。resource指定xml 目录下widget对应的布局文件。
其效果长按桌面选择自己的小组件长按拖拽到桌面的过程如下 总结
widget所有流程基本上全在这里了其余业务逻辑流程这里不再赘述。widget在部分机型上还拥有保活的功效比如OV没升鸿蒙之前的华为等当然你也有可能会发现在某些机型上部分API会失效因为控制这部分API的Launcher是各大厂商必改的apk之一如果想刷新widget还是得通过广播的形式同时注意进程的存活状态但是考虑到很多方法不一定会生效建议相关逻辑处理放到Service中。