如何知道Android中的呼叫活动

sigwle7e  于 2023-04-18  发布在  Android
关注(0)|答案(8)|浏览(122)

我有一个Activity,它被其他几个Activity调用。例如,我有Activity1、Activity2和Activity3。Activity1调用Activity2并传递参数。Activity3也调用Activity2并传递参数。
现在,基于调用Activity,Activity2执行一些任务。我如何知道哪个Activity正在调用Activity2?

balp4ylt

balp4ylt1#

如果您以startActivityForResult(Intent, int)启动Activity,则可以通过getCallingActivity().getClassName()获取调用Activity。

h5qlskok

h5qlskok2#

A.如果可以使用startActivityForResult

根据以下Zain Ali's answer:如果你可以用startActivityForResult()启动Activity,那么你可以通过这个.getCallingActivity().getClassName();

B.如果不能使用startActivityForResult

如果不能使用startActivityForResult(),则可以使用以下方法:您可以在Intent中传递其他参数,检查Activity中的值并相应地执行操作。
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)调用Activity 2时在Intent中添加额外参数。

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)在练习2中检查此额外参数的值,并采取相应的操作。

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;
        }
pkwftd7m

pkwftd7m3#

在呼叫活动(FirstActivity)中:

Intent i = new Intent(FirstActivity.this, SecondActivity.class);
i.putExtra("classFrom", FirstActivity.class.toString());
startActivity(i);

然后在被调用的activity(SecondActivity)的onCreate中添加以下代码:

Bundle bundle = getIntent().getExtras();

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

请注意,您应该小心,因为当您执行“b.getString(“classFrom”)"时,bundle对象不能为null。

fslejnso

fslejnso4#

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

imzjd6km

imzjd6km5#

我成功用途:(Activity).getLocalClassName()

2j4z5cfb

2j4z5cfb6#

传递任何东西(String/ int等)到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{
     //...
}
5m1hhzi4

5m1hhzi47#

我用这条线

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

我希望它能和你一起工作

5lwkijsr

5lwkijsr8#

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

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()
    }
}

相关问题