appwidgetProviedr

来源:互联网 发布:淘宝十大恶心模特 编辑:程序博客网 时间:2024/06/06 03:24

一种桌面小工具的广播类。

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;@Overridepublic void onAppWidgetOptionsChanged(Context context,AppWidgetManager appWidgetManager, int appWidgetId,Bundle newOptions) {Log.i(TAG, "onAppWidgetOptionsChanged");super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId,newOptions);}@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {Log.i(TAG, "onDeleted");super.onDeleted(context, appWidgetIds);}@Overridepublic void onDisabled(Context context) {Log.i(TAG, "onDisabled");super.onDisabled(context);}@Overridepublic void onEnabled(Context context) {Log.i(TAG, "onEnabled");super.onEnabled(context);}@Overridepublic 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);}@Overridepublic 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)140dp2110dp3180dp4250dp……n70 × n − 30
end.

原创粉丝点击