避免从自身开始 activity

Avoid start an activity from itself

我的应用程序中有一个自定义按钮栏,我在多个 activity.
中使用它 它有一个开始 SettingsActivity 的设置按钮。

问题是:

我也在 SettingsActivity 中使用了这个按钮栏,我想避免从 SettingsActivity 本身开始。 我在一个片段中为按钮设置了 onClick,我在我的活动中使用了这个片段,然后我不能设置任何标志或额外的数据。

在设置按钮的 onClick 中,我设置了这样的意图:

intent = new Intent(getActivity(), SettingsActivity.class);
startActivityForResult(intent, 1);

我的工作:

我有 ParentActivity 所有其他 activity 都从它扩展,我覆盖了其中的 startActivityForResult 方法。
结果是我有开始 SettingsActivity.

的意图
@Override
    public void startActivityForResult(Intent intent, int requestCode) {
        super.startActivityForResult(intent, requestCode);
        overridePendingTransition(R.anim.anim_slide_in_left, R.anim.anim_slide_out_left);
    }

我想要的:

我想知道如何检测哪个 activity 调用了这个意图以及哪个 activity 将启动?

(抱歉我的英语不好)

您可以使用另一个参数 name 重载 startActivityForResult。所以在设置按钮的onClick中,直接使用重载的方法:

onClick(View v){
    intent = new Intent(getActivity(), SettingsActivity.class);
    startActivityForResult(intent, 1, this.getClass().getName());
}

父活动:

public void startActivityForResult(Intent intent, int requestCode, String name) {
if(!name.equals(com.yourpackage.settingsactivity))
    startActivityForResult(intent, requestCode);
else Toast.makeText(this, "Already in SettingsActitivty", Toast.LENGTH_SHORT).show;
}
@Override
public void startActivityForResult(Intent intent, int requestCode) {
    super.startActivityForResult(intent, requestCode);
    overridePendingTransition(R.anim.anim_slide_in_left, R.anim.anim_slide_out_left);
}

因此,假设您需要做的就是避免从自身调用 SettingsActivity,我建议您尝试其中一种内置启动模式。

http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

如果您将 singleTop 用于 SettingsActivity,当它已经位于堆栈顶部时启动它不会导致启动新的 activity,而是启动现有的 activity 将调用其 onNewIntent() 方法(如果您不需要执行任何操作,可以忽略该方法)。

或者,如果出于某种原因这行不通,请进一步采用 Marlon 的建议,并假设您以明确的意图(设置 class 名称)启动 SettingsActivity,您可以覆盖 startActivityForResult 并检查调用 activity 是否与目标 activity 相同,而不必使用 name 参数重载方法。

@Override
public void startActivityForResult(Intent intent, int requestCode) {
    if (!intent.getComponent().getClassName().equals(getClass().getName()) {
        super.startActivityForResult(intent, requestCode);
    }
}