窗口小部件的使用AppWidget

最近複習了下Appwidget的使用,做了個簡單的案例

創建一個widget能夠時時刷新時間,並能點擊按鈕實現代碼的交互


知識梳理:

APPwidget是一個系統級服務,Appwidget在安裝應用或頁面啓動會掃描系統所有已安裝的Apk清單文件,發現清單中有AppWidgetProvider的子類會有響應

其中AppWidgetProvider並不是內容提供者,而是繼承BroadCastReceiver


效果如圖;



開發步驟 

① 佈局Layout

② 創建AppWidgetProvider

③ 配置<receiver

④  描述文件



佈局


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:background="#3366FF"
    >
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="widget按鈕" />
</RelativeLayout>


創建 一個類繼承AppWidgetProvider

package com.itheima.appwidgett;

import android.appwidget.AppWidgetProvider;

public class MyAppWidgetReceiver extends AppWidgetProvider {

	
}

配置

<!-- 在清單文件配置widget -->
        <receiver android:name="com.itheima.widget.receiver.MyWidagetReceiver" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/my_appwidget_info" />

描述文件

描述文件:創建一個xml ,並如下配置
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/view_appwidget"
    android:minHeight="100dp"
    android:minWidth="200dp"
    android:previewImage="@drawable/biz_weight4x1"
    android:resizeMode="horizontal|vertical"
    android:updatePeriodMillis="1000" >
</appwidget-provider><!-- android:minWidth最小寬度 -->
<!-- minHeight最小高度 -->
<!-- updatePeriodMillis 86400000 毫秒 =24小時     每隔半小時   Service+Timer -->
<!-- previewImage預覽圖片 -->
<!-- resizeMode 拉伸 -->

創建一個服務


public class WidgetService extends Service {

	private Timer timer;
	private TimerTask timerTask;
	@Override
	public void onCreate() {
		Log.i("wlz", "WidgetService---創建");
		timer = new Timer();
		timerTask = new TimerTask() {
			
			@Override
			public void run() {
				// 
				SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日  HH:mm:ss");
				Date date = new Date();
				String time = simpleDateFormat.format(date);
				Log.i("wls", time);
				RemoteViews remoteView=new RemoteViews("com.itheima.appwidgett", R.layout.view_appwidget);
				
				//setTextViewText  實現 findViewById   setText
				remoteView.setTextViewText(R.id.button1, time);

				//PendingIntent:點擊式的Intent
				//  setOnClickPendingIntent          實現 findViewById setOnClick
				Intent intent=new Intent();//widget點擊事件讓程序執行一段代碼通過發送廣播完成
				intent.setAction("com.itheima.widget.action.UPDATE");
				PendingIntent pIntent=PendingIntent.getBroadcast(getBaseContext(), 0, intent, 0);
				remoteView.setOnClickPendingIntent(R.id.button1, pIntent);
				//com.itheima.widget.receiver.MyWidagetReceiver
//				RemoteView:不是真正的View 用於進程間的對view操作。
				ComponentName name=new ComponentName("com.itheima.appwidgett", "com.itheima.appwidgett.MyAppWidgetReceiver");
				//刷新widget
				AppWidgetManager.getInstance(getBaseContext()).updateAppWidget(name, remoteView);
//				AppWidgetManager.getInstance(getBaseContext()).updateAppWidget(更新的widget的類名,
			}
		};
		
		timer.schedule(timerTask, 0, 1000);

	}
	@Override
	public void onDestroy() {
		Log.i("wlz", "WidgetService---銷燬");
		if(timer!=null)
		{
			timer.cancel();
			timer=null;
		}

	}
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}

}

實現小部件調用代碼需要用廣播來處理

爲什麼使用到廣播來處理事件?

點擊是在桌面程序的widget是一個進程

處理代碼卻在 另外一個進程,只有廣播與aidl可以跨進程使用。



創建一個廣播測試widget通過廣播實現與代碼的交互

public class WidgetClickReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		Toast.makeText(context, "AAAAAAAA", Toast.LENGTH_LONG).show();

	}

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章