Android开发入门之Appwidget用法分析
本文实例讲述了AndroidAppwidget用法。分享给大家供大家参考,具体如下:
AppWidgets是一个小型应用程序的View 他可以嵌入到其他应用程序中(如桌面程序)并且可以得到周期性刷新。
在创建AppWidget之前需要了解以下几个概念
AppWidgetProviderInfo对象
它是对AppWidget元数据的一个描述,譬如AppWidget的布局,刷新频率,以及 AppWidgetProvider类 这些元数据都是定义在XML中。
AppWidgetProvider类的实现
对于AppWidget定义了(回调接口)一些基本的方法,这些方法都是基于广播事件(broadcastevents),,通过它,当AppWidget更新,创建,无效,卸载时,你可以接收广播。
Viewlayout
为AppWidget定义初始布局,用XML来布局
另外,你可以为AppWidget实现一个配置的Activity,这是一个可选择的Activity,在用户添加你的AppWidget准备创建时允许他修改或者配置AppWidget。
下面我们就开始创建一个AppWidget
①在Manifest声明AppWidget
首先,在AndroidManifest.xml中声明 AppWidgetProvider
<receiverandroid:name="ExampleAppWidgetProvider"> <intent-filter> <actionandroid:name="android.appwidget.action.APPWIDGET_UPDATE"/> </intent-filter> <meta-dataandroid: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定义了一些最基本的数据,譬如布局的最小尺寸,初始化布局资源,怎样更新AppWidget,以及在创建appWidget时的可配置Activity(可选)
要定义一个AppWidgetProviderInfo对象可以用XML资源文件定义,保存在res/xml/自己的文件名,XML文件中用一个单一的元素<appwidget-provider>请看下面的例子:
<appwidget-providerxmlns: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:指定AppWidget布局资源文件
Configure:在创建AppWidget时为他配置属性的activity
updatePeriodMillis:appwidget更新频率
③创建AppWidget布局
你必须为你的AppWidget定义个初始化布局文件,可以将布局文件放在res/layout/directory。你可以设计你的AppWidget用下面列出来
的View对象,但是在你设计开始之前,请你熟读AppWidgetDesignGuidelines.
如果你熟悉XMLLayouts,那么创建一个AppWidget将会是简单的,然而,你必须意识到AppWidget布局是基于RemoteViews,它并不是支持每一种layout和Viewwidget。
一个RemoteView对象只能支持下面几种layout布局类:
FrameLayout LinearLayout RelativeLayout
支持下面几种widget类:
AnalogClock Button Chronometer ImageButton ImageView ProgressBar TextView ViewFlipper ListView GridView
StackView AdapterViewFlipper
PS:这些类的继承类也是不被支持的。
下面是我本次写的demo中的Appwidget
功能很简单只为初步理解AppWidget,响应Appwidget上按钮事件
packagecom.manymorere.appwidget; importandroid.app.PendingIntent; importandroid.appwidget.AppWidgetManager; importandroid.appwidget.AppWidgetProvider; importandroid.content.ComponentName; importandroid.content.Context; importandroid.content.Intent; importandroid.widget.RemoteViews; publicclassExampleAppWidgetProviderextendsAppWidgetProvider{ privatestaticfinalStringACTION="com.manymore.appwidget"; privateintid; @Override publicvoidonDeleted(Contextcontext,int[]appWidgetIds){ System.out.println("onDeleted"); super.onDeleted(context,appWidgetIds); } @Override publicvoidonDisabled(Contextcontext){ //TODOAuto-generatedmethodstub System.out.println("onDisabled"); super.onDisabled(context); } @Override publicvoidonEnabled(Contextcontext){ //TODOAuto-generatedmethodstub System.out.println("onEnabled"); super.onEnabled(context); } @Override publicvoidonReceive(Contextcontext,Intentintent){ System.out.println("onReceive"); //自己定义的ACTION if(intent.getAction().equals(ACTION)) { RemoteViewsremoteView=newRemoteViews(context.getPackageName(),R.layout.appwidget_layout); remoteView.setCharSequence(R.id.button,"setText","22222222222222"); AppWidgetManagerappWidgetManager=AppWidgetManager.getInstance(context); ComponentNamecomponentName=newComponentName(context,ExampleAppWidgetProvider.class); appWidgetManager.updateAppWidget(componentName,remoteView); System.out.println("收到自定义ACTION"); }else{ super.onReceive(context,intent); } } @Override publicvoidonUpdate(Contextcontext,AppWidgetManagerappWidgetManager, int[]appWidgetIds){ intN=appWidgetIds.length; for(inti=0;i<N;i++) { intappWidgetId=appWidgetIds[i]; Intentintent=newIntent(ACTION); PendingIntentpendingIntent=PendingIntent.getBroadcast(context,0,intent,0); RemoteViewsremoteViews=newRemoteViews(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()方法然后会注册里面的ButtonOnclick事件,当你点击该按钮时会发送一个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程序设计有所帮助。