widget 点击事件突然失效
2012-11-23 11:05
204 查看
前不久做的一个android项目,测试出一个让人很郁闷的BUG。在部分galaxy note里,原来设定的通过点击widget打开应用突然间失效,点击widget无反应。而且这个bug只在部分galaxy note上有。
在widget使用的绑定方式如:
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
//super.onUpdate(context, appWidgetManager, appWidgetIds);
final int N = appWidgetIds.length;
for (int i=0; i<N; i++) {
int appWidgetId = appWidgetIds[i];
//获取远程的控件,第一个参数设置程序名称,第二个参数是设置AppWidget的布局文件
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget);
Intent openApp = new Intent(context, WebViewActivity.class);
openApp.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
openApp.putExtra("widgetId", appWidgetId);
PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, openApp, PendingIntent.FLAG_UPDATE_CURRENT);
// 设置widget的点击事件
views.setOnClickPendingIntent(R.id.txtapp, pendingIntent);
//更新AppWidget的绑定事件
//第一个参数指定绑定到哪一个AppWidget
//第二个参数是指定要更新哪一个远程控件
appWidgetManager.updateAppWidget(appWidgetId, views);
}
这种绑定方式,是比较常见的,各个网站都有,要注意的地方呢就是在PendingIntent.getActivity中的四个参数,特别就是第二个参数与第四个参数。
PendingIntent android.app.PendingIntent.getActivity(Context context, int requestCode,Intent
intent, int flags)
requestCode官方说明是目前这个参数不再适用,可是这个参数经测试在部分情况是有用的,至少我的测试结果是这样表明的。flags跟intent是否带参有关系。flags通常用的是两个
和flags设为0,在intent带参数的情况下,这种设置是有问题的,比如会导致这个widget多次被创建的时候,只有最新创建的widget有效。(这里就不多说了,各种资料网上很多)
我要说的是,在测试过程中,发现上述的绑定,居然在安装微信并且同意创建微信的桌面快捷方式后,我们的widget失效了。这种情形还只出现在华为和三星的galaxy note上。原因不明。。。
再次我们将绑定点击事件的位置进行更改。添加onReceive方法,并在此方法中进行点击事件的绑定。并且我们设置定时更新这个widget。
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
AppWidgetManager appWidgetManger = AppWidgetManager.getInstance(context);
int[] appWidgetIds = appWidgetManger.getAppWidgetIds(new ComponentName(context, EPASAppWidgetProvider.class));
final int N = appWidgetIds.length;
for (int i=0; i<N; i++) {
int appWidgetId = appWidgetIds[i];
//获取远程的控件,第一个参数设置程序名称,第二个参数是设置AppWidget的布局文件
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget);
Intent openApp = new Intent(context, WebViewActivity.class);
openApp.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
openApp.putExtra("widgetId", appWidgetId);
PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, openApp, PendingIntent.FLAG_UPDATE_CURRENT);
// 设置widget的点击事件
views.setOnClickPendingIntent(R.id.txtapp, pendingIntent);
//更新AppWidget的绑定事件
//第一个参数指定绑定到哪一个AppWidget
//第二个参数是指定要更新哪一个远程控件
appWidgetManger.updateAppWidget(appWidgetId, views);
}
}
此方法解决了在安装微信并且同意创建微信的桌面快捷方式后,widget失效了的问题。
依然不大明白为什么华为和三星的galaxy note上widget的点击事件会失效。如果大家有关于这方面好的想法或是知道如何解决请留言分享。
谢谢!
下面贴上我的整个代码
在widget使用的绑定方式如:
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
//super.onUpdate(context, appWidgetManager, appWidgetIds);
final int N = appWidgetIds.length;
for (int i=0; i<N; i++) {
int appWidgetId = appWidgetIds[i];
//获取远程的控件,第一个参数设置程序名称,第二个参数是设置AppWidget的布局文件
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget);
Intent openApp = new Intent(context, WebViewActivity.class);
openApp.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
openApp.putExtra("widgetId", appWidgetId);
PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, openApp, PendingIntent.FLAG_UPDATE_CURRENT);
// 设置widget的点击事件
views.setOnClickPendingIntent(R.id.txtapp, pendingIntent);
//更新AppWidget的绑定事件
//第一个参数指定绑定到哪一个AppWidget
//第二个参数是指定要更新哪一个远程控件
appWidgetManager.updateAppWidget(appWidgetId, views);
}
这种绑定方式,是比较常见的,各个网站都有,要注意的地方呢就是在PendingIntent.getActivity中的四个参数,特别就是第二个参数与第四个参数。
PendingIntent android.app.PendingIntent.getActivity(Context context, int requestCode,Intent
intent, int flags)
requestCode官方说明是目前这个参数不再适用,可是这个参数经测试在部分情况是有用的,至少我的测试结果是这样表明的。flags跟intent是否带参有关系。flags通常用的是两个
FLAG_CANCEL_CURRENT和FLAG_UPDATE_CURRENT。网上很多是将requestCode
和flags设为0,在intent带参数的情况下,这种设置是有问题的,比如会导致这个widget多次被创建的时候,只有最新创建的widget有效。(这里就不多说了,各种资料网上很多)
我要说的是,在测试过程中,发现上述的绑定,居然在安装微信并且同意创建微信的桌面快捷方式后,我们的widget失效了。这种情形还只出现在华为和三星的galaxy note上。原因不明。。。
再次我们将绑定点击事件的位置进行更改。添加onReceive方法,并在此方法中进行点击事件的绑定。并且我们设置定时更新这个widget。
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
AppWidgetManager appWidgetManger = AppWidgetManager.getInstance(context);
int[] appWidgetIds = appWidgetManger.getAppWidgetIds(new ComponentName(context, EPASAppWidgetProvider.class));
final int N = appWidgetIds.length;
for (int i=0; i<N; i++) {
int appWidgetId = appWidgetIds[i];
//获取远程的控件,第一个参数设置程序名称,第二个参数是设置AppWidget的布局文件
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget);
Intent openApp = new Intent(context, WebViewActivity.class);
openApp.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
openApp.putExtra("widgetId", appWidgetId);
PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, openApp, PendingIntent.FLAG_UPDATE_CURRENT);
// 设置widget的点击事件
views.setOnClickPendingIntent(R.id.txtapp, pendingIntent);
//更新AppWidget的绑定事件
//第一个参数指定绑定到哪一个AppWidget
//第二个参数是指定要更新哪一个远程控件
appWidgetManger.updateAppWidget(appWidgetId, views);
}
}
此方法解决了在安装微信并且同意创建微信的桌面快捷方式后,widget失效了的问题。
依然不大明白为什么华为和三星的galaxy note上widget的点击事件会失效。如果大家有关于这方面好的想法或是知道如何解决请留言分享。
谢谢!
下面贴上我的整个代码
import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.util.Log; import android.widget.RemoteViews; public class EPASAppWidgetProvider extends AppWidgetProvider{ @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { //super.onUpdate(context, appWidgetManager, appWidgetIds); final int N = appWidgetIds.length; for (int i=0; i<N; i++) { int appWidgetId = appWidgetIds[i]; //获取远程的控件,第一个参数设置程序名称,第二个参数是设置AppWidget的布局文件 RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget); Intent openApp = new Intent(context, WebViewActivity.class); openApp.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); openApp.putExtra("widgetId", appWidgetId); PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, openApp, PendingIntent.FLAG_UPDATE_CURRENT); // 设置widget的点击事件 views.setOnClickPendingIntent(R.id.txtapp, pendingIntent); //更新AppWidget的绑定事件 //第一个参数指定绑定到哪一个AppWidget //第二个参数是指定要更新哪一个远程控件 appWidgetManager.updateAppWidget(appWidgetId, views); } } @Override public void onDeleted(Context context, int[] appWidgetIds) { super.onDeleted(context, appWidgetIds); } @Override public void onEnabled(Context context) { super.onEnabled(context); //Log.i("widget", "222222222 AppWidget onEnabled"); //启动服务 Intent intent = new Intent(context, UpdateUndoTNService.class); intent.putExtra("isalarm", false); context.startService(intent); //context.stopService(intent); } @Override public void onDisabled(Context context) { super.onDisabled(context); //Log.i("widget", "222222222 AppWidget onDisabled"); // 停止服务 Intent intent = new Intent(context, UpdateUndoTNService.class); intent.putExtra("isalarm", false); context.stopService(intent); } @Override public void onReceive(Context context, Intent intent) { //Log.i("widget", "222222222 AppWidget onReceive"); super.onReceive(context, intent); AppWidgetManager appWidgetManger = AppWidgetManager.getInstance(context); int[] appWidgetIds = appWidgetManger.getAppWidgetIds(new ComponentName(context, EPASAppWidgetProvider.class)); final int N = appWidgetIds.length; for (int i=0; i<N; i++) { int appWidgetId = appWidgetIds[i]; //获取远程的控件,第一个参数设置程序名称,第二个参数是设置AppWidget的布局文件 RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget); Intent openApp = new Intent(context, WebViewActivity.class); openApp.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); openApp.putExtra("widgetId", appWidgetId); PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, openApp, PendingIntent.FLAG_UPDATE_CURRENT); // 设置widget的点击事件 views.setOnClickPendingIntent(R.id.txtapp, pendingIntent); //更新AppWidget的绑定事件 //第一个参数指定绑定到哪一个AppWidget //第二个参数是指定要更新哪一个远程控件 appWidgetManger.updateAppWidget(appWidgetId, views); } } }
相关文章推荐
- 解决Listview中Item中控件设置点击事件而Item点击事件失效问题
- pc端点击事件在移动端失效(zepto)
- Android中ListView点击事件失效的解决办法
- 7.5 widget内的内容更新和点击事件
- android用webview加载H5页面出现点击事件失效的问题解决
- Listview和GrideView嵌套使用时出现的点击事件失效的问题
- ListVIew点击事件失效
- ListVIew点击事件失效
- DrawerLayout抽屉布局item点击事件失效原因之一
- ListVIew点击事件失效
- jquery点击事件失效原因及其解决办法
- iphone上对于动态生成的html元素绑定点击事件$(document).click()失效解决办法
- 【IE bug 解决办法】IE下(IE10及以下)当元素为absolute定位时,点击事件失效的解决办法 分类: ie ie bug ie absolute click 2015-06-26 11:05 21人阅读 评论(0) 收藏
- Android 中listview嵌套listview,外面listview的item点击事件失效
- iOS Safari 中点击事件失效的解决办法
- css的hover事件,如果点击之后通过js操作样式,hover事件就会失效的处理方法,外部css样式与js的DOM样式谁的权重高?
- Android开发:ListView系列之item点击事件的实现及点击事件失效的解决办法
- Apple 移动设备绑定动态生成元素点击事件$(document).on('click',element,callback)失效解决方法
- Listview点击事件失效问题解决以及每个Item 子控件获取focus
- unity3D 长按Button使button失效点击事件