widget 点击事件突然失效

        前不久做的一个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通常用的是两个 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);
         }
     }
     
 }  





  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值