将数据发送回Android中的主要活动

我有两个活动:主要活动和儿童活动。
当我在主要活动中按下button时,子活动就会启动。

现在我想发送一些数据回主屏幕。 我使用Bundle类,但它不工作。 它引发了一些运行时exception。

有没有解决scheme?

根据具体情况,有几种方法可以实现您想要的function。

最常见的情况(就是你的听起来像)是当一个孩子活动被用来获取用户input – 例如从列表中select一个联系人或在对话框中input数据。 在这种情况下,您应该使用startActivityForResult来启动您的子Activity。

这提供了一个使用setResult将数据发送回主Activity的pipe道。 setResult方法接受一个int结果值和一个传回给调用Activity的Intent。

 Intent resultIntent = new Intent(); // TODO Add extras or a data URI to this intent as appropriate. resultIntent.putExtra("some_key", "String data"); setResult(Activity.RESULT_OK, resultIntent); finish(); 

在调用Activity中覆盖onActivityResult来访问返回的数据。 requestCode对应于在startActivityForResult调用中传入的整数,而resultCode和数据Intent则是从子Activity返回的。

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch(requestCode) { case (MY_CHILD_ACTIVITY) : { if (resultCode == Activity.RESULT_OK) { // TODO Extract the data returned from the child Activity. String returnValue = data.getStringExtra("some_key"); } break; } } } 

活动1使用startActivityForResult :

 startActivityForResult(ActivityTwo, ActivityTwoRequestCode) 

活动2启动,你可以执行操作,closures活动做到这一点:

 Intent output = new Intent(); output.putExtra(ActivityOne.Number1Code, num1); output.putExtra(ActivityOne.Number2Code, num2); setResult(RESULT_OK, output); finish(); 

活动1 – 从上一个活动返回将调用onActivityResult :

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == ActivityTwoRequestCode && resultCode == RESULT_OK && data != null) { num1 = data.getIntExtra(Number1Code); num2 = data.getIntExtra(Number2Code); } } 

更新:答复Seenu69的评论,在活动二,

 int result = Integer.parse(EditText1.getText().toString()) + Integer.parse(EditText2.getText().toString()); output.putExtra(ActivityOne.KEY_RESULT, result); 

然后在活动一中,

 int result = data.getExtra(KEY_RESULT); 

发送数据

这有助于我在上下文中看到事物。 这是一个完整的发送数据的简单项目。 而不是提供XML布局文件,这里是一个图像。

在这里输入图像描述

主要活动

  • startActivityForResult启动第二个活动,提供一个任意的结果代码。
  • 覆盖onActivityResult 。 这在第二个活动结束时被调用。 您可以通过检查结果代码确保它实际上是第二个活动。 (当您从同一主要活动开始多个不同的活动时,这非常有用。)
  • 提取您从返回Intent获得的数据。 数据是使用键值对提取的。

MainActivity.java

 public class MainActivity extends AppCompatActivity { private static final int SECOND_ACTIVITY_RESULT_CODE = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // "Go to Second Activity" button click public void onButtonClick(View view) { // Start the SecondActivity Intent intent = new Intent(this, SecondActivity.class); startActivityForResult(intent, SECOND_ACTIVITY_RESULT_CODE); } // This method is called when the second activity finishes @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // check that it is the SecondActivity with an OK result if (requestCode == SECOND_ACTIVITY_RESULT_CODE) { if (resultCode == RESULT_OK) { // get String data from Intent String returnString = data.getStringExtra("keyName"); // set text view with string TextView textView = (TextView) findViewById(R.id.textView); textView.setText(returnString); } } } } 

第二个活动

  • 将您想要发送回前一个活动的数据放入一个Intent 。 数据使用键值对存储在Intent
  • 将结果设置为RESULT_OK并添加保存数据的意图。
  • 调用finish()closures第二个Activity。

SecondActivity.java

 public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); } // "Send text back" button click public void onButtonClick(View view) { // get the text from the EditText EditText editText = (EditText) findViewById(R.id.editText); String stringToPassBack = editText.getText().toString(); // put the String to pass back into an Intent and close this activity Intent intent = new Intent(); intent.putExtra("keyName", stringToPassBack); setResult(RESULT_OK, intent); finish(); } } 

其他说明

  • 如果你在一个片段,它不会知道RESULT_OK的含义。 只需使用全名: Activity.RESULT_OK

也可以看看

  • 富勒的答案包括向前传递数据
  • 密钥string的命名约定

使用startActivityForResult()方法调用来调用子活动Intent

这里有一个例子: http : //developer.android.com/training/notepad/notepad-ex2.html

并在“从屏幕返回结果”这个: http : //developer.android.com/guide/faq/commontasks.html#opennewscreen

在第一个活动中使用startActivityForResult:

 Intent intent=new Intent(MainActivity.this,SecondActivity.class); startActivityForResult(intent, int resultCode); //suppose resultCode == 2; // Call Back method to get the Message form other Activity @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode==2) { String message=data.getStringExtra("MESSAGE"); } } 

在SecondActivity上,对click事件或backPressed()调用setResult()

  Intent intent=new Intent(); intent.putExtra("MESSAGE",message); setResult(2,intent); 

我已经创build了简单的演示类,以供您更好的参考。

FirstActivity.java

  public class FirstActivity extends AppCompatActivity { private static final String TAG = FirstActivity.class.getSimpleName(); private static final int REQUEST_CODE = 101; private Button btnMoveToNextScreen; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnMoveToNextScreen = (Button) findViewById(R.id.btnMoveToNext); btnMoveToNextScreen.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class); startActivityForResult(mIntent, REQUEST_CODE); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(resultCode == RESULT_OK){ if(requestCode == REQUEST_CODE && data !=null) { String strMessage = data.getStringExtra("keyName"); Log.i(TAG, "onActivityResult: message >>" + strMessage); } } } } 

这里是SecondActivity.java,

 public class SecondActivity extends AppCompatActivity { private static final String TAG = SecondActivity.class.getSimpleName(); private Button btnMoveToPrevious; private EditText editText; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); editText = (EditText) findViewById(R.id.editText); btnMoveToPrevious = (Button) findViewById(R.id.btnMoveToPrevious); btnMoveToPrevious.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String message = editText.getEditableText().toString(); Intent mIntent = new Intent(); mIntent.putExtra("keyName", message); setResult(RESULT_OK, mIntent); finish(); } }); } } 

在第一个活动中,您可以使用startActivityForResultand()发送intent,然后在使用setResult完成后从secound活动中获取结果。

MainActivity.class

 public class MainActivity extends AppCompatActivity { private static final int SECOND_ACTIVITY_RESULT_CODE = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // "Go to Second Activity" button click public void onButtonClick(View view) { // Start the SecondActivity Intent intent = new Intent(this, SecondActivity.class); // send intent for result startActivityForResult(intent, SECOND_ACTIVITY_RESULT_CODE); } // This method is called when the second activity finishes @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // check that it is the SecondActivity with an OK result if (requestCode == SECOND_ACTIVITY_RESULT_CODE) { if (resultCode == RESULT_OK) { // get String data from Intent String returnString = data.getStringExtra("keyName"); // set text view with string TextView textView = (TextView) findViewById(R.id.textView); textView.setText(returnString); } } } } 

========= secound活动

 public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); } // "Send text back" button click public void onButtonClick(View view) { // get the text from the EditText EditText editText = (EditText) findViewById(R.id.editText); String stringToPassBack = editText.getText().toString(); // put the String to pass back into an Intent and close this activity Intent intent = new Intent(); intent.putExtra("keyName", stringToPassBack); setResult(RESULT_OK, intent); finish(); } } 

使用sharedPreferences并保存数据并从应用程序的任何位置访问它

保存这样的date

 SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString(key, value); editor.commit(); 

并接收这样的数据

 SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE); String savedPref = sharedPreferences.getString(key, ""); mOutputView.setText(savedPref); 

有一些方法可以做到这一点。 1.通过使用startActivityForResult()在上面的答案很好地解释。

  1. 通过在你的“Utils”类或你自己的任何其他类中创build静态variables。 例如,我想从ActivityB传递studentId到ActivityA.First我的ActivityA正在调用ActivityB。 然后在ActivityB里面设置studentId(这是Utils.class中的一个静态字段)。 像这样Utils.STUDENT_ID =“1234”; 然后在回到ActivityA时使用存储在Utils.STUDENT_ID中的studentId。

  2. 在应用程序类中创build一个getter和setter方法。

喜欢这个:

 public class MyApplication extends Application { private static MyApplication instance = null; private String studentId=""; public static MyApplication getInstance() { return instance; } @Override public void onCreate() { super.onCreate(); instance = this; } public void setStudentId(String studentID){ this.studentId=studentID; } public String getStudentId(){ return this.studentId; } } 

所以你完成了。 只需在ActivityB中设置数据,然后返回给ActivityA即可获取数据。