2012-07-07 51 views
1

我是黑莓手机的新手。如何实现(黑莓)一样,可以在下一收到Android的黑莓手机 - 如何在Android中传递Intent.putExtra()等数据

intent.putExtra("key","value"); 

把值的黑莓推屏幕

Android中

ActivityOne -

Intent intent = new Intent(this, ActivityTwo.class); 
intent.putExtra("Value1", "This value one for ActivityTwo "); 
intent.putExtra("Value2", "This value two ActivityTwo"); 
startActivity(intent); 

ActivityTwo -

Bundle extras = getIntent().getExtras(); 
if (extras == null) { 
    return; 
} 
// Get data via the key 
String value1 = extras.getString(Intent.EXTRA_TEXT); 
if (value1 != null) { 
    // Do something with the data 
} 

是黑莓可能这样的事情?如果是的话,我该怎么做?

回答

3

使用public static变量(如Ganesh的答案)会的工作,但在一般情况下,这并不是说我会建议一个面向对象的模式。

幸运的是,这个可以比黑莓更容易在Android中。对于许多Java开发人员来说,Android的Intent机制实际上有些不自然。当其中一个Activity通过Intent启动另一个Activity时,它实际上并不是new(创建)第二个Activity的实例,它也不包含对该对象的正常Java引用。如果是这样,这个问题会简单得多。 Android的实施迫使你使用意图额外的机制。

如果你的旧ActivityOne类成为ScreenOne黑莓,和ActivityTwo成为ScreenTwo,那么你可以做这样的事情:

public class ScreenTwo extends Screen { 
    private String _value1; // this doesn't have to be a String ... it's whatever you want 
    private String _value2; 

    public void setValue1(String value) { 
     _value1 = value; 
    } 
    public void setValue2(String value) { 
     _value2 = value; 
    } 
} 

然后,在ScreenOne,你就可以开始ScreenTwo这样

ScreenTwo nextScreen = new ScreenTwo(); 
nextScreen.setValue1("This value one for ActivityTwo"); 
nextScreen.setValue2("This value two ActivityTwo"); 
UiApplication.getUiApplication().pushScreen(nextScreen); 

这实际上更符合Java对象通常使用的方式, nd彼此互动。

有很好的理由,为什么Android的Intents临时演员,但在黑莓,你不必担心。


编辑:我想考虑一下我认为背后低于史密斯先生的评论的动机。如果你实际上喜欢Android Intent extras机制,就可以将多个数据类型从一个Activity传递给另一个,作为键值对,那么你肯定可以在BlackBerry中实现类似的功能。而不是上面的代码ScreenTwo,你可以这样做:

public class ScreenTwo extends Screen { 
    private Hashtable _extras; 

    public void putExtras(Hashtable extras) { 
     _extras = extras; 
    } 
} 

在那里你put(Object, Object)键值对数据在传递到所谓的屏幕Hashtable,然后读取它,当你需要它。甚至:

public class ScreenTwo extends Screen { 
    private Hashtable _extras; 

    public void putExtra(String name, Object value) { 
     _extras.put(name, value); 
    } 
} 
+0

“这不一定是一个字符串...”:此评论显示了如何将呼叫屏幕耦合到更新的屏幕。如果您决定更改'_value1'类,则还需要更改setter方法。另一方面,它是类型安全的。 – 2012-07-09 07:44:29

+0

@MisterSmith,当然,如果底层数据类型发生变化,您需要更改setter方法。几乎任何类别的几乎任何财产都是如此。很少的API使用传递'Object'作为它们的数据类型。在某些情况下,这是有保证的,但这是例外,而不是规则。在Android中,调用'Activity'仍然*耦合到被调用的'Activity',因为它知道它传递的数据类型。我不确定你的评论是在这里... – Nate 2012-07-09 08:27:40

+0

@MisterSmith,我还会跟进Android意见**。我不认为现有的实现是由于希望从调用者*分离*所谓的“活动”类驱动的。调用者仍然需要传递正确数据类型的附加内容,并且键名仍需要由两个活动达成一致。很多时候,这些键名称实际上是作为被称为“Activity”子类中的“String”常量实现的(不是最松散的耦合形式)。我认为更大的动机是'意图'允许操作系统管理活动生命周期。 – Nate 2012-07-09 08:44:03

0

创建一个公共类,

public class Values 
{ 
    public static String value1 =""; 
    public static String value2 =""; 
} 

现在ü可以访问值1,和值2中的任何位置。

在推下一个屏幕之前,分配值。

public class MyClass extends UiApplication 
{ 


    MyClass mc = null; 
    public static void main(String args[]) 
    { 
     mc = new MyClass(); 
     if (MyClass != null) 
     { 
      mc.enterEventDispatcher(); 
     } 
    } 

    public MyClass() 
    { 
       Values.value1 ="HI" 
       Values.value2 ="Welcome" 
    this.pushScreen(new SplashScreen()); 
    } 

在另一个班级你可以访问它。

public class Splashscreen() 
{ 
    public Splasscreen() 
{ 
     if(!Values.Value1.equalIgnoreCase("") 
{ 
      Syso(""+Values.value1) ; 
} 
} 
+0

这将完成这项工作,但不推荐使用全局数据。也很容易出现内存泄漏,因为引用是在整个应用程序生命周期中进行的。 – 2012-07-09 07:46:45

1

这是值得一次设计的东西,因为你会在大多数项目中使用它。

首先,无有作为Android在BB没有内置的机制,这样,但你可以(也应该)代码自己:

public class MyScreen extends MainScreen { 

     public void updateParams(Hashtable params){ 
      // Read from hashtable and cast 
      // Update fields (on Ui thread) 
     } 

    } 

正如你所看到的,我已经使用了哈希表因为这是最灵活的方式。你可以使用setter,但是你可以将呼叫屏幕连接到更新的屏幕类。这允许您传递一个或多个参数。你可以使用一个Object[],因此保存了一些引用,但是这种优化几乎没有什么意义,你可以将它们与数组的长度以及数组内的对象顺序耦合。现在,两个参数传递到屏幕上,你会怎么做:

Hashtable ht = new Hashtable(); 
    ht.put("somestring", "Hello!"); 
    ht.put("someint", new Integer(3)); 

    MainScreen ms = new MyScreen(); 
    targetscreen.updateParams(ht); 
    // Now push screen 

你也可以创建这样一个构造函数:

Myscreen(Hashtable params) 

但是,这迫使你每次需要时创建新的实例用新数据更新屏幕。使用该方法,您可以更新已经在堆栈上的屏幕。

这是一种可以在许多项目中重复使用的方法。实际上,大多数情况下,您最终都会为MainScreen创建子类,以抽象和简化重复性任务,如创建菜单和处理按键,所以这将成为该子类的一部分。

+0

我的歉意。我发布我的更新时没有看到您的答案。很显然,如果你想创建一个通用接口,我同意这个实现。 +1! – Nate 2012-07-09 08:54:38

+0

感谢@MisterSmith为您提供宝贵的解决方案和意见,它真的帮助我。 – 2012-07-27 08:38:40