如何在Android中了解调用活动

39
我有一个活动,被几个其他活动调用。例如,我有Activity1、Activity2和Activity3。 Activity1调用Activity2并传递参数。 Activity3也调用Activity2并传递参数。
现在,根据调用的活动,Activity2执行一些任务。 我如何知道是哪个活动在调用Activity2?

可能是重复的问题:如何知道一个 Activity 是使用 startActivityForResult 调用还是仅使用 startActivity 调用?(原文链接:https://dev59.com/B2sz5IYBdhLWcg3w8Mcb) - Pankaj Kumar
你是认真的吗??一个几个月后被问到的问题怎么可能是另一个问题的重复?? - Reza.Hoque
首先不要因为重复而惊慌。我并没有指责你做错了什么。我认为重复并不取决于问题提出的日期。请看这个帖子https://dev59.com/MWw15IYBdhLWcg3wIYO_#6812066,我在其中回答了一个问题,而该问题是在目标问题之前几个月提出的。 - Pankaj Kumar
8个回答

64
如果您使用startActivityForResult(Intent, int)启动活动,则可以通过getCallingActivity().getClassName()获取调用活动的类名。

7
那么要如何获取活动调用者的实际实例呢? - ralphgabb
4
@ralphgabb 只需删除 .getClassName() 部分。 - user9255534

42

A. 如果你可以使用startActivityForResult

根据下面Zain Ali的回答: 如果你可以通过startActivityForResult()来启动Activity, 那么你可以通过this.getCallingActivity().getClassName()获取调用Activity类的名称。

B. 如果你不能使用startActivityForResult

如果你不能使用startActivityForResult(), 那么你可以使用以下方法: 你可以在意图中传递附加参数,检查活动中的值并相应地执行操作。

1) 定义一个接口或常量类以定义整数常量以指示调用活动。

public interface ActivityConstants {
            public static final int ACTIVITY_1 = 1001;
            public static final int ACTIVITY_2 = 1002;
            public static final int ACTIVITY_3 = 1003;
}

2) 在调用Activity2时,在意图中添加额外的参数。

        Intent act2 = new Intent(context, Activity2.class);
                act2.putExtra("calling-activity", ActivityConstants.ACTIVITY_1);
    // or ActivityConstants.ACTIVITY_3 if called form Activity3
startActivity(act2);

3) 检查Activity2中该额外参数的值,并根据情况采取行动。

int callingActivity = getIntent().getIntExtra("calling-activity", 0);

        switch (callingActivity) {
        case ActivityConstants.ACTIVITY_1:
            // Activity2 is started from Activity1
            break;
        case ActivityConstants.ACTIVITY_3:
            // Activity2 is started from Activity3
            break;
        }

9
在你的调用活动中(FirstActivity):
Intent i = new Intent(FirstActivity.this, SecondActivity.class);
i.putExtra("classFrom", FirstActivity.class.toString());
startActivity(i);

在被调用的活动(SecondActivity)的onCreate中添加以下代码:

Bundle bundle = getIntent().getExtras();

if (bundle.getString("classFrom").equals(FirstActivity.class.toString())) {
     //Do some task
}

请注意,在执行“b.getString(“classFrom”)”时,应小心,因为bundle对象不能为空。

2
您可以传递一个额外的参数,指定调用的Activity

0

我正在使用这行代码

    if (((((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE)).getRunningTasks(1).get(0).baseActivity)).compareTo(new ComponentName(getPackageName()
                    , AnyActivityWantToCheck.class.getName())) == 0){
// do somthing .....
    }

希望它能与你一起工作


注意:此方法仅用于调试和展示任务管理用户界面,并已被弃用。 - user1506104

0

将任何东西(字符串/整数等)传递给putExtra,然后根据它来完成你的工作,例如:

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
     intent.putExtra("PARENT_ACTIVITY_REF", "ParentActivityIsA");
     startActivity(intent);

然后以子类的形式接收

String parentActivityRef = intent.getStringExtra("PARENT_ACTIVITY_REF");

然后

if (parentActivityRef.equals("ParentActivityIsA"){
              // do your work here
}else if ...{
             // ...
}else{
     //...
}

0

另一种解决方案是使用伴生对象,如下例所示:

class MainActivity: BaseActivity {
    ...
    LoginActivity.callerActivity = this
    it.context.startActivity(Intent(getActivity(), LoginActivity::class.java))
    ...
}

class LoginActivity : BaseActivity() {
    companion object {
        var callerActivity: AppCompatActivity? = null
    }

    ...

    callerActivity?.let {
        it.callSomething()
    }
}

0

我成功地使用:(Activity).getLocalClassName()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接