概述

android 中桌面插件主要依赖于AppWidget框架。涉及类:

  • AppWidgetProvider :BroadcastRecevier子类,用于接收更新,删除通知
  • AppWidgetProvderInfo:AppWidget相关信息(大小,更新频率等),xml形式
  • AppWidgetManger:AppWidget管理类,用于向provider发送消息
  • RemoteViews:可以在其他进程中运行的类,用于向provider发送通知。
  • RemoteViewsService : 是一个远程的服务适配器 可以请求RemoteViews,管理RemoteViews的服务.
  • RemoteViewsFactory : 提供了RemoteViewsFactory用于填充远程集合视图。

实现步骤

  1. 声明AndroidManifest
  2. 定义初始化 xml文件
  3. 定义 widget布局Layout xml文件
  4. 继承AppWidgetProvider,实现相关逻辑

AndroidManifest.xml:

<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>

AppWidgetProvider其本质是一个BroadcastReceiver,其中,APPWIDGET_UPDATE是必须的,用于接收broadcast
meta-data声明了AppWidgetProviderInfo对应的资源xml的位置,其中包括Widgetxml布局文件、刷新频率、最小宽高

res/xml/example_appwidget_info

<appwidget-provider      xmlns:android="http://schemas.android.com/apk/res/android"    android:minWidth="40dp"    android:minHeight="40dp"    android:updatePeriodMillis="86400000"    android:previewImage="@drawable/preview"    android:initialLayout="@layout/example_appwidget"    android:configure="com.example.android.ExampleAppWidgetConfigure"     android:resizeMode="horizontal|vertical"    android:widgetCategory="home_screen">appwidget-provider>
  • minWidth & minHeight:定义了 Widget 的最小宽高
  • updatePeriodMillis:定义了 Widget 的刷新频率
  • initialLayout:Widget 的布局 Layout 文件
  • previewImage:当用户选择添加 Widget 时的预览图片
  • configure:添加Widget时弹出的Widget配置activity,没有则不设置
  • resizeMode:水平和垂直方向是否可以调整大小,horizontal,vertical,none,horizontal|vertical
  • widgetCategory: Widget 可以显示的位置, home_screen(桌面),keyguard(锁屏,5.0以上)
    更多详细属性可以参考 AppWidgetProviderInfo。

ExampleAppWidgetProvider:

public class ExampleAppWidgetProvider extends AppWidgetProvider {    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {        final int N = appWidgetIds.length;        // Perform this loop procedure for each App Widget that belongs to this provider        for (int i=0; iint appWidgetId = appWidgetIds[i];            // Create an Intent to launch ExampleActivity            Intent intent = new Intent(context, ExampleActivity.class);            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);            // Get the layout for the App Widget and attach an on-click listener            // to the button            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);            views.setOnClickPendingIntent(R.id.button, pendingIntent);            // Tell the AppWidgetManager to perform an update on the current app widget            appWidgetManager.updateAppWidget(appWidgetId, views);        }    }}

Configuration Activity

<activity android:name=".ExampleAppWidgetConfigure">    <intent-filter>        <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>    intent-filter>activity>

添加widget时弹出的activity,需要添加android.appwidget.action.APPWIDGET_CONFIGURE过滤器。

注意事项:

  1. Activity 必须返回带 EXTRA_APPWIDGET_ID 的 result。
  2. 声明Configuration Activity 后 onUpdate() 在 Widget 添加时不会被调用,Activity 需要调用 AppWidgetManager.updateAppWidget()完成 Widget 更新。
Intent intent = getIntent();Bundle extras = intent.getExtras();if (extras != null) {    mAppWidgetId = extras.getInt(        AppWidgetManager.EXTRA_APPWIDGET_ID,        AppWidgetManager.INVALID_APPWIDGET_ID);}AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.example_appwidget);appWidgetManager.updateAppWidget(mAppWidgetId, views);Intent resultValue = new Intent();resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);setResult(RESULT_OK, resultValue);finish();

集合视图RemoteViewsService

上面的方式提供的方式是针对单个widget,如果我们的widget中包含ListView,Gridview等集合视图的时候.我们就需要借助一个类RemoteViewsService,继承RemoteViewsService并复写onGetViewFactory 返回RemoteViewsFactory

public class StackWidgetRemoteViewsService extends RemoteViewsService {    @Override    public RemoteViewsFactory onGetViewFactory(Intent intent) {}}

参考:
App Widgets

Android 开发之 App Widget 详解

更多相关文章

  1. Android中一个动画应用于两个View中不同步的问题
  2. Android(安卓)view的移动和画布的移动原理 适用于制作各种效果
  3. Android(安卓)Studio添加so文件并打包到APK的lib文件夹中
  4. Android(安卓)易忘部分
  5. RemoteViews用法一:widget简单用法
  6. Unity中Bundle Identifier、Bundle Version、Bundle Version Cod
  7. Android添加多语言
  8. Android(安卓)中文 API (29) —— CompoundButton
  9. 5.3 ListView的HeaderView

随机推荐

  1. Mac Android(安卓)Studio安装教程
  2. Paint常用方法介绍
  3. EditText默认不弹出键盘
  4. Android实现选择本地音乐
  5. Android(安卓)stdio 3.0以上版本将图片文
  6. input 按键分发
  7. Android(安卓)Studio 将项目打成JAR包
  8. Android版本适配:9.0 Pie(API级别28)
  9. 日拱一卒(十七)
  10. Android(安卓)DeepLink