widget 桌面组件准确来讲应该是appwidget,平时习惯我们默认了widget就是说桌面组件,对于widget组件的发展历史可以参考这个网址http://baike.baidu.com/view/3541797.html
Intent taskClick = new Intent(context, TaskStopProgress.class); Intent sdClick = new Intent(SD_CLICK_ACTION); Intent usbClick = new Intent(USB_CLICK_ACTION); PendingIntent pendingIntent1; PendingIntent pendingIntent2; PendingIntent pendingIntent3; pendingIntent2 = PendingIntent.getService(context1, 0, usbClick, 0); pendingIntent1 = PendingIntent.getService(context1, 0, sdClick, 0); pendingIntent3 = PendingIntent .getActivity(context, 0, taskClick, 0); rv.setOnClickPendingIntent(R.id.SD_ImgView, pendingIntent1); rv.setOnClickPendingIntent(R.id.Task_ImgView, pendingIntent3); rv.setOnClickPendingIntent(R.id.USB_ImgView, pendingIntent2); appWidgetManager.updateAppWidget(appWidgetId, rv);一般的appwidget组件事件绑定方式如下,首先new Intent 新建的intent由你的PendingIntent通知对象不同而不同,如果为service我们既可以通过getbroadcast方式广播,然后再service那一端用getintent方式获取传递过来的消息,也可以通过getservice方式调用service,只不过这种方式和startservice方式是差不多的,我们在service的onstart方法中就可以通过其参数intent获取传递过来的消息(也可以在onstartcomment回调函数中获取),而Remotviews主要是通过AppWidgetManager对象的updateAppWidget函数进行更updateAppWidget第一参数有两种形式ComponentName和appWigetID(Int型也就是每个组件的id)而ComponentName
thisWidget = new ComponentName(OperaService.this, TaskOperationProvider.class);构建形式如上代码所示,而AppwidgetManager构建形式如下:
appManager = AppWidgetManager.getInstance(OperaService.this);其实说了这么多,在桌面组件更新时,最最关键的还是Remoteviews对象,我们先来看下其构造函数的两个参数帮助文档如下
RemoteViews(String packageName, int layoutId)第一个为该应用的packageName,而第二个为appwidget的布局文件的id,所以只要Remoteviews得到的是同一appWdiget的对象,那么桌面组件的按键效果就会存在,但是如果android系统由于某种原因的launcher对所有的桌面组件重新rebinding了,那么此时自己的应用获取的RemoteViews还是不是以前那个呢,有可能不是了,所以此时会表现出桌面组件无响应现象,解决此问题方法有很多,其中一个有效方法便是重新执行setOnClickPendingItent重新绑定控件。