【问题标题】:How to pass a value to an activity from another WITHOUT starting it?如何将值传递给另一个活动而不启动它?
【发布时间】:2013-06-05 20:56:15
【问题描述】:

我想将一个值从活动 A 传递到活动 B,而不实际启动活动 B(因此这排除了使用 Intents 和 putExtra)。活动 B 可能会或可能不会启动,但当它启动时,它需要显示活动 A 传递给它的值。

我搜索了高低,但找不到任何相关解决方案来解决这个看似简单的问题。任何帮助将不胜感激!

【问题讨论】:

  • 如果 B 没有启动,那么需要额外的什么?
  • 我认为你应该使用 Application 类作为全局变量
  • 正如我在问题中提到的,活动 B 可能会或可能不会开始
  • 你总是可以创建一个单例并在那里缓存你的数据,但我不建议这样做,因为它会导致内存泄漏
  • @Garima 为此使用应用程序类.. 它非常有用..

标签: android android-intent parameter-passing


【解决方案1】:

我一直在寻找答案,但找不到。所以我找到了一种方法。

第一个活动

Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("Flag" , true);
startActivity(intent);

第二个活动

boolean flag;
flag = getIntent().getBooleanExtra("Flag" ,false);
    if(flag == true)
    {
        this.finish();
    }

所以现在你可以发送任何你想要的数据,它会打开第二个活动,然后在你甚至没有意识到它时立即关闭它。您可以使用共享偏好来保存您的数据以备后用。

【讨论】:

    【解决方案2】:

    使用全局类,例如:

    public class AppConfig {
    
        Context context;
        public AppConfig(Context mxt) {
    
            context = mxt;
        }
    
        public static String filepath = null;
    

    那么,在onCreate()之前的活动A

    AppConfig config;
    Context context;
    

    并在onCreate() 方法中输入:

    context = getApplicationContext();
    config = new AppConfig(context);
    

    并且,在onCreate() 之前的第二个Activity B

    AppConfig config;
    Context context;
    

    并且,在onCreate() 方法中输入:

    context = getApplicationContext();
    config = new AppConfig(context);
    

    然后设置你想要的值。希望这会对你有所帮助。

    【讨论】:

      【解决方案3】:

      将值设置为全局:

      公共类全球{

      public static int mValue;   
      
      
      public static int getValue() {
          return mValue;
      }
      
      public static void setValue(int mValue) {
          Global.mValue = mValue;
      }
      

      }

      【讨论】:

        【解决方案4】:

        所以你需要为一个活动保留一个值。如果它启动,则意味着您必须使用这些值,否则您将丢弃这些值。为此,您可以使用具有所需数据类型变量的单独类,并为此创建 getter setter 并使用它。

        利用类

        public class GetSet {
        
            public GetSet() {
                super();
            }
        
            private static boolean passwordSet = false;
        
            public static boolean isPasswordSet() {
                return passwordSet;
            }
        
            public static void setPasswordSet(boolean passwordSet) {
                GetSet.passwordSet = passwordSet;
            }
        }
        

        您可以使用GetSet.setPasswordSet(false); 访问 和Boolean flag = GetSet.isPasswordSet();

        【讨论】:

          【解决方案5】:

          您可以使用shared Preferences。使用这个Activity可以给它设置Value,其他Activity可以从中读取。

          【讨论】:

          • 共享首选项不适合我的情况。谢谢。
          【解决方案6】:

          您找不到解决方案,因为它违反任何逻辑。 如果活动 B 未启动且可见,则无法执行任何操作。 Activity B 甚至可能已经在你不知情的情况下被系统销毁。

          您可以使用很多东西来设置一些变量,您的 Activity B 可以读取这些变量,例如在您的应用程序中、在您的 XML 中的某个位置或任何随机类中。

          不过,在您开始 Activity B 之前,您实际上无法DO 使用这些选项中的任何一个,如果可以的话,它实际上与给予相同Intent 中的额外数据。

          【讨论】:

          • @Garima:这是正确的,如果只有Activity A可以启动Activity B,我不明白你为什么不想使用Intents。
          • 让我这么说吧,您开始在线交易,在第一页它会询问您的姓名,然后交易会从一个页面转到另一个页面,询问其他详细信息(交易可能会终止由于某种原因中途),然后在交易结束时最后一页显示BYE 。现在我希望能够从第一页存储名称并将其传递到最后一页(以防控件到达那里)。 获取图片?
          • 您应该改为在 Fragments 中执行此操作,看看 Roman Nurik 的向导 UI:androidviews.net/2012/11/wizardpagerplus.google.com/+RomanNurik/posts/6cVymZvn3f4
          • @GarimaTiwari 我也不是 ;) 您在尚未开始的活动中没有使用变量。未启动的 Activity 无法执行任何逻辑。您的情况可以通过将用户输入保存在全局可访问的任何类中或通过使用 Intents 传递数据来简单地存档。正确的解决方案是使用 Fragments,这会导致只有 1 个 Activity 持有这些 Fragments 自动授予您一个“全局”位置来保存用户输入。祝你好运。
          • @Garima:我会创建一个实现 Parcelable 的类,将这个类称为实例 Person。然后你可以给它添加所有的属性,比如:名字,年龄等。然后你可以把它作为 Parcelable 的意图发送。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多