Android Widget小组件开发
16lz
2021-01-23
用法步骤:
1.绘制Widget布局
2.配置Widget的基本属性
3.定义AppWidgetProvider类似于android中的广播
4.提供Configuration Acivity
学习一个小案例:时钟小组件
效果:可以自动更新时间,可以添加和删除时钟Widget
第一步:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="时间显示" /></LinearLayout>
第二步
在res文件夹下创建文件夹xml
在xml文件夹里创建配置文件
<?xml version="1.0" encoding="utf-8"?><appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/widget" android:minHeight="40dp" android:minWidth="100dp" android:updatePeriodMillis="800000" > <!-- 配置文件。设置最小宽度,最小高度,加载布局,设置刷新频率毫秒数(最小是30分钟) --></appwidget-provider>
第三步广播:
package com.example.widgettest;import android.appwidget.AppWidgetManager;import android.appwidget.AppWidgetProvider;import android.content.Context;import android.content.Intent;public class WidgetProvider extends AppWidgetProvider {@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {// TODO Auto-generated method stubsuper.onDeleted(context, appWidgetIds);//被从屏幕移除}@Overridepublic void onDisabled(Context context) {// TODO Auto-generated method stubsuper.onDisabled(context);//最后一个widget被从屏幕移除执行context.stopService(new Intent(context,TimerService.class));}@Overridepublic void onEnabled(Context context) {// TODO Auto-generated method stubsuper.onEnabled(context);//第一个Widget被添加到屏幕时执行,//启动servicecontext.startService(new Intent(context,TimerService.class));}@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubsuper.onReceive(context, intent);//在其他方法被调用时被其他方法默认调用}@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {// TODO Auto-generated method stubsuper.onUpdate(context, appWidgetManager, appWidgetIds);//刷新widget时,通过remoteView和AppWidgetManager}}
第四步:创建服务
public class TimerService extends Service {private Timer timer;//定时器private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//格式化日期@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {// TODO Auto-generated method stubupdateViews();}}, 0, 1000);//参数三每1秒更新一次,参数二延迟是0;}/** * 更新widget操作 */private void updateViews(){String time = sdf.format(new Date());RemoteViews rv = new RemoteViews(getPackageName(),R.layout.widget);rv.setTextViewText(R.id.textview, time);AppWidgetManager manager = AppWidgetManager.getInstance(getApplicationContext());ComponentName cn = new ComponentName(getApplicationContext(),WidgetProvider.class);manager.updateAppWidget(cn, rv);}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();//被销毁时停止timer = null;}}
<service android:name="com.example.widgettest.TimerService" > </service> <receiver android:name="com.example.widgettest.WidgetProvider" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widgetconfig" /> </receiver>
注意:
在AndriodManifest.xml中配置receiver的meta-date中android:name应该是android.appwidget.provider而不是android.widget.provider
不然会找不到这个小控件
更多相关文章
- android 获取屏幕尺寸,密度等信息
- 单击Button 更改屏幕方向
- android获取版本信息、屏幕信息和设备编号
- android 判断屏幕是横屏还是竖屏
- Android 监听屏幕熄屏亮屏和主动唤醒屏幕
- android 获取屏幕的宽度和高度
- android屏幕休眠和唤醒两种方法(newWakeLock)