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); }