概述

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

  • AppWidgetProvider :BroadcastRecevier子类,用于接收更新,删除通知
  • AppWidgetProvderInfo:AppWidget相关信息(大小,更新频率等),xml形式
  • AppWidgetManger:AppWidget管理类,用于向provider发送消息
  • RemoteViews:可以在其他进程中运行的类,用于向provider发送通知。

实现步骤

  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>

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

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; i<N; i++) {            int 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();

参考:
App Widgets

Android 开发之 App Widget 详解

更多相关文章

  1. Maven In Android
  2. Android(安卓)如何自定义apk打包的包名
  3. Android(安卓)项目实例config.gradle配置
  4. Android(安卓)- Android(安卓)Studio 自动(auto)添加import 语句
  5. Android(安卓)Material Design :LinearLayoutCompat添加分割线div
  6. Android终端命令执行编译命令()
  7. Android(安卓)ServiceManager注册自定义service
  8. Android(安卓)自定义RadioButton的样式
  9. 为 Android(安卓)添加 Java 层服务(三)

随机推荐

  1. Android下动态链接库.so调用的简单例子
  2. Android实现友盟分享小程序
  3. Android--GestureOverlayView,手势识别
  4. NCalc支持Android和iOS
  5. android GPS
  6. Android Fragment 生命周期及回调方法
  7. Android中判断当前网络是否可用
  8. Android 文字自动滚动(跑马灯)效果的两种实
  9. Android中监听ListView滑动到底部
  10. android强制键盘关闭