如何从Android中的多个活动接收数据?意外停止

时间:2012-10-10 12:03:12

标签: android

我正在开发一个Android应用程序样本,其中包含三个名为Stationary,Books和Pens的活动。我想将书籍和钢笔活动的数据发送到固定活动。在固定活动中,当我从一个活动中收到书籍或笔中的数据时它工作正常,但是当我从这两个活动中收到数据时我的应用程序“意外停止”

我已经在这方面开发了一些代码,你可以在下面查看。

在我的图书活动中使用以下代码。

    // in Book Activity
public boolean onKeyDown(int keyCode, KeyEvent event) 
     {
         if ((keyCode == KeyEvent.KEYCODE_BACK))
         {  



                if(myBookSelected)
                {   
                Intent intent = new Intent(Books.this,Stationary.class);
                intent.putExtra("bookSelected", books.toString());
                startActivity(intent);
                }

                else
                {
                    Toast.makeText(getApplicationContext(), "Please select books", Toast.LENGTH_LONG).show();
                }

          }

         return true;
     }

并在我的钢笔活动中使用流动的代码。

// in Pen Activity
public boolean onKeyDown(int keyCode, KeyEvent event) 
     {
         if ((keyCode == KeyEvent.KEYCODE_BACK))
         {  



                if(myPenSelected)
                {   
                Intent intent = new Intent(Pens.this,Stationary.class);
                intent.putExtra("penSelected", pens.toString());
                startActivity(intent);
                }

                else
                {
                    Toast.makeText(getApplicationContext(), "Please select Pens", Toast.LENGTH_LONG).show();
                }

          }

         return true;
     }

从上述两个活动书籍和笔中接收固定活动中的数据。我使用以下代码。

// in Stationary Activity
Bundle extras = getIntent().getExtras();


            if (extras != null)
            {   
                numberOfBooks = extras.getString("bookSelected");
                numberOfPens = extras.getString("penSelected");
            }

注意:当我从一个活动收到书籍或笔的数据时它工作正常,但是当我从这两个活动收到数据时我的应用程序“意外停止”

3 个答案:

答案 0 :(得分:1)

因为当您尝试从BookActivity传递Intent时,“penSelected”将为null,而在另一种情况下,“bookSelected”将为null。所以很明显你会在这里遇到NullPointerException。

一个简单讨厌的解决方案是将它们包含在单独的try catch块中。或者您可能必须发送另一个数据来识别您正在传递的活动,并且基于该活动仅获取必填字段。

比如说,你来自PenActivty,那么你只能得到“penSelected”并离开另一个,反之亦然。

所以你必须在这里理解的是,在任何情况下你的对象“extras”都不会为null,但只有上述任何一个键都是null。所以你不能在那里检查是否为空。

修改

毕竟我认为这不是真的。您可以使用以下代码

检查Bundle Oject是否包含密钥
 if(getIntent().hasExtra("bookSelected"))
{
         // do your code.. 
}

答案 1 :(得分:0)

“每次新活动开始时,前一个活动都会停止,但系统会将活动保留在堆栈中(”后堆栈“)。” Activities

答案 2 :(得分:0)

我认为将您的选择保存在首选项文件中会更容易。通过这种方式,您无需担心发送数据,活动订单或活动顺序,甚至在手机重置后,您仍然可以保存数据。请参阅tutorial about saving data,但基本上是这样的:

...
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString(getString(R.string.pen_selected), penSelected);
editor.commit();
....

我认为您收到强制关闭的原因是因为您只能接收上一个活动的数据。如果您想要活动A将 a 发送到活动C,活动B将 b 发送到C,那么您应该:

Step1)从活动A发送 a 到活动B(并启动)

步骤2)从活动B发送 b a 到活动C(并启动)

希望有所帮助:)