开启一个服务定时更新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);否则关闭服务会报空指针