如何知道 activity 是否在没有转换的情况下开始?

How can one know if an activity is started without a transition?

我有一个用例,在该用例中,我主要使用过渡启动 activity,但从导航抽屉打开它时情况并非如此。

为了保持过渡平稳,我有一个 Transition.TransitionListener,其中我在过渡完成时触发一些 UI 更新。

所以我有这样的东西:

public class SomeActivity extends Activity {

    public void onCreate(Bundle savedInstanceState){ 
        // ...
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            Transition sharedElementEnterTransition = getWindow().getSharedElementEnterTransition();
            sharedElementEnterTransition.addListener(new Transition.TransitionListener() {
                // ...
                @Override
                public void onTransitionEnd(Transition transition) {
                    doSomeUiUpdating();
                }
            });
        } else { // Pre-Lollipop
            doSomeUiUpdating();
        }
    }
}

这在使用动画启动 Activity 时效果很好,但是 我怎么知道 Activity 是否在没有过渡的情况下启动,以便我可以调用 doSomeUiUpdating()?

我确定 ActivityWindowTransition 或我忽略的地方一定有一个简单的方法。我不想继续调用 Activity 来设置一些指示动画是否显示的包。

您可以尝试 onTransitionStartTransitionListener 来设置一些布尔值 isAnimationStarted

public class SomeActivity extends Activity {

    private boolean isAnimationStarted = false;

    public void onCreate(Bundle savedInstanceState) { 
        // ...
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            Transition sharedElementEnterTransition = getWindow().getSharedElementEnterTransition();
            sharedElementEnterTransition.addListener(new Transition.TransitionListener() {
                // ...
                @Override
                public void onTransitionEnd(Transition transition) {
                    doSomeUiUpdating();
                }

                @Override
                public void onTransitionStarted(Transition transition) {
                    isAnimationStarted = true;
                }
            });
        }
    }

    public void onStart() {
        if (!isAnimationStarted) {
            doSomeUiUpdating();
        }
    }

}

由于您正在启动 Activity,因此您将使用 Intent 来启动它。您可以向 Intent 添加额外内容并在被调用 ActivityonCreate() 中检查它们。

假设我们有 2 个活动 – ActivityAActivityB

现在,我们假设 ActivityA 是主叫 ActivityActivityB 是被叫 Activity

ActivityA 中,假设您编写了一些代码以 ActivityB 开头 SharedElementTransition

@Override
public void onClick(View v) {
    Intent startActivityBIntent = new Intent(getContext(), ActivityB.class);
    startActivityBIntent.putExtra("IS_SHARED_ELEMENT_TRANSITION_ENABLED", true);
    ActivityOptionsCompat activityOptionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), view, ViewCompat.getTransitionName(view));
    startActivity(startActivityBIntent, activityOptionsCompat);
}

现在,如果您注意到上面的内容,我已经使用 putExtra() 方法传递了一个额外的 Intent。我已将 Boolean 值传递给 true,因为我打算用 SharedElementTransition 启动 Activity。

现在在 ActivityBonCreate() 方法中,您可以只检查传递给 Intent 的布尔值。如果你传递了 false,那么你可以添加一个条件语句并在那里执行你的 UI 更新。我在下面给了你一个小片段来帮助你开始:

private static final String isSharedElementTransitionEnabled = "IS_SHARED_ELEMENT_TRANSITION_ENABLED";    

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_b);

    // If you are postponing your SharedElementTransition, don't forget to call postponeEnterTransition() and override onPreDraw()

    if (!getIntent().getExtras().getBoolean(isSharedElementTransitionEnabled)) {
        //Do your UI updation here
    }
}

这样做的好处是您可以完全控制内容转换和共享元素转换的效果。