在图书馆项目中开始结果请求代码的活动

时间:2018-12-13 17:47:01

标签: android android-activity android-library onactivityresult

我目前正在从事Android的图书​​馆项目,我计划进行开源采购。该库具有我需要为其返回结果的活动,因此正在使用该库的应用将需要调用startActivityForResult

我的问题是,如果用户的应用程序中有一个活动,该活动在其自己的应用程序中调用了第二个活动,该活动也需要返回结果,并且该活动需要从我的图书馆,我的图书馆活动,并且他们自己的活动将使用相同的onActivityResult回调。有没有一种方法可以避免我的活动请求代码,而不会与他们自己的请求代码中的一个冲突,是否只是假设他们自己的请求代码为1、2、3等,并且我是从任意的开始我的库活动请求代码的情况数字,例如1000。

这仅仅是它的工作方式吗?还是有更好的方法来避免我的库请求代码与其他应用程序活动请求代码冲突?

2 个答案:

答案 0 :(得分:3)

我认为该库应该提供一个参数,以便开发人员自行为startActivityForResult指定请求代码,这样它们就不会在调用它们的同一活动或片段中发生冲突。

答案 1 :(得分:0)

Activity A可以选择自己的请求代码,而Activity B永远不会知道A使用了哪个请求代码。

这没问题,因为请求代码是纯本地的。每个Activity实例与其他Activity实例是分开的-它们不会仅仅因为它们都实现相同的方法(例如onCreate()或在您的情况下onActivityResult())而混杂在一起。

让我们看一下source code for android.app.Activity中的一些行,从4614行开始

public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
        @Nullable Bundle options) {
    if (mParent == null) {
        options = transferSpringboardActivityOptions(options);
        Instrumentation.ActivityResult ar =
            mInstrumentation.execStartActivity(
                this, mMainThread.getApplicationThread(), mToken, this,
                intent, requestCode, options);
        if (ar != null) {
            mMainThread.sendActivityResult(
                mToken, mEmbeddedID, requestCode, ar.getResultCode(),
                ar.getResultData());
        }
        if (requestCode >= 0) {
            // If this start is requesting a result, we can avoid making
            // the activity visible until the result is received.  Setting
            // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
            // activity hidden during this time, to avoid flickering.
            // This can only be done when a result is requested because
            // that guarantees we will get information back when the
            // activity is finished, no matter what happens to it.
            mStartedActivity = true;
        }
        cancelInputsAndStartExitTransition(options);
        // TODO Consider clearing/flushing other event sources and events for child windows.
    } else {
        if (options != null) {
            mParent.startActivityFromChild(this, intent, requestCode, options);
        } else {
            // Note we want to go through this method for compatibility with
            // existing applications that may have overridden it.
            mParent.startActivityFromChild(this, intent, requestCode);
        }
    }
}

加引号的代码段中的注释表明,请求代码用于确定是否有要返回的结果。

请注意,startActivityForResult(Intent intent, int requestCode, Bundle options)的参数从同一包 android.app 中的execStartActivity()类的方法Instrumentation传递到方法execStartActivity()中。

但是Activity还有另外四个参数,这些参数用于标识正在调用的应用程序和当前的Context who, IBinder contextThread, IBinder token, Activity target 实例(我在这里不介绍Binder框架的细节,但是例如a youtube video关于这个主题):

startActivityForResult()

同样,请求代码仅用于确定是否有要返回的结果(对于否定的请求代码,startActivity()的处理方式与return requestCode >= 0 ? am.getResult() : null; 相同)

Activity

除此之外,请求代码只是传回​​到名为startActivityForResult()的{​​{1}}。

因此,如果Activity对不同类型的请求没有使用相同的请求代码,那么一切都很好。