一种桌面小工具的广播类。
package com.itest.testappwidget;
import android.annotation.TargetApi;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.widget.RemoteViews;
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public class AppwidgetMainActivity extends AppWidgetProvider {
private final String ACTION = "com.itest.testappwidget.get";
private final String TAG = "AppwidgetMainActivity";
// private RemoteViews mRemoteViews = null;
// private ComponentName mComponentName = null;
// private AppWidgetManager mAppWidgetManager = null;
private static int count = 0;
// private int upcount = 0;
@Override
public void onAppWidgetOptionsChanged(Context context,
AppWidgetManager appWidgetManager, int appWidgetId,
Bundle newOptions) {
Log.i(TAG, "onAppWidgetOptionsChanged");
super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId,
newOptions);
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
Log.i(TAG, "onDeleted");
super.onDeleted(context, appWidgetIds);
}
@Override
public void onDisabled(Context context) {
Log.i(TAG, "onDisabled");
super.onDisabled(context);
}
@Override
public void onEnabled(Context context) {
Log.i(TAG, "onEnabled");
super.onEnabled(context);
}
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "onReceive intent=" + intent.getAction());
if (intent.getAction().equals(ACTION)) {
Log.i(TAG, "onReceive=" + ACTION);
AppWidgetManager mAppWidgetManager = AppWidgetManager
.getInstance(context);
RemoteViews mRemoteViews = new RemoteViews(
context.getPackageName(), R.layout.activity_appwidget_main);
PendingIntent pendingintent = PendingIntent.getBroadcast(context,
0, intent, 0);
mRemoteViews.setOnClickPendingIntent(R.id.text, pendingintent);
ComponentName mComponentName = new ComponentName(context,
AppwidgetMainActivity.class);
count++;
mRemoteViews.setTextViewText(R.id.text, "click count=" + count);
mAppWidgetManager.updateAppWidget(mComponentName, mRemoteViews);
}
super.onReceive(context, intent);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
Log.i(TAG, "onUpdate");
Intent intent = new Intent();
intent.setAction(ACTION);
PendingIntent pendingintent = PendingIntent.getBroadcast(context, 0,
intent, 0);
RemoteViews mRemoteViews = new RemoteViews(context.getPackageName(),
R.layout.activity_appwidget_main);
mRemoteViews.setOnClickPendingIntent(R.id.text, pendingintent);
ComponentName mComponentName = new ComponentName(context,
AppwidgetMainActivity.class);
AppWidgetManager mAppWidgetManager = AppWidgetManager
.getInstance(context);
mAppWidgetManager.updateAppWidget(mComponentName, mRemoteViews);
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
}
注意:
1.在放置新的widget时调用onUpdate();
2.在调用onUpdate、onDisabled、onDeleted、onEnabled方法之前都会先调用 onReceive(Context context, Intent intent),并且在intent带有Action参数,
如:android.appwidget.action.APPWIDGET_ENABLED
android.appwidget.action.APPWIDGET_UPDATE
android.appwidget.action.APPWIDGET_DELETED
android.appwidget.action.APPWIDGET_DISABLED。
PS: onReceive()中通过 super.onReceive(context, intent); 跳转到对应的回调方法。
3.appwidgetProvider的内部数据成员在每次调用的时候都会进行重新初始化,除了static成员以外,其他成员无法保留数据。
4.一般在需要刷新界面的时候重新实例化 ComponentName和RemoteViews组件,并设置好RemoteViews界面,通过mAppWidgetManager.updateAppWidget(mComponentName, mRemoteViews);提交更新UI信息。
代码:
AppWidgetManager mAppWidgetManager = AppWidgetManager
.getInstance(context);
RemoteViews mRemoteViews = new RemoteViews(
context.getPackageName(), R.layout.activity_appwidget_main);
PendingIntent pendingintent = PendingIntent.getBroadcast(context,
0, intent, 0);
mRemoteViews.setOnClickPendingIntent(R.id.text, pendingintent);
ComponentName mComponentName = new ComponentName(context,
AppwidgetMainActivity.class);
mAppWidgetManager.updateAppWidget(mComponentName, mRemoteViews);
5.需要在manifest注册广播和appwidget的xml meta-data:
其中 <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget"/>中的android:name="android.appwidget.provider" 为系统指定的。
代码:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.itest.testappwidget"
android:versionCode="1"
android:versionName="1.0" >
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
>
<receiver android:name="AppwidgetMainActivity"><intent-filter>
<action android:name="com.itest.testappwidget.get"/>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider" android:resource="@xml/widget"/>
</receiver>
</application>
</manifest>
6.xml文件:
代码
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/activity_appwidget_main"
android:minHeight="50dp"
android:minWidth="50dp"
android:updatePeriodMillis="10000" >
</appwidget-provider>
如果要用android:updatePeriodMillis实现更新的话,频率不能超过30分钟一次的频率。
7.关于appwidget的尺寸
# of Cells (Columns or Rows) | Available
Size (dp) (minWidth or minHeight ) |
---|---|
1 | 40dp |
2 | 110dp |
3 | 180dp |
4 | 250dp |
… | … |
n | 70 × n − 30 |