开启一个服务定时更新widget组件

来源:互联网 发布:sql server使用 编辑:程序博客网 时间:2024/06/06 17:40

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

原创粉丝点击