1. appwidget是broadcastreceiver,因为俺们说的appwidget全都需要从class AppWidgetProvider派生
    一般俺们只需要care它的onUpdate接口
  2. 借用OO programming的优点,每种appwdiget class可以有很多的appwidget instance
    这些instance具体表现为玩家可以在桌面上new 任意个instance
  3. 每个appwidget instance从出生的那天起就被某个AppWidgetManager管理
    可以使用 AppWidgetManager.getInstance(this) 来获得每个instance的manager
  4. 如果widget希望更新和自己关联的view,可以让manager来帮助完成
    manager.updateAppWidget(thisWidget, updateViews);
    嘿嘿,widget并无操作view的权利,view的生成/更新动作必须有它的manager来完成

通过阅读android code,widget manager又是借助于这么一个变量来update view的

static IAppWidgetService sService;

什么是IAppWidgetService ?

似乎这个文件和它有关联IAppWidgetService.aidl。

那什么又是aidl?

现在没有答案,等待研究。

 

以下为appwidget的一个简单框架

import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.widget.RemoteViews;

public class APSales extends AppWidgetProvider {
    /** Called when the activity is first created. */
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        context.startService(new Intent(context, UpdateService.class));
    }
    public static class UpdateService extends Service {
        @Override
        public void onStart(Intent intent, int startId) {
            RemoteViews updateViews = buildUpdate(this);
            ComponentName thisWidget = new ComponentName(this, APSales.class);
            AppWidgetManager manager = AppWidgetManager.getInstance(this);
            manager.updateAppWidget(thisWidget, updateViews);
        }
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
        public RemoteViews buildUpdate(Context context) {
            RemoteViews rview = null;
            return rview;
        }
    }
}

 

其他:

  1. Loading wordnof dayu2026
    u2026是什么意思?
  2. 写一个appwidget的步骤
    • 在AndroidManifest.xml中定义<receiver />,
    • 在该receiver中同时还要定义<meta-data />,
    • 在这个meta-data element中,一般需要定义attr android:resource=“@xml/widget_something”,其中widget_something是个xml文件,它的样子是这样的
      <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
          android:minWidth="146dip"
          android:minHeight="72dip"
          android:updatePeriodMillis="86400000"
          android:initialLayout="@layout/widget_message"
          />
      可见,该widget的一些属性,比如多长,多宽,update interval和初始layout均在此定义;
      其实,还有一个属性android:configure=“某class name”,也可以在此定义,用来指定该widget的配置信息

     

Advertisements