Widget并不支持所有的Android组件,只能在Widget中使用如下组件类:
1)用于布局的组件类。
FrameLayout LinearLayout RelativeLayout
2)可视组件类
AnalogClock ImageView ProgressBar TextView Button Chronometer ImageButton
创建Widget描述文件,该文件是Xml格式,必须放在res\xml目录中 <?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="309dip" android:minHeight="192dip" android:initialLayout="@layout/main" 初始化布局 android:updatePeriodMillis="1000" 更新的时间间隔(毫秒) />
建立Widget类,该类必须从AppWidgetProvider类继承(AppWidgetProvider是BroadcastReceiver的子类,因此,Widget类可以接受广播消息) 在AndroidManifest.xml文件中定义widget <receiver android:label="@string/app_name" android:name=".HelloWidget"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/hello_widget_provider"/> </receiver>
显示时间,每秒更新 public class HelloWidget extends AppWidgetProvider { private Timer timer; private int[] appWidgetIds; private AppWidgetManager appWidgetManager; private Context context; @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); Log.i("Widget", "onUpdate"); this.context = context; this.appWidgetManager = appWidgetManager; this.appWidgetIds = appWidgetIds; timer = new Timer(); timer.schedule(task, 0,1000); } private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: Time myTime = new Time(); myTime.setToNow(); RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.main); updateViews.setTextViewText(R.id.widget_textview, "北京时间"+myTime.format("%H:%M:%S")); Log.i("Widget", "北京时间"+myTime.format("%H:%M:%S")); // ComponentName thisWidget = new ComponentName(context,HelloWidget.class); // appWidgetManager.updateAppWidget(thisWidget, updateViews); appWidgetManager.updateAppWidget(appWidgetIds, updateViews); break; default: break; } } }; private TimerTask task = new TimerTask() { public void run() { handler.sendEmptyMessage(1); } }; }
音乐播放widget
package cn.stay.widget; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.Intent; import android.os.Handler; import android.os.Message; import android.widget.RemoteViews; import cn.aoran.activity.R; public class HelloWidget extends AppWidgetProvider { private static final String WIDGET_BACK = "cn.stay.widget.back"; private static final String WIDGET_PLAY = "cn.stay.widget.play"; private static final String WIDGET_NEXT = "cn.stay.widget.next"; private static final String WIDGET_SONG = "cn.stay.widget.song"; private static final String WIDGET_CURRENT = "cn.stay.widget.current"; private String song = ""; private static Context context; private static AppWidgetManager appWidgetManager; private static int[] appWidgetIds; @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); HelloWidget.context = context; HelloWidget.appWidgetIds = appWidgetIds; HelloWidget.appWidgetManager = appWidgetManager; handler.sendEmptyMessage(0); } @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); if (WIDGET_SONG.equals(intent.getAction())) { song = intent.getStringExtra("song"); if (song == null || "".equals(song.trim())) { song = "未知"; } if (context != null) { handler.sendEmptyMessage(1); } } } private Handler handler = new Handler() { public void handleMessage(Message msg) { RemoteViews widgetViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); super.handleMessage(msg); switch (msg.what) { case 0: context.sendBroadcast(new Intent(WIDGET_CURRENT)); // Intent intent = new Intent(context,LocalActivity.class); // PendingIntent pIntent = PendingIntent.getActivity(context, 0, intent, 0); // widgetViews.setOnClickPendingIntent(R.id.widget_sub, pIntent); // 上一首 PendingIntent backIntent = PendingIntent.getBroadcast(context, 0, new Intent(WIDGET_BACK), 0); widgetViews.setOnClickPendingIntent(R.id.widget_back_btn, backIntent); // 下一首 PendingIntent nextIntent = PendingIntent.getBroadcast(context, 0, new Intent(WIDGET_NEXT), 0); widgetViews.setOnClickPendingIntent(R.id.widget_next_btn, nextIntent); // 播放 PendingIntent playIntent = PendingIntent.getBroadcast(context, 0, new Intent(WIDGET_PLAY), 0); widgetViews.setOnClickPendingIntent(R.id.widget_play_btn, playIntent); appWidgetManager.updateAppWidget(appWidgetIds, widgetViews); break; case 1: widgetViews.setTextViewText(R.id.widget_song, song); // ComponentName thisWidget = new ComponentName(context, HelloWidget.class); // AppWidgetManager manager = AppWidgetManager.getInstance(context); appWidgetManager.updateAppWidget(appWidgetIds, widgetViews); break; default: break; } } }; }
生活不应该只有工作,Stay还有更多编程与感悟希望和你分享。如果我的磁场吸引到你,请关注微信:stay4it,QQ:104816053。