我有两个活动:主活动和儿童活动。 当我按下主活动中的按钮时,子活动就启动了。
现在我想把一些数据发送回主屏幕。我使用了Bundle类,但它不起作用。它会抛出一些运行时异常。
有什么解决办法吗?
我有两个活动:主活动和儿童活动。 当我按下主活动中的按钮时,子活动就启动了。
现在我想把一些数据发送回主屏幕。我使用了Bundle类,但它不起作用。它会抛出一些运行时异常。
有什么解决办法吗?
当前回答
所有这些答案都是在解释你发送数据后需要完成的第二个活动的场景。
但如果你不想完成第二个活动,想把数据发送回第一个活动,你可以使用BroadCastReceiver。
〇第二次活动
Intent intent = new Intent("data");
intent.putExtra("some_data", true);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
〇第一次活动
private BroadcastReceiver tempReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// do some action
}
};
在onCreate()-中注册接收者
LocalBroadcastManager.getInstance(this).registerReceiver(tempReceiver,new IntentFilter("data"));
在onDestroy()中取消注册
其他回答
使用sharedPreferences并保存数据并从应用程序中的任何地方访问它
像这样保存日期
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);
使用startActivityForResult()方法调用子活动Intent
这里有一个例子: http://developer.android.com/training/notepad/notepad-ex2.html
在“从屏幕返回结果”中: http://developer.android.com/guide/faq/commontasks.html#opennewscreen
我已经创建了简单的演示类,以供您更好的参考。
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();
}
});
}
}
有一些方法可以做到。 1. 使用startActivityForResult(),这在上面的答案中有很好的解释。
通过在你的“Utils”类或你自己的任何其他类中创建静态变量。例如,我想将studententid从ActivityB传递到ActivityA。首先,我的ActivityA调用ActivityB。然后在ActivityB中设置studententid(这是Utils.class中的一个静态字段)。 Utils.STUDENT_ID="1234";然后当回到ActivityA时,使用存储在Utils.STUDENT_ID中的studententid。 通过在应用程序类中创建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后,获取数据。
2021年3月更新
在Activity v1.2.0和Fragment v1.3.0中,引入了新的活动结果api。
Activity Result api提供了用于注册结果、启动结果以及在系统分派结果后处理结果的组件。
因此不再需要使用startActivityForResult和onActivityResult。
为了使用新的API,你需要在你的源Activity中创建一个ActivityResultLauncher,指定当目标Activity完成并返回所需数据时将运行的回调:
private val intentLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
result.data?.getStringExtra("key1")
result.data?.getStringExtra("key2")
result.data?.getStringExtra("key3")
}
}
然后,在你需要的时候启动你的intent:
intentLauncher.launch(Intent(this, YourActivity::class.java))
为了从目标Activity中返回数据,你只需要添加一个返回setResult()方法的值的意图:
val data = Intent()
data.putExtra("key1", "value1")
data.putExtra("key2", "value2")
data.putExtra("key3", "value3")
setResult(Activity.RESULT_OK, data)
finish()
如需更多信息,请参考Android文档