Activity间传值的方式
原文地址:https://blog.csdn.net/qq_33748378/article/details/53023036
Activity间的跳转:
要了解Activity间的传值,首先得知道actvivity是怎么跳转的。Activity间的跳转有隐式和显式两种方式,代码如下:
// 显式 Intent intent = new Intent(this,SecondActivity.class); /* Intent intent = new Intent(); intent.setClass(this,SecondActivity.class);*/ startActivity(intent); // startService(intent); 也可开启服务,intent中传入要启动的服务的类即可 // 隐式 Intent intent1 = new Intent(); intent1.setAction("配置文件配置的action"); startActivity(intent1);
其实关键就在与intent是指定class,还是action。
Activity间的传值:
一.传值一般是将数据放在Intent对象中。
// MainActivity String value = "values"; int number = 123; intent.putExtra("name",value); intent.putExtra("password",number) // SecondActivity this.getIntent().getStringExtra("name"); this.getIntent().getIntExtra("password",0);
也可以先把值放在bundle对象中,再将bundle放入intent中。
Bundle bundle = new Bundle(); bundle.putString("name",value); bundle.putInt("password",number); intent.putExtra("bundle",bundle); this.getIntent().getBundleExtra("bundle");
以上是传递一些基本的类型,但如果要传递我们定义的一些引用类型,该类型需要先implements Parcelable,或者implements Serializable。具体的说明可以参考这里:intent传递数据类型
二、通过startActivityForResult方法来得到Activity的回传值
package com.example.activitytest; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button button; private TextView textView; private int REQUEST_GET_TIME=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button= (Button) findViewById(R.id.btn_click); textView= (TextView) findViewById(R.id.tv_time); button.setOnClickListener(this); } @Override public void onClick(View view) { // Intent intent=new Intent(); // intent.setClass(MainActivity.this,SecondActivity.class); // startActivity(intent); Intent intent=new Intent(this,SecondActivity.class); //第一个参数是Intent对象,第二个requestCode指定我们的一个启动标志值,因为我们可能有多个按钮,如果都是跳转到同一个Activity对象上, //我们需要对其进行标志,才知道是哪个Activity对象跳转过来的。 startActivityForResult(intent,REQUEST_GET_TIME); } /** * 所有的Activity对象的返回值都是由这个方法来接收 * requestCode If >= 0, this code will be returned in onActivityResult() when the activity exits. * @param requestCode 表示的是启动一个Activity时传过去的requestCode值 * @param resultCode 表示的是启动后的Activity回传值时的resultCode值 * @param data 表示的是启动后的Activity回传过来的Intent对象 */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode==REQUEST_GET_TIME&&resultCode==RESULT_OK){ textView.setText(data.getStringExtra("cur_time")); } } }
SecondActivity:
package com.example.activitytest; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; import java.text.SimpleDateFormat; import java.util.Date; public class SecondActivity extends AppCompatActivity { private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); textView= (TextView) findViewById(R.id.tv_cur_time); String curTime=getCurTime(); textView.setText(curTime); Intent intent=new Intent(); intent.putExtra("cur_time",curTime); setResult(RESULT_OK,intent); this.finish(); } private String getCurTime() { long currentTimeMillis = System.currentTimeMillis(); SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy年MM月dd日 HH:mm"); return simpleDateFormat.format(new Date(currentTimeMillis)); } }
三、先把数据存在本地,然后在下一个Activity中从本地取。
四、使用EventBus框架
越来越多的项目开发中使用到EventBus这个框架,那什么是EventBus呢?用github开源文档上的介绍就是:一个Android平台的事件总线框架, 它简化了Activity、Fragment、Service等组件之间的交互,很大程度上降低了它们之间的耦合,使得我们的代码更加简洁,耦合性更低,提升我们的代码质量。
开发中我们都知道,很多时候要在Activty与Activty间,Activty与Fragment等之间传递数据进行交互,操作起来很不方便,我们以前可能会用到接口回调,或是用观察者模式来实现,或是发广播等等。这们操作不仅仅代码量大,而且代码耦合性高,性能不佳,也不便于维护。例如:两个Fragment之间的通信你会怎么实现? 按照Android官方给的建议的解决方法如下: Communicating with the Activity,思路就是Activity实现某个接口,然后在Fragment-A关联上Activity之后将Activity强转为接口类型,然后在某个时刻Fragment中回调这个接口,然后再从Activity中调用Fragment-B中方法。这个过程是不是有点复杂呢? 如果你也这么觉得,那也就是你继续看下去的理由了。