App Widget的开发精要

作者: ahking17 | 来源:发表于2017-06-19 16:01 被阅读111次
    在 AndroidManifest 中声明 <receiver>标签, 用name属性指定继承自AppWidgetProvider的自定义类.

    AndroidManifest.xml

    <receiver android:name=".sample.MyWidgetProvider" >
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <meta-data android:name="android.appwidget.provider"
                   android:resource="@xml/my_appwidget_provider"/>
    </receiver>
    

    注:

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

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

    my_appwidget_provider.xml

    <appwidget-provider
      xmlns:android="http://schemas.android.com/apk/res/android"
        android:minWidth="200dp"
        android:minHeight="50dp"
        android:updatePeriodMillis="86400000"
        android:previewImage="@drawable/app_icon"
        android:initialLayout="@layout/widget"
        android:configure="com.example.android.ExampleAppWidgetConfigure"
        android:resizeMode="horizontal|vertical"
        android:widgetCategory="home_screen|keyguard"/>
    
    

    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的开发精要

        本文链接:https://www.haomeiwen.com/subject/lbogqxtx.html