【问题标题】:Android: Who start ActivityAndroid:谁启动 Activity
【发布时间】:2011-09-15 15:42:17
【问题描述】:

我有 3 个活动:活动 1、活动 2、活动 3。 Activity1和Activity3可以启动Activity2:

startActivity(new Intent(this,Activity2));

如何在 Activity2 中检查哪个类启动 Activity2 ?有没有办法从 Intent 获取信息?谢谢...

我不想在 Intent 中添加任何内容。我想我不需要那个。当我开始意图时,我已经说过我在什么上下文中这样做(新意图(*this*,Activity2))。我想在 Activity2 中识别这个“这个”!这可能吗?

【问题讨论】:

  • 是的,您确实想在Intent 中添加一些内容,因为无法访问另一侧提供的Context。此外,这是 Android 的做法,不要与之抗争 :)
  • 查看我的回答,了解为什么您的this 丢失了;评论太长了。

标签: android


【解决方案1】:

您可以在 Intent 的“额外”Bundle 中传递该信息:

Activity1:

Intent intent = new Intent(this, Activity2.class);
intent.putExtra("caller", "activity1");
startActivity(intent);

Activity2:

String caller = getIntent().getStringExtra("caller");

还有其他数据类型的 get/put 方法,例如 booleanint 等。


至于为什么在另一侧创建Intent时无法访问您提供的Context

Android 对提供的Context(即您的this)所做的唯一事情就是从中创建一个ComponentName。该类仅保留提供的Context,并丢弃其他任何内容。

所以理论上你可以将你的活动放入不同的包中,然后在接收端转到getIntent().getComponentName().getPackageName() ——但请不要这样做。 Intent extras 是要走的路。

【讨论】:

    【解决方案2】:

    发送:

    Intent intent = new Intent(this,Activity2)
    intent.putExtra("activityNumber", 1);
    startActivity(intent);
    

    接收:

    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        activitySource = extras.getInt("activityNumber");
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用Intents“Extras”在活动之间传递信息:

      Intent newIntent = new Intent(this, Activity2.class);
      newIntent.putExtra("CalledFrom", Activity1.class.getSimpleName())
      startActivity(newIntent);
      

      那么在接收Activity就可以调用:

      String fromActivity = getIntent().getStringExtra("CalledFrom");
      

      您可以传递基本类型以及实现Parcelable 接口的对象

      【讨论】:

        【解决方案4】:

        您可以通过在 Intent 中添加信息来做到这一点。

        例如:

        public Intent putExtra (name, value)
        

        然后您可以在新启动的服务中查找此信息。

        或者您可以像其他答案一样使用 addFlags 方法。

        【讨论】:

          【解决方案5】:

          在启动活动的意图中,您总是可以将标志标记为

          Intent i=new Intent();
          i.putExtra("startedBy","A1");
          //or 
          //i.putExtra("startedBy","A2");
          //...
          

          并且比在接收活动中使用 在 on activityresult 方法中

          Intent intent=getIntent();
          if(intent.getStringExtra("startedBy").equals("a1"){
          //do somth
          }
          

          【讨论】:

            【解决方案6】:

            使用Intent 数据成员将参数传递给您的活动。有一个 extras 数据成员,它是您想要的任何东西的 Bundle - 一个通用名称/值集合。

            Intent i = new Intent(this, Activity2);
            i.putExtra("From", "Activity1");
            startActivity(i);
            

            然后在 Activity2 中,您可以检查额外数据的起始意图并找出这一点。

            或者,您可以使用意图data,可通过setData() 设置。 Data 成员具有 URI 的格式,对传递结构化信息有些不友好。不过打字少了一点。

            【讨论】:

            • 您为什么要创建一个单独的包 bun 以将其设置到意图的现有 extra 包中?
            【解决方案7】:

            我找到了使用类的简单名称的解决方案,原因是ClassNotFoundExceptions。我使用的解决方案类似,但使用了规范名称:

            Intent newIntent = new Intent(this, Activity2.class);
            newIntent.putExtra("caller", Activity1.class.getCanonicalName())
            startActivity(newIntent);
            

            然后在其他活动中

            String caller = getIntent().getStringExtra("caller");
            Class callingClass = Class.forName(caller);
            

            【讨论】:

              猜你喜欢
              • 2013-06-15
              • 2018-01-13
              • 2016-07-05
              • 2013-04-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多