添加widget失败

预备知识:如果widget的配置文件里配置下述内容时,当用户添加widget时会打开对应的Activity进行配置

 

正题:上周项目上遇到了一个bug,bug现象是:在桌面添加widget,流程是启动app的MainActivity,这个app是一个需要授权的app,当授权流程走完了之后,发现widget并没有添加成功,看log也没有报错信息,如果添加widget的时候不走授权流程,是没有问题。

从现象看,肯定是授权的流程有问题啦,看了代码逻辑和activity的启动关系,也没有发现任何问题。然后打印widget的流程开始分析,发现widget的provider居然收到了一个“android.appwidget.action.APPWIDGET_DELETE”的广播,这个广播我只知道在widget被删除的时候才会收到,可是我又没有做删除操作,这是为什么呢。。。除了用户主动删除,那就只能是系统删除了,那么系统为什么会发这个广播呢?开始看launcher的代码,在里面搜appwidget相关的代码,打log,调试,再结合之前看得出问题的app的各个activity的生命周期,终于知道了!!

MainActivity中启动PermissionActivity去检查权限,然后在PermissionActivity是这样写的

 if (!hasPermissions(activity, requiredPermissions)) { //activity:MainActivity
            final Intent intent = new Intent(activity,  newActivityClass);
            intent.putExtra(PREVIOUS_ACTIVITY_INTENT, activity.getIntent());
            activity.startActivity(intent);
            activity.finish();         //有问题代码
        }

如果在widget还没有add完成,对应的activity关闭,通俗得理解就是launcher认为用户不想添加widget了,所以launcher就执行了删除操作。

把上述有问题的代码删除了之后,发现还是添加不上widget,继续比较正常和非正常情况下widget的广播接收,发现有一个广播在异常情况的时候没有接收到android.appwidget.action.APPWIDGET_UPDATE_OPTIONS

这个广播从名字看似乎跟显示就有关系的,然后继续捋各个activity的生命周期,又发现了!还是在PermissionActivity里


    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[],
            int[] grantResults) {
        if (permissions != null && permissions.length > 0
                && isAllGranted(permissions, grantResults)) {
            mPreviousActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            
            startActivity(mPreviousActivityIntent); //有问题代码,start的是MainActivity
            finish();
            overridePendingTransition(0, 0);
        } else {
            Toast.makeText(this, R.string.missing_required_permission, Toast.LENGTH_SHORT).show();
            finish();
        }
    }

把问题处代码注释掉之后,一切OK,该收到的广播也都收到了

PS:其实我并不知道我的“前任“为什么这么写代码:check权限的时候,如果没有权限把MainActivity关闭,获取了权限之后再重新开启。虽然intent的参数全程都带着了,但是破坏了widget的启动流程

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值