本文实例讲述了android appwidget用法。分享给大家供大家参考,具体如下:
app widgets 是一个小型应用程序的view 他可以嵌入到其他应用程序中(如 桌面程序) 并且可以得到周期性刷新。
在创建app widget之前需要了解以下几个概念
appwidgetproviderinfo对象
它是对app widget 元数据的一个描述,譬如 appwidget的布局,刷新频率,以及 appwidgetprovider 类 这些元数据都是定义在xml中。
appwidgetprovider 类的实现
对于app widget定义了(回调接口)一些基本的方法,这些方法都是基于广播事件(broadcast events ),,通过它,当app widget更新,创建,无效,卸载时,你可以接收广播。
view layout
为app widget定义初始布局,用xml来布局
另外,你可以为app widget 实现一个配置的activity,这是一个可选择的activity,在用户添加你的app widget 准备创建时允许他修改或者配 置app widget 。
下面我们就开始创建一个app widget
① 在manifest声明app widget
首先,在androidmanifest.xml中声明 appwidgetprovider
<receiver android:name="exampleappwidgetprovider" > <intent-filter> <action android:name="android.appwidget.action.appwidget_update" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/example_appwidget_info" /> </receiver>
<receiver>元素需要android:name 属性,appwidgetprovider作为引用
<intent-filter> 元素务必要包含 <action>元素 然后action中要有android:name 属性,这个属性需要指定能接收 action_appwidget_update 广播的appwidgetprovider,也就是exampleappwidgetprovider 这个广播必须唯一 必须明确声明,因为appwidgetmanager会自动的发送所有其他应用程序的广播给appwidgetprovider,所以很重要。
<meta-data> 元素指定appwidgetproviderinfo资源需要以下属性
android:name -指定了元数据的名字,用android.appwidget.provider代表数据是appwidgetproviderinfo描述。
android:resource -引用appwidgetproviderinfo 资源的位置
总之一句话:在androidmanifest.xml主要声明概念中appwidgetprovider 和appwidgetproviderinfo
②添加appwidgetproviderinfo元数据
appwidgetproviderinfo为appwidgeet定义了一些最基本的数据,譬如布局的最小尺寸,初始化布局资源,怎样更新app widget,以及在创建app widget时的可配置activity(可选)
要定义一个appwidgetproviderinfo对象可以用xml资源文件定义,保存在res/xml/自己的文件名 ,xml文件中用一个单一的元素<appwidget-provider> 请看下面的例子:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minwidth="294dp" android:minheight="72dp" android:updateperiodmillis="86400000" android:previewimage="@drawable/preview" android:initiallayout="@layout/example_appwidget" android:configure="com.example.android.exampleappwidgetconfigure" android:resizemode="horizontal|vertical"> </appwidget-provider>
initiallayout:指定app widget布局资源文件
configure:在创建app widget时为他配置属性的activity
updateperiodmillis: appwidget更新频率
③ 创建app widget 布局
你必须为你的app widget定义个初始化布局文件,可以将布局文件放在 res/layout/directory。 你可以设计你的app widget用下面列出来
的view对象,但是在你设计开始之前,请你熟读app widget design guidelines.
如果你熟悉xml layouts ,那么创建一个app widget将会是简单的, 然而,你必须意识到app widget布局是基于 remoteviews ,它并不是支持每一种layout和view widget。
一个remoteview对象只能支持下面几种layout布局类:
framelayout linearlayout relativelayout
支持下面几种widget 类:
analogclock button chronometer imagebutton imageview progressbar textview viewflipper listview gridview
stackview adapterviewflipper
ps:这些类的继承类也是不被支持的。
下面是我本次写的demo中的appwidget
功能很简单只为初步理解appwidget ,响应appwidget上按钮事件
package com.manymorere.appwidget; import android.app.pendingintent; import android.appwidget.appwidgetmanager; import android.appwidget.appwidgetprovider; import android.content.componentname; import android.content.context; import android.content.intent; import android.widget.remoteviews; public class exampleappwidgetprovider extends appwidgetprovider{ private static final string action = "com.manymore.appwidget"; private int id; @override public void ondeleted(context context, int[] appwidgetids) { system.out.println("ondeleted"); super.ondeleted(context, appwidgetids); } @override public void ondisabled(context context) { // todo auto-generated method stub system.out.println("ondisabled"); super.ondisabled(context); } @override public void onenabled(context context) { // todo auto-generated method stub system.out.println("onenabled"); super.onenabled(context); } @override public void onreceive(context context, intent intent) { system.out.println("onreceive"); // 自己定义的action if(intent.getaction().equals(action)) { remoteviews remoteview = new remoteviews(context.getpackagename(),r.layout.appwidget_layout); remoteview.setcharsequence(r.id.button, "settext", "22222222222222"); appwidgetmanager appwidgetmanager = appwidgetmanager.getinstance(context); componentname componentname = new componentname(context, exampleappwidgetprovider.class); appwidgetmanager.updateappwidget(componentname , remoteview); system.out.println("收到自定义action"); }else{ super.onreceive(context, intent); } } @override public void onupdate(context context, appwidgetmanager appwidgetmanager, int[] appwidgetids) { int n = appwidgetids.length; for(int i = 0; i<n; i++) { int appwidgetid = appwidgetids[i]; intent intent = new intent(action); pendingintent pendingintent = pendingintent.getbroadcast(context, 0, intent, 0); remoteviews remoteviews = new remoteviews(context.getpackagename(),r.layout.appwidget_layout); remoteviews.setonclickpendingintent(r.id.button, pendingintent); appwidgetmanager.updateappwidget(appwidgetid, remoteviews); system.out.println(appwidgetid); } super.onupdate(context, appwidgetmanager, appwidgetids); } }
每次添加appwidget实例 都会调用onupdate()方法 然后会注册里面的button onclick事件,当你点击该按钮时会发送一个broadcast,这个broadcast是自己定义的,然后onreceive方法会收到该broadcast,然后再做出一些反应,我这里是把修改了textview上的text。
由于appwidget和本身的应用,虽然是在一个程序中,但运行时,它们并不是在一个进程中,所以在在调用方法和修改界面上多少会有点限制,没有普通的(activity上对view的一些操作)那么自由,所以想对appwidget上的view做一些操作,或者更新appwidget,一般需要用到remoteviews,appwidgetmanager 同时可能还会用到componentname
个人理解:remoteviews在创建时主要代表一个appwidget实例中view的一个集合 ,而componentname则代表一个整个appwidget实例
完整实例代码点击此处。
更多关于android相关内容感兴趣的读者可查看本站专题:《android编程之activity操作技巧总结》、《android资源操作技巧汇总》、《android文件操作技巧汇总》、《android操作sqlite数据库技巧总结》、《android操作json格式数据技巧总结》、《android数据库操作技巧总结》、《android编程开发之sd卡操作方法汇总》、《android开发入门与进阶教程》、《android视图view技巧总结》及《android控件用法总结》
希望本文所述对大家android程序设计有所帮助。
如对本文有疑问, 点击进行留言回复!!
Error running app: Default Activity Not Found
如何用HMS Nearby Service给自己的App添加近距离数据传输功能
BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》(四)
网友评论