关于activity的startActivityForResult / onActivityResult / setResult学习和理解

最近在工作过程中,需要涉及到数据埋点,来监听用户操作,统计功能模块用户的行为和数据量。之前用startActivity就有点不合适,因为跳转到目标activity的入口可能很多,所以不适合进行埋点行为。


所以在此引入

     - startActivityForResult 
     - onActivityResult
     - setResult

这几个方法,学过android开发的都会接触过,现在我就讲解一下运用这几个方法来进行数据埋点。


我们以LoginActivity为例进行讲解
我们在做app时候,通常都不需要用户登录就可以浏览app,当只有涉及到用户操作的时候才让用户登录,比如:点赞,评论等。现在假设有A,B 2个activity需要跳转到LoginActivity登录。

  • 方法之间的关系。
  /**
     * Modifies the standard behavior to allow results to be delivered to fragments.
     * This imposes a restriction that requestCode be <= 0xffff.
     */
    @Override
public void startActivityForResult(Intent intent, int requestCode) {
  if (requestCode != -1 &&(requestCode&0xffff0000) != 0) {
      throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
        }
super.startActivityForResult(intent, requestCode);
    }

这是startActivityForResult的源码,我们在使用的时候需要在A页面调用改方法,传入一个requestCode跳转到LoginActivity,然后在A页面重载方法onActivityResult

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    }

这里有个参数requestCode就是我们在A页面startActivityForResult传入的code值,resultCode 是我们在LoginActivity里面调用

public final void setResult(int resultCode, Intent data) {
        synchronized (this) {
            mResultCode = resultCode;
            mResultData = data;
        }
    }

里面传入的resultCode。

  • 怎么进行数据埋点

    onActivityResult()这个回调方法里面,我们先判断resultCode和LoginActivity里setResult()的code是否一样,然后在判断request 的code,这个酒能坚挺到用户结束登录回传到A页面的操作行为,可以进行埋点操作。

  • 注意事项
    1.根据项目的实际需要进行定义,特别需要注意的是,requestCode必须 >= 0,否则此类效果失效,其效果将变成startActivity()效果;
    2.resultCode表示B中处理后的结果状态,系统内部定义了RESULT_OK、RESULT_CANCELED和RESULT_FIRST_USER三种状态。当然,自己可以定义成任何int型标识状态。
    3.有时在复杂的业务逻辑中,可能存在A startActivityForResult 到B,同时C也startActivityForResult 到B,且requestCode可能相同(以表示同意业务请求),这时可能需要在B中针对性的判断此请求来源(来自于A还是C)。此时,可以通过intent传参形式。相信大家都比较熟悉,其实Activity类中也提供了相应的函数可以获取到来源Activity的类型函数:getCallingActivity()。但需要注意此函数仅针对startActivityForResult有效,返回的结果中包含完成包名。
    4.A中回调函数调用时机需要注意,其调用发生在B的onPause之后,A的onRestart之前(如果B完成遮住了A),且必然在onResume之前。
    5.此函数组合针对B的启动模式为singleTask或singInstance将会失效。此时,onActivityResult将在A的onpause之后直接回调,且resultCode为RESULT_CANCELED。
    6.对于一个复杂的回调,例如我们想从A页面跳转到登录,然后跳转到注册页面进行注册,注册完成我们需要在A页面埋点监听这个状态,怎么办呢?我们可以在Login页面回调获取注册状态,然后在回调A的activityResult方法,通知A的注册状态,在A中处理登录成功的信息。

猜你喜欢

转载自blog.csdn.net/ibelieveyouwxy/article/details/53129943