【问题标题】:Log the why of the activity is resumed记录活动恢复的原因
【发布时间】:2016-08-11 17:13:18
【问题描述】:

有没有办法知道活动的 onresume 是因为“后退按钮”而被调用,还是因为内部应用程序在后台而被调用? 我必须记录这些不同的操作:/ 这是场景: 我有 4 个活动 A-B-C-D ;我需要记录活动之间的导航,我不想记录由后台应用程序唤醒引起的 onresume :)

【问题讨论】:

    标签: android android-activity activity-lifecycle


    【解决方案1】:

    从 Activity A 开始,当您将启动 Activity B/C/D 时,使用和标识符并启动 Activity 以获得结果。

    例如:

    int ActivityBID = 1;
    Intent i = new Intent(this,  ActivityB.class);
    startActivityForResult(i, ActivityBID );
    

    在您的活动 B 中,您覆盖 onBackPressed:

    @Override
    public void onBackPressed() {
       Intent intent = new Intent();
       intent.putExtra("activity","B")
       setResult(RESULT_OK, intent);        
       finish();
    }
    

    并支持活动 A:

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == ActivityBID ) {
             if(resultCode == RESULT_OK){
                 String stredittext=data.getStringExtra("activity");
             }     
        }
    } 
    

    注意:内部 if 和变量不是必需的,因为您已经知道结果来自什么活动,但是,我认为您可能希望在此返回中传递一些数据,所以我离开了。

    编辑图片以ActivityForResult为例

    【讨论】:

    • 这样我只在发生后按事件时才写日志?例如:A-B-C-B 使用这种方法,如果用户关闭应用程序而不返回 A,我将只写 B?
    • 这样你就可以在onActivityResult里面登录了,所以只有intent有ActivityResult的时候才会dispatch代码,当你关闭APP的时候不会出现这种情况。您可以创建其他变量,例如 ActivityBID,以识别结果来自哪个 Activity。
    • 但是在您的代码中,只有当用户按下后退按钮时才会调用 setresult 吗?
    • 唯一设置结果的部分在后面,所以是的。如果您愿意,您可以在设置结果中传递一些标识符并调试其他情况
    • 如果你使用 Activity B 中的startActivityforResult 启动 Activity C,Activity B 就会有结果。我会发布一张带有一些解释的图片
    【解决方案2】:

    Activity 暂停时,onPause() 被调用。在onPause() 中,将正在暂停的Activity 的名称写入全局static 变量中。

    Activity 被恢复时,onResume() 被调用。在onResume 中检查全局static 变量是否包含此Activity 的名称。如果是这样,您可以省略日志,因为此 Activity 刚刚暂停/恢复。

    【讨论】:

    • 这种方式有点问题。如果导航是 A-B-A-C ,您将只写 A-B-C 。
    • 没有。从B返回A时,调用B.onPause()(会将“B”写入全局),然后调用A.onResume()(会看到全局不是“A”,所以会记录“A​​”)。你真的试过了吗?
    【解决方案3】:

    例如,您可以覆盖 onBackPressed() 回调

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        /* add your log here */
    }
    

    onResume() 收集日志加上来自onBackPressed() 的日志(如果有),然后您可以检测各种场景。

    【讨论】:

    • 我有 4 个活动 A-B-C-D ;我需要记录活动之间的导航,我不想记录由后台应用程序唤醒引起的 onresume :)
    猜你喜欢
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    相关资源
    最近更新 更多