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

Android widget桌面插件

2016-03-24 07:33 405 查看

概述

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

AppWidgetProvider :BroadcastRecevier子类,用于接收更新,删除通知

AppWidgetProvderInfo:AppWidget相关信息(大小,更新频率等),xml形式

AppWidgetManger:AppWidget管理类,用于向provider发送消息

RemoteViews:可以在其他进程中运行的类,用于向provider发送通知。

实现步骤

声明AndroidManifest

定义初始化 xml 文件

定义 widget布局Layout xml文件

继承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过滤器。

注意事项:

Activity 必须返回带 EXTRA_APPWIDGET_ID 的 result。

声明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 详解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: