Widget應(yīng)用學(xué)習(xí)筆記
Widget應(yīng)用學(xué)習(xí)筆記是本文要介紹的內(nèi)容,主要是來了解并學(xué)習(xí)Widget應(yīng)用,Widget小組件可以放在android桌面上的小組件,其中的布局只支持ImageView TextView Button等簡單組件。
下面以在桌面上顯示Hello World!為例
首先建立自己Widget類 必須要繼承AppWidgetProvider
然后重寫onUpdate()方法
- public class MyWidget extends AppWidgetProvider {
- @Override
- public void onUpdate(Context context, AppWidgetManager appWidgetManager,
- int[] appWidgetIds) {
- //獲得一個遠程試圖對象
- RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main);
- //修改試圖中的文本
- views.setTextViewText(R.id.text, "Hello World!" );
- //更新widget
- appWidgetManager.updateAppWidget(appWidgetIds, views);
- }
- }
onUpdate方法中context參數(shù)是向widget發(fā)送更新請求的上下文環(huán)境,appWidgetmanager可以當作整個widget的管理者,它的updateAppWidget()方法可以更新指定wighet的view,appWidgetIds系統(tǒng)發(fā)出更新請求時更新的所有widget的ID集合,新建widget時整個數(shù)組中只有一個值就是當前widget的id,1.5版本后固定每30分鐘系統(tǒng)會自動更新一次widget,系統(tǒng)自動更新,重啟手機時都會執(zhí)行onUpdate方法這時appWidgetIds就是桌面上所有widget的ID的集合。
寫一個appwidget.xml文件設(shè)置widget的屬性
- <?xml version="1.0" encoding="utf-8"?>
- <appwidget-provider
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:minWidth="144dip" android:minHeight="72dp"
- android:configure="com.iee_2005.weather.WidgetConfigure"
- android:initialLayout="@layout/main">
- </appwidget-provider>
其中 minWidth屬性是widget窗口最小寬度 minHeight屬性是widget的最小高度initaialLayout是widgit的布局文件configure 屬性是widget的配置activity的名稱(注意:必須把包名也寫全)這個屬性可以沒有,如果定義了這個屬性那么添加widget的時候會先打開這里指定的activity用來配置這個widget 還有一個updatePeriodMillis屬性是用來設(shè)置自動更新時間的但在1.5版本后已經(jīng)廢除改為固定30分鐘
widget配置activity
- public WidgetConfigure extends Activity
- {
- onCreate()...
- .....
- }
注意這個activity在AndroidManiFest中注冊時的寫法
- <activity android:name=".WidgetConfigure">
- <intent-filter>
- <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
- </intent-filter>
- </activity>
然后再androidManiFest.xml中注冊widget,這里可以看到widget其實一就是一個廣播接收器
- <receiver android:name=".MyWidget" android:label="時間">
- <intent-filter >
- <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
- </intent-filter>
- <meta-data android:name="android.appwidget.provider"
- android:resource="@xml/appwidget"/>
- </receiver>
應(yīng)該是必須這么寫 resource屬性的值是widget配置文件的位置
然后運行 在手機桌面上長按或 點menu鍵->添加 添加小組件 找到我們寫的widget就可以看到效果了
定時更新widget
從sdk1.5以后appwidget.xml文件中的updatePeriodMillis屬性被廢除了 所以不能用直接修改updatePeriodMillis屬性來實現(xiàn)定時更新widget
想要定時更新widget就要用Service,創(chuàng)建一個Service用來計時并更新widget內(nèi)容 在widget被調(diào)用時開啟服務(wù)public class MyService extends Service implements Runnable{
- private AppWidgetManager appWidgetManager;
- private ComponentName componentName;
- private Handler mHandler;
- private int h,m,s;
- private String text;
- private SimpleDateFormat dateFormat;
- /*
- * 此方法為Service必須有的方法 此例中沒有用到
- */
- public IBinder onBind(Intent intent) {
- return null;
- }
- /*
- * 服務(wù)創(chuàng)建時執(zhí)行整個方法 一般用來初始化
- */
- public void onCreate() {
- appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
- componentName = new ComponentName(getApplicationContext(), MyWidget.class);
- mHandler = new Handler();
- dateFormat = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
- }
- /*
- * 開始服務(wù) ,如果服務(wù)已經(jīng)存在 每次應(yīng)用發(fā)送服務(wù)移動時執(zhí)行一次onStart方法而不執(zhí)行onCreate
- 這里使用Handler實例對象上傳一個線程到UI線程列隊中用來更新widget的UI即Views
- */
- public void onStart(Intent intent, int startId) {
- mHandler.post(this);
- }
- /*
- * 服務(wù)被銷毀時執(zhí)行此方法,撤銷更新線程
- */
- public void onDestroy() {
- Log.i("mylog","stop");
- mHandler.removeCallbacks(this);
- }
- /*
- *更新widget的views的線程
- /
- public void run() {
- RemoteViews views = new RemoteViews(getApplicationContext().getPackageName(),R.layout.main);
- views.setTextViewText(R.id.text, dateFormat.format(new Date()));
- appWidgetManager.updateAppWidget(componentName, views);
- mHandler.postDelayed(this, 1000);
- Log.i("mylog", "update");
- }
然后記得在AndroidManiFest文件中注冊Service
- <service android:name=".MyService">
- <intent-filter >
- <action android:name="com.UPDATE_TIME"/>
- </intent-filter>
- </service>
這樣service就創(chuàng)建完畢了,最后在widget中的onUpdate方法中開啟服務(wù)
- public void onUpdate(Context context, AppWidgetManager appWidgetManager,
- int[] appWidgetIds) {
- Intent service = new Intent("com.UPDATE_TIME");
- context.startService(service);
- }
這就實現(xiàn)了一個可以顯示系統(tǒng)時間并自動根新的widget。
小結(jié):Widget應(yīng)用學(xué)習(xí)筆記的內(nèi)容介紹完了,希望通過Widget內(nèi)容的學(xué)習(xí)能對你有所幫助!