App Widget的开发精要

在 AndroidManifest 中声明 标签, 用name属性指定继承自AppWidgetProvider的自定义类.

AndroidManifest.xml


    
        
    
    

注:

  1. AppWidgetProvider本质是BroadcastReceiver, 在中需要声明APPWIDGET_UPDATE, 这样在收到这种intent时, 系统会调用自定义AppWidgetProvider的onUpdate()来更新数据.

  2. 中的resource属性, 用来指定一个xml文件, 这个文件中的根节点是标签, 用来指定这个widget在桌面上的宽高值, 以及初始布局的xml文件.
    还有一个很重要的属性是“updatePeriodMillis”用来定义刷新频率, 也就是说framework多久发送一个特定的intent, 用来调用子定义AppWidgetProvider 的 onUpdate() 回调函数。
    系统基于节电的考虑, 定义了widget刷新数据的最小时间间隔是30分钟, 所以你要是要求实时的去刷新数据的话, 就要采用 Service 和 AlarmManager 对 Widget 进行更新.

my_appwidget_provider.xml



3. 真正的业务逻辑, 基本集中在自定义的AppWidgetProvider类.
自己要去实现这样几个重要的回调方法,

onUpdate(), 这是最重要的回调方法, 接受特定的intent, 用来定期更新数据.
onDeleted():当 Widget 被删除时调用该方法
onEnabled():当 Widget 第一次被添加时调用
onDisabled():当你的最后一个 Widget 被删除时调用该方法
onAppWidgetOptionsChanged():当 Widget 第一次被添加或者大小发生变化时调用该方法.
public class MyWidgetProvider extends AppWidgetProvider {
    public void onUpdate()
    public void onDeleted()
    public void onEnabled()
    public void onDisabled()
    public void onAppWidgetOptionsChanged()
}

eg.
当点击widget中的R.id.icon和R.id.icon_txt时, 启动ThemesStore这个activity.

public class ThemeStoreWidget extends AppWidgetProvider {

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {

        RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.widget_themestore);

        Intent intent = new Intent(context, ThemesStore.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
        remoteView.setOnClickPendingIntent(R.id.icon, pendingIntent);
        remoteView.setOnClickPendingIntent(R.id.icon_txt, pendingIntent);

        appWidgetManager.updateAppWidget(appWidgetIds, remoteView);
    }
}

refer to:
http://glgjing.github.io/blog/2015/11/05/android-kai-fa-zhi-app-widget-xiang-jie/

你可能感兴趣的:(App Widget的开发精要)