博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

016、AppWidgetProvider桌面小控件

Posted on 2013-09-27 21:41  mz_zyh  阅读(249)  评论(0编辑  收藏  举报
AppWidgetProvider对象可以实现桌面Widget
AppWidget也有生命周期,当重写AppWidgetProvider的onUpdate()方法后,就会进入第一次AppWidget的更新周期中,然而它在AndroidManifest.xml里是定义在<receiver>TAG中,所以当手机对操作系统广播"android.appwidget.action.APPWIDGET_UPDATE"信息的同时,也会被AppWidgetProvider获取,又由于它并非服务,所以在失去焦点时,虽然依旧在后台运行,但不会进行画面的更新。一般在onUpdate方法里面在启动一个服务,再在服务里面注册希望收听的广播。
每一个AppWidgetProvider都有更新时间设置,这个更新时间间隔一到,就会更新AppWidget的RemoteView对象,此处的时间间隔将影响电池电量的消耗速度,一般建议是一天更新一次。
当用户删除这个AppWidget时,会调用onDeleted()方法。
 
AndroidManifest.xml文件里面配置:
        <receiver
            android:name="com.example.ex_4_28_appwidgetprovider.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/my_widget_provider" />
        </receiver>

 

上面文件里面引用的<meta-data>里面的android:resource="@xml/my_widget_provider",有3个属性是比较重要的:"android:minWidth"为AppWidget在手机桌面上的宽,"android:minHeight"为AppWidget在手机桌面上的高,"android:updatePeriodMillis"为AppWidget定时更新Refresh RemoteView的时间

 

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/activity_main"
    android:minHeight="72dp"
    android:minWidth="72dp"
    android:updatePeriodMillis="6000" />

 

 

如果需要在AppWidget里面添加按钮,则onUpdate()方法里面的RemoveView对象需要新增setOnClickPendingIntent()。
        for (int appWidgetId : appWidgetIds) {
            Intent configIntent = new Intent(context, MyActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
                    configIntent, 0);
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
                    R.layout.activity_main);
            remoteViews.setOnClickPendingIntent(R.id.bt, pendingIntent);
            appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
        }