開啓一個服務定時更新widget組件
1.創建一個類繼承AppWidgetProvider類實現裏面的onEnabled()跟onDisabled()方法
2.在onEnabled()方法中進行初始化操作,用意圖開啓一個後臺的服務,讓服務更新widget裏面的內容
3.創建一個繼承Service服務,這個服務是用來更新widget的內容的,複寫裏的onCreate()跟onDestroy()方法
4.在onCreate()方法時定時的去更新widget裏面的內容,用定時器
Time創建一個定時器
TimerTask創建一個定時任務,在任務中的run()方法中去更新widget
5.在run()方法中更新widget
1>獲取widget管理器的實例
AppWidgetManger awm = AppWidgetManager.getInstance(getApplicationContext());//在service中用getApplicationContext()方法去獲取上下文
2.>widget管理器有如下方法
getAppWidgetIds(ComponentName provider)//可以獲取widget的id
getAppWidgetInfo()可以獲取widget的信息
updateAppWidget(provider,views);
provider:定義要更新的widget的組件(廣播接收者)
ComponentName provider = new ComponentName(pkg,cls);第一參數是組件所在包名,getPackageName()得到,第二參數是widger的class名稱(cn.itcast.mobilesafe.receiver,MyWidget)
views:RemoteViews的對象,是遠程的view對象,widget的顯示其實是一個進程間通信的操作,在手機衛士的進程裏面把view對象準備出來,傳遞給桌面的應用
RemoteViews views = new remoteViews(packageName,layoutId);
packageName:view對象本身所在的包名getPackageName(),即桌面程序
layoutId:widget的佈局在我們的手機衛士裏定義的widget佈局,然後就創建出來一個可以在進程間進行通訊的view對象了
3>拿到RemoteViews對象以後就可以更改裏面的內容了
views.setBitmap()設置一個位圖
views.setTextViewText(viewId,text);//更新某一個textView裏面的文本
views.setTextViewText(R.id.process_count,"正在運行進程數"+count);這裏的R.id.process_count是在widget佈局裏定義的textView組件的id
6.run()方法完成後開啓這個定時器
timer.schedule(task,1000,1000);每隔一秒鐘更新一次
7.在onDestory()服務退出時調用如下方法:
timer.cancel;
timer = null;
task = null;
8.完成上面的service類就在我們定義的繼承AppWindgetProvider類的onEnabled()方法中開啓這個服務
Intent intent = new Intent(context,UpdateWidgetService.class);
context.startService(intent);
9.在onDisable()方法中停止這個服務
context.stopService(intent);
10.因爲這個widget是一個廣播接收者,所以生命週期只有10幾秒鐘,所以在關閉時,把初始化這個服務
Intent intent = new Intent(context,UpdateWidgetService.class);否則關閉服務會報空指針