Android Widget示范
Android Widget示例
Widget并不支持所有的Android组件,只能在Widget中使用如下组件类:
1)用于布局的组件类。
FrameLayout LinearLayout RelativeLayout
2)可视组件类
AnalogClock ImageView ProgressBar TextView Button Chronometer ImageButton
view sourceprint?
1 创建Widget描述文件,该文件是Xml格式,必须放在res\xml目录中
2 <?xml version="1.0" encoding="utf-8"?>
3 <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
4 android:minWidth="309dip"
5 android:minHeight="192dip"
6 android:initialLayout="@layout/main" 初始化布局
7 android:updatePeriodMillis="1000" 更新的时间间隔(毫秒)
8 />
view sourceprint?
1 建立Widget类,该类必须从AppWidgetProvider类继承(AppWidgetProvider是BroadcastReceiver的子类,因此,Widget类可以接受广播消息)
2 在AndroidManifest.xml文件中定义widget
3 <receiver android:label="@string/app_name" android:name=".HelloWidget">
4 <intent-filter>
5 <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
6 </intent-filter>
7 <meta-data android:name="android.appwidget.provider"
8 android:resource="@xml/hello_widget_provider"/>
9 </receiver>
view sourceprint?
01 显示时间,每秒更新
02 public class HelloWidget extends AppWidgetProvider {
03 private Timer timer;
04 private int[] appWidgetIds;
05 private AppWidgetManager appWidgetManager;
06 private Context context;
07
08 @Override
09 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
10 super.onUpdate(context, appWidgetManager, appWidgetIds);
11 Log.i("Widget", "onUpdate");
12 this.context = context;
13 this.appWidgetManager = appWidgetManager;
14 this.appWidgetIds = appWidgetIds;
15 timer = new Timer();
16 timer.schedule(task, 0,1000);
17 }
18 private Handler handler = new Handler(){
19 @Override
20 public void handleMessage(Message msg) {
21 super.handleMessage(msg);
22 switch (msg.what) {
23 case 1:
24 Time myTime = new Time();
25 myTime.setToNow();
26 RemoteViews updateViews =
27 new RemoteViews(context.getPackageName(),
28 R.layout.main);
29 updateViews.setTextViewText(R.id.widget_textview, "北京时间"+myTime.format("%H:%M:%S"));
30 Log.i("Widget", "北京时间"+myTime.format("%H:%M:%S"));
31 // ComponentName thisWidget = new ComponentName(context,HelloWidget.class);
32 // appWidgetManager.updateAppWidget(thisWidget, updateViews);
33 appWidgetManager.updateAppWidget(appWidgetIds, updateViews);
34 break;
35 default:
36 break;
37 }
38 }
39 };
40 private TimerTask task = new TimerTask() {
41 public void run() {
42 handler.sendEmptyMessage(1);
43 }
44 };
45 }
音乐播放widget
view sourceprint?01 package cn.stay.widget;
02
03 import android.app.PendingIntent;
04 import android.appwidget.AppWidgetManager;
05 import android.appwidget.AppWidgetProvider;
06 import android.content.Context;
07 import android.content.Intent;
08 import android.os.Handler;
09 import android.os.Message;
10 import android.widget.RemoteViews;
11 import cn.aoran.activity.R;
12
13 public class HelloWidget extends AppWidgetProvider {
14 private static final String WIDGET_BACK = "cn.stay.widget.back";
15 private static final String WIDGET_PLAY = "cn.stay.widget.play";
16 private static final String WIDGET_NEXT = "cn.stay.widget.next";
17 private static final String WIDGET_SONG = "cn.stay.widget.song";
18 private static final String WIDGET_CURRENT = "cn.stay.widget.current";
19 private String song = "";
20 private static Context context;
21 private static AppWidgetManager appWidgetManager;
22 private static int[] appWidgetIds;
23
24 @Override
25 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
26 super.onUpdate(context, appWidgetManager, appWidgetIds);
27 HelloWidget.context = context;
28 HelloWidget.appWidgetIds = appWidgetIds;
29 HelloWidget.appWidgetManager = appWidgetManager;
30 handler.sendEmptyMessage(0);
31 }
32
33 @Override
34 public void onReceive(Context context, Intent intent) {
35 super.onReceive(context, intent);
36 if (WIDGET_SONG.equals(intent.getAction())) {
37 song = intent.getStringExtra("song");
38 if (song == null || "".equals(song.trim())) {
39 song = "未知";
40 }
41 if (context != null) {
42 handler.sendEmptyMessage(1);
43 }
44 }
45 }
46
47 private Handler handler = new Handler() {
48 public void handleMessage(Message msg) {
49 RemoteViews widgetViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
50 super.handleMessage(msg);
51 switch (msg.what) {
52 case 0:
53 context.sendBroadcast(new Intent(WIDGET_CURRENT));
54 // Intent intent = new Intent(context,LocalActivity.class);
55 // PendingIntent pIntent = PendingIntent.getActivity(context, 0, intent, 0);
56 // widgetViews.setOnClickPendingIntent(R.id.widget_sub, pIntent);
57 // 上一首
58 PendingIntent backIntent = PendingIntent.getBroadcast(context, 0, new Intent(WIDGET_BACK), 0);
59 widgetViews.setOnClickPendingIntent(R.id.widget_back_btn, backIntent);
60 // 下一首
61 PendingIntent nextIntent = PendingIntent.getBroadcast(context, 0, new Intent(WIDGET_NEXT), 0);
62 widgetViews.setOnClickPendingIntent(R.id.widget_next_btn, nextIntent);
63 // 播放
64 PendingIntent playIntent = PendingIntent.getBroadcast(context, 0, new Intent(WIDGET_PLAY), 0);
65 widgetViews.setOnClickPendingIntent(R.id.widget_play_btn, playIntent);
66
67 appWidgetManager.updateAppWidget(appWidgetIds, widgetViews);
68 break;
69 case 1:
70 widgetViews.setTextViewText(R.id.widget_song, song);
71 // ComponentName thisWidget = new ComponentName(context, HelloWidget.class);
72 // AppWidgetManager manager = AppWidgetManager.getInstance(context);
73 appWidgetManager.updateAppWidget(appWidgetIds, widgetViews);
74 break;
75 default:
76 break;
77 }
78 }
79
80 };
81 }
Widget并不支持所有的Android组件,只能在Widget中使用如下组件类:
1)用于布局的组件类。
FrameLayout LinearLayout RelativeLayout
2)可视组件类
AnalogClock ImageView ProgressBar TextView Button Chronometer ImageButton
view sourceprint?
1 创建Widget描述文件,该文件是Xml格式,必须放在res\xml目录中
2 <?xml version="1.0" encoding="utf-8"?>
3 <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
4 android:minWidth="309dip"
5 android:minHeight="192dip"
6 android:initialLayout="@layout/main" 初始化布局
7 android:updatePeriodMillis="1000" 更新的时间间隔(毫秒)
8 />
view sourceprint?
1 建立Widget类,该类必须从AppWidgetProvider类继承(AppWidgetProvider是BroadcastReceiver的子类,因此,Widget类可以接受广播消息)
2 在AndroidManifest.xml文件中定义widget
3 <receiver android:label="@string/app_name" android:name=".HelloWidget">
4 <intent-filter>
5 <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
6 </intent-filter>
7 <meta-data android:name="android.appwidget.provider"
8 android:resource="@xml/hello_widget_provider"/>
9 </receiver>
view sourceprint?
01 显示时间,每秒更新
02 public class HelloWidget extends AppWidgetProvider {
03 private Timer timer;
04 private int[] appWidgetIds;
05 private AppWidgetManager appWidgetManager;
06 private Context context;
07
08 @Override
09 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
10 super.onUpdate(context, appWidgetManager, appWidgetIds);
11 Log.i("Widget", "onUpdate");
12 this.context = context;
13 this.appWidgetManager = appWidgetManager;
14 this.appWidgetIds = appWidgetIds;
15 timer = new Timer();
16 timer.schedule(task, 0,1000);
17 }
18 private Handler handler = new Handler(){
19 @Override
20 public void handleMessage(Message msg) {
21 super.handleMessage(msg);
22 switch (msg.what) {
23 case 1:
24 Time myTime = new Time();
25 myTime.setToNow();
26 RemoteViews updateViews =
27 new RemoteViews(context.getPackageName(),
28 R.layout.main);
29 updateViews.setTextViewText(R.id.widget_textview, "北京时间"+myTime.format("%H:%M:%S"));
30 Log.i("Widget", "北京时间"+myTime.format("%H:%M:%S"));
31 // ComponentName thisWidget = new ComponentName(context,HelloWidget.class);
32 // appWidgetManager.updateAppWidget(thisWidget, updateViews);
33 appWidgetManager.updateAppWidget(appWidgetIds, updateViews);
34 break;
35 default:
36 break;
37 }
38 }
39 };
40 private TimerTask task = new TimerTask() {
41 public void run() {
42 handler.sendEmptyMessage(1);
43 }
44 };
45 }
音乐播放widget
view sourceprint?01 package cn.stay.widget;
02
03 import android.app.PendingIntent;
04 import android.appwidget.AppWidgetManager;
05 import android.appwidget.AppWidgetProvider;
06 import android.content.Context;
07 import android.content.Intent;
08 import android.os.Handler;
09 import android.os.Message;
10 import android.widget.RemoteViews;
11 import cn.aoran.activity.R;
12
13 public class HelloWidget extends AppWidgetProvider {
14 private static final String WIDGET_BACK = "cn.stay.widget.back";
15 private static final String WIDGET_PLAY = "cn.stay.widget.play";
16 private static final String WIDGET_NEXT = "cn.stay.widget.next";
17 private static final String WIDGET_SONG = "cn.stay.widget.song";
18 private static final String WIDGET_CURRENT = "cn.stay.widget.current";
19 private String song = "";
20 private static Context context;
21 private static AppWidgetManager appWidgetManager;
22 private static int[] appWidgetIds;
23
24 @Override
25 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
26 super.onUpdate(context, appWidgetManager, appWidgetIds);
27 HelloWidget.context = context;
28 HelloWidget.appWidgetIds = appWidgetIds;
29 HelloWidget.appWidgetManager = appWidgetManager;
30 handler.sendEmptyMessage(0);
31 }
32
33 @Override
34 public void onReceive(Context context, Intent intent) {
35 super.onReceive(context, intent);
36 if (WIDGET_SONG.equals(intent.getAction())) {
37 song = intent.getStringExtra("song");
38 if (song == null || "".equals(song.trim())) {
39 song = "未知";
40 }
41 if (context != null) {
42 handler.sendEmptyMessage(1);
43 }
44 }
45 }
46
47 private Handler handler = new Handler() {
48 public void handleMessage(Message msg) {
49 RemoteViews widgetViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
50 super.handleMessage(msg);
51 switch (msg.what) {
52 case 0:
53 context.sendBroadcast(new Intent(WIDGET_CURRENT));
54 // Intent intent = new Intent(context,LocalActivity.class);
55 // PendingIntent pIntent = PendingIntent.getActivity(context, 0, intent, 0);
56 // widgetViews.setOnClickPendingIntent(R.id.widget_sub, pIntent);
57 // 上一首
58 PendingIntent backIntent = PendingIntent.getBroadcast(context, 0, new Intent(WIDGET_BACK), 0);
59 widgetViews.setOnClickPendingIntent(R.id.widget_back_btn, backIntent);
60 // 下一首
61 PendingIntent nextIntent = PendingIntent.getBroadcast(context, 0, new Intent(WIDGET_NEXT), 0);
62 widgetViews.setOnClickPendingIntent(R.id.widget_next_btn, nextIntent);
63 // 播放
64 PendingIntent playIntent = PendingIntent.getBroadcast(context, 0, new Intent(WIDGET_PLAY), 0);
65 widgetViews.setOnClickPendingIntent(R.id.widget_play_btn, playIntent);
66
67 appWidgetManager.updateAppWidget(appWidgetIds, widgetViews);
68 break;
69 case 1:
70 widgetViews.setTextViewText(R.id.widget_song, song);
71 // ComponentName thisWidget = new ComponentName(context, HelloWidget.class);
72 // AppWidgetManager manager = AppWidgetManager.getInstance(context);
73 appWidgetManager.updateAppWidget(appWidgetIds, widgetViews);
74 break;
75 default:
76 break;
77 }
78 }
79
80 };
81 }