那些我们解过的bug之对话框锁屏解锁后消失的问题

来源:互联网 发布:广西广电网络上不了网 编辑:程序博客网 时间:2024/04/26 07:11

这里写图片描述

问题描述

现在我负责哥伦比亚的一个订单项目,客户测出了一个bug:

When the handset receive a SAT message, and you turn off the screen, wait for few minutes, turn on the screen, you can see that the SAT message disappears, after few minutes the SAT message appear again.

Please, when the user turn off the screen and turn on, the SAT message need to show in the screen normally, follow the video and log

客户说收到SAT信息后,会弹出一个确认对话框,然后手动熄灭屏幕,等待几分钟,然后再点亮屏幕,发现SAT信息确认对话框消失了,过几分钟确认对话框又弹出来了。

客户希望是一直都有显示出来。

解决问题的瓶颈

此问题的关键是国内的网络不能复现

这非常要命的,对于此种问题,只有二个办法,一是看代码,二是分析log。

解决问题

第一步,对比机测试

我要客户帮忙用同平台,同版本的对比机测试,看看是不是和我们是同样的现象,悲剧的是客户回复没有对比机,如果一定要的话,要向领导申请去市场购买。好吧,算我没说。

第二步,代码分析

我们找到与之相关的代码—StkDialogActivity.java
此对话框是一个Activity:

public class StkDialogActivity extends Activity implements View.OnClickListener {    ................    ................    @Override    protected void onCreate(Bundle icicle) {        super.onCreate(icicle);        ................    }    @Override    public void onResume() {        super.onResume();        ................    }    @Override    public void onPause() {        super.onPause();        ................    }    @Override    protected void onStart() {        super.onStart();        ................    }    @Override    public void onStop() {        super.onStop();       ................    }        @Override    public void onDestroy() {        super.onDestroy();        ................    }       ................}

第三步,分析log

我在activity的每个生命周期加上log,出了一个临时调试userdebug版本,请客户帮忙提供log。

抓log的命令:

adb logcat -v time -b radio -b main -b system >adblog

客户提供了Log,大概2M,我们分析此log:

对话框activity的关键生命周期的log:
oncreate:

12-10 22:52:59.286 D/CAT     ( 3207): StkDialogActivity: hexiaoming: StkDialogActivity--onCreate

onStart:

12-10 22:52:59.314 D/CAT     ( 3207): StkDialogActivity: wenming: StkDialogActivity onStart() 

onResume:

12-10 22:52:59.316 D/CAT     ( 3207): StkDialogActivity: wenming: StkDialogActivity onResume()

onPause:

12-10 22:53:11.317 D/CAT     ( 3207): StkDialogActivity: wenming: StkDialogActivity onPause() 

onStop:

12-10 22:53:11.346 D/CAT     ( 3207): StkDialogActivity: wenming: StkDialogActivity onStop() 

onDestroy:

下面这个log是调用锁屏界面:I/Timeline( 5250): Timeline: Activity_launch_request id:com.celltick.lockscreen time:1663498这个Log是显示锁屏界面I/am_create_activity(  776): [0,490226615,54,com.celltick.lockscreen/.LockerActivity,NULL,NULL,NULL,278986752]这个log是最关键的,关闭对话框确认界面,原因是:no-historyI/am_finish_activity(  776): [0,666614507,53,com.android.stk/.StkDialogActivity,no-history]这个log是关闭对话框确认界面I/am_destroy_activity(  776): [0,666614507,53,com.android.stk/.StkDialogActivity,finish-imm]这个log是对话框确认界面的onDestroy生命周期D/CAT     ( 3207): StkDialogActivity: wenmings: StkDialogActivity onDestroy() 

其实,至此,我们已经知道了,对话框确认界面关闭的原因是no-history。

第四步:修改代码

我们再回到源码中,发现只有在启动对话框确认界面时,有这样的一段代码:

        | Intent.FLAG_ACTIVITY_CLEAR_TOP        | Intent.FLAG_ACTIVITY_SINGLE_TOP        | Intent.FLAG_ACTIVITY_NO_HISTORY

StkAppService.java

Intent newIntent = new Intent(sInstance, StkDialogActivity.class);if (newIntent != null) {    newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK        | Intent.FLAG_ACTIVITY_CLEAR_TOP        | Intent.FLAG_ACTIVITY_SINGLE_TOP        | Intent.FLAG_ACTIVITY_NO_HISTORY        | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS        | getFlagActivityNoUserAction(InitiatedByUserAction.unknown));     newIntent.putExtra(SLOT_ID, mCurrentSlotId);     newIntent.putExtra("TEXT", mCurrentCmd.geTextMessage());startActivity(newIntent);

问题找到了,我们如下修改一下代码:

Intent newIntent = new Intent(sInstance, StkDialogActivity.class);if (newIntent != null) {    newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK//        | Intent.FLAG_ACTIVITY_CLEAR_TOP//      | Intent.FLAG_ACTIVITY_SINGLE_TOP//      | Intent.FLAG_ACTIVITY_NO_HISTORY        | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS        | getFlagActivityNoUserAction(InitiatedByUserAction.unknown));     newIntent.putExtra(SLOT_ID, mCurrentSlotId);     newIntent.putExtra("TEXT", mCurrentCmd.geTextMessage());startActivity(newIntent);

把这三个都注释掉,再编译一个临时版本给客户确认,客户回复说OK了,问题解决。

总结

第一,log的分析:
此问题的解决,因为我们不能重现此问题,只能完全是依靠log信息来定位问题的原因,再找到对应的代码修改。
log是不会说谎的,她会把事实的真相原原本本的记录下来,关键是我们要会看明白她,读懂她。

第二:Intent的这几个FLAG的意义

建议可以先看一下这篇文章:
Activity启动模式 及 Intent Flags 与 栈 的关联分析
http://blog.csdn.net/vipzjyno1/article/details/25463457

Intent.FLAG_ACTIVITY_CLEAR_TOP

这个FLAG就相当于启动模式中的SingleTask,这种FLAG启动的Activity会把要启动的Activity之上的Activity全部弹出栈空间。例如:原来栈中的结构是A B C D ,从D中跳转到B,栈中的结构就变为了A B了。(这个方法可以用来关闭多个Activity,之后的一篇博文里面会提到)

Intent.FLAG_ACTIVITY_SINGLE_TOP

这个FLAG就相当于启动模式中的singletop,例如:原来栈中结构是A B C D,在D中启动D,栈中的情况还是A,B,C,D。

Intent.FLAG_ACTIVITY_NO_HISTORY

顾名思义,此activity没有历史,一旦不可见就立刻关闭。

0 0
原创粉丝点击