您的位置:首页 > 移动开发

AppWidget(桌面组件)

2016-08-25 11:23 232 查看

区别

与普通widget是两个概念。普通说的widget只是组件,视图。

App widget 是一个桌面组件。

注意:

应用必须安装在内存里,才能显示widget


开始

在官方文档里搜索 App widget

配置:在清单文件里添加下列配置(广播接受者)

<receiver android:name=".ProcessWidgetProvider" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/process_widget_info" />
</receiver>


声明ProcessWidgetProvider

其实就是一个AppWidgetProvider 子类

onReceive : 只要有广播,就会调用

onEnabled : 第一个widget创建出来的时候调用

onUpdate : 系统更新widget的时候调用。 widget创建的时候调用。

onDelete : widget 删除的时候调用

onDisable : 最后一个widget删除的时候调用。

在res/xml/文件夹下添加 process_widget_info.xml文件

minWidth widget最小宽度

minHeight 最小高度

previewImage 设置预览用的图片。在添加widget之前,widget列表看到的样子。

initialLayout:显示样式的布局文件

resizeMode:用来表示缩放的方式。horizontal vertical。如果属性没有配置代表不可缩放

widgetCategory

home_screen 普通widget的类型

keyguard 5.0之后添加的类型。可以显示在锁屏界面上。

updatePeriodMillis: 系统自动更新widget的时间间隔。

单位是毫秒。

4.0 最小更新间隔为 半个小时

0 代表不更新。

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="40dp"
android:minHeight="40dp"
android:updatePeriodMillis="1"
android:previewImage="@drawable/preview"
android:initialLayout="@layout/example_appwidget"
android:resizeMode="horizontal|vertical"
android:widgetCategory="home_screen">
</appwidget-provider>


添加点击事件

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

LogUtils.loge("onUpdate");
for (int id:appWidgetIds) {

RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_process);
views.setTextViewText(R.id.tv_process_widget,"呵呵,我是一个拓达一键清理widget");

Intent intent = new Intent(context, ProcessWidgetProvider.class);
intent.setAction("PROCESS_BTN_CLICK");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.btn_process_widget, pendingIntent);

appWidgetManager.updateAppWidget(id,views);
}
}


外部更新widget

SimpleDateFormat formater = new SimpleDateFormat("H:m:s");
RemoteViews views = new RemoteViews(getPackageName(), R.layout.widget_process);
views.setTextViewText(R.id.tv_process_widget,formater.format(new Date()));

Intent intent = new Intent(this, ProcessWidgetProvider.class);
intent.setAction("PROCESS_BTN_CLICK");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
views.setOnClickPendingIntent(R.id.btn_process_widget, pendingIntent);

//widgetmanager
AppWidgetManager manager = AppWidgetManager.getInstance(getApplicationContext());

//这里的ProcessWidgetProvider 就是在清单文件里注册的 AppWidget 的 WidgetProvider
ComponentName componentName = new ComponentName(getApplicationContext(), ProcessWidgetProvider.class);
manager.updateAppWidget(componentName, views);


主动更新

使用handler

使用AarmManager

使用这个,不怕服务被杀死。

用户强制停止,半个小时候,系统调用onUpdate的时候,也会把服务重新启动。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  应用 app Android组件