AppWidget(桌面组件)

区别

  • 与普通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的时候,也会把服务重新启动。

你可能感兴趣的:(实例)