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的回传值

  在一些情况下,我们通过 A activity跳转到 B activity上,这时希望 A activtiy能从 B activity上得到一些返回值,这个时候我们就不能使用startActivity方法了,而是使用 startActivityForResult方法来完成我们的操作。这样的场景在实际开发中还是很常见的,比如说A activity中做了一个查询的功能,查询向后台请求数据假设需要传入一个时间字段,不传的话默认是当前时间,B activity中可以设置时间,那我们就可以在根据B activity 传回来的时间,在A activity 中就会有不同的查询结果。
下面我们来模拟完成下提的需求:
MainActivity:
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中从本地取。

这种方式涉及到数据存储,Android数据的四种持久化存储方式SharedPreferences、SQLite、Content Provider和File,该方式的缺点就是要占用本地的资源,优点是数据可以在多个Activity之间共享。关于这种Activity之间的传值以后会专门写一篇博客介绍,这里先谈下Activity之间传值的几种方式的主线。这里推荐一篇博客,可以大概了解下Android的几种数据存储方式点击打开链接

四、使用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中方法。这个过程是不是有点复杂呢? 如果你也这么觉得,那也就是你继续看下去的理由了。

posted @ 2018-04-16 13:50  Kliver  阅读(282)  评论(0编辑  收藏  举报