android基础学习-android篇day17-Activity之间数据传递方式

转:https://blog.csdn.net/qq_35521087/article/details/51922523

转:https://blog.csdn.net/lplj717/article/details/51209658

Activity之间数据传递方式

 1)单向传值:A传值给B,但不需要B返回数据

A: //传入数据给B

Intent i = new Intent(A.this,B.class);

i.putExtra("A_B","给B的数据"); 

startActivity(i); 

B: //拿到A传入的数据

String date= getIntent().getStringExtra("A_B");

 2)双向传值:A传值给B,并且需要B返回数据给A 

A: //传入数据给B

Intent i = new Intent(A.this,B.class); 

i.putExtra("A_B","给B的数据");

startActivityForResult(i, 0x123); 

//接收B返回的数据,重写onActivityResult方法

@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { 

super.onActivityResult(requestCode, resultCode, data);

//判断返回的code是否是B页面的code

if(resultCode==0x123){ //拿到B传回的数据 

String date = intent.getStringExtra("B_A"); }    } 

B: //接收A传入的数据

String date= getIntent().getStringExtra("A_B"); 

//返回数据给A,在末尾一定要将当前页面finisn()

Intent intent = new Intent(); 

intent.putExtra("B_A","返回给A的数据"); 

setResult(0x123,intent); 

onBackPressed(); 

finish();

B-C,A-C之间的数据单向或者双向传递都跟A-B之间数据传递的方法一样,这里就不重复写了,有兴趣的同学可以把代码写一遍跑一下,下面说说C跳过B直接传递值给A怎么做。

A->B->C,C->A

在实际应用开发中有很多情况是A->B->C,然后在C中做了某些操作,需要把一些值直接跳过B直接传递给A,其实这种传值方式同样有很多种,比如发个特定的广播,循环退出已经存在的页面等等,其实方法有很多种,下面我还是以Intent传值为例

C:  

Intent i = new Intent(C.this, A.class); 

 i.putExtra("C_A", "C传回给A的数据"); 

 //要启动的activity已经在当前的任务中,那么在该activity之上的activity都会关闭,并且intent会传递给在栈顶的activity

//如果 Activity 已经是运行在 Task 的 top,则该 Activity 将不会再被启动 

 i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);  

startActivity(i); 

A: 此时需要在A中重写onNewIntent方法,在该方法中获取从C中传递的值    

@Override   protected void onNewIntent(Intent intent) {      

  super.onNewIntent(intent);   //从C返回的数据 

 String date = intent.getStringExtra("C_A");     }

Intent四种数据传递方式(单向)

  • 方式1:直接Intent的传输数据
  • 方式2:创建bundle对象利用intent传输
  • 方式3:传输对象数据
  • 方式4:使用parcelable传递对象

MainActivity中传值操作

public class MainActivity extends AppCompatActivity {
 
    /**
     * 当一个Activity创建时会调用该方法,通过我们可以在该方法中进行组件的初始化工作
     * @param savedInstanceState
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        System.out.println("MainActivity-onCreate");
    }
 
    /**
     * 在Activity可见,但还不能进行交互时会调用该方法
     * 在onCreate之后调用
     */
    @Override
    protected void onStart() {
        super.onStart();
        System.out.println("MainActivity-onStart");
    }
 
    /**
     * 当Activity可以交互时调用
     * 在onStart之后调用,该方法被调用后就表示Activity进入了激活状态
     * resumed状态
     */
    @Override
    protected void onResume() {
        super.onResume();
        System.out.println("MainActivity-onResume");
    }
 
    /**
     * 一个从stoped状态的Activity重新被激活时调用
     * 接着会调用onStart()方法
     */
    @Override
    protected void onRestart() {
        super.onRestart();
        System.out.println("MainActivity-onRestart");
    }
 
    /**
     * 当前Activity被另一个Activity覆盖,失去焦点,但还可见,不能交互
     * 那么此时当前Activity进入了paused状态(暂停状态)
     * 当此状态下Activity重新获取焦点时会再调用onResume()方法
     */
    @Override
    protected void onPause() {
        super.onPause();
        System.out.println("MainActivity-onPause");
    }
 
 
 
    /**
     * 当前Activity被另一个Activity完全覆盖,不可见且不可交互
     * 那么此时当前Activity进入了stoped状态(停止状态)
     * 此状态下的Activity被重新显示时,会调用OnRestart()方法
     */
    @Override
    protected void onStop() {
        super.onStop();
        System.out.println("MainActivity-onStop");
    }
 
    /**
     * 当前Activity被销毁时调用,表示结束生命周期
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        System.out.println("MainActivity-onDestroy");
    }
 
   
    public void activityClick(View v){
        //打开另一个Activity,一个Intent对象代表一个意图
        Intent intent = new Intent(this,Main2Activity.class);
        //给Activity传值方式一:创建一个Bundle对象封装数据
        Bundle data = new Bundle();
        data.putInt("id",1);
        data.putString("name","宏才");
        data.putFloat("age",20.5f);
        intent.putExtra("data",data);
        //给Activity传值方式二:使用Intent准备的Bundle对象
//        intent.putExtra("id",1);
//        intent.putExtra("name","大雷");
//        intent.putExtra("age",18.5f);
        startActivity(intent);//启动Activity
    }
	
	
	  /**
     * 方式三:传递对象数据
     * @param view
     */
    public void sendObjectClick(View view){
        Intent intent = new Intent(this,Main2Activity.class);
        User user = new User();
        user.setId(1);
        user.setName("宏才");
        user.setSex("男");
        intent.putExtra("user",user);//user对象必须实现序列化接口
        startActivity(intent);
    }
	
	 /**
     * 方式四:使用parcelable传递对象
     * @param view
     */
    public void parcelableClick(View view){
        Dog dog = new Dog();
    dog.setName("tom");
    dog.setSex("公");
    dog.setAge(5);
    Intent intent = new Intent(this,Main2Activity.class);
    intent.putExtra("dog",dog);
    startActivity(intent);
   }
}

Main2Activity 接收数据的对应操作

public class Main2Activity extends AppCompatActivity {
    private TextView textView2_data,textView2_user,textView2_parcelable_dog;
     /**
     * 当一个Activity创建时会调用该方法,通过我们可以在该方法中进行组件的初始化工作
     * @param savedInstanceState
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        System.out.println("Main2Activity-onCreate");
 
        textView2_data = (TextView) findViewById(R.id.textView2_data);
        textView2_user = (TextView) findViewById(R.id.textView2_user);
        textView2_parcelable_dog = (TextView) findViewById(R.id.textView2_parcelable_dog);
 
        Intent intent = getIntent();
        System.out.println("2-"+intent);
        //方式一取值
//        Bundle data = intent.getBundleExtra("data");
//        int id = data.getInt("id");
//        String name = data.getString("name");
//        float age = data.getFloat("age");
 
        //方式二取值
//        int id = intent.getIntExtra("id",0);
//        String name = intent.getStringExtra("name");
//        float age = intent.getFloatExtra("age", 18f);
//
//        textView2_data.setText("id="+id+",name="+name+",age="+age);
 
        //方式三取值
//        User user = (User) intent.getSerializableExtra("user");
//        textView2_user.setText(user.toString());
 
        //方式四取值
        Dog dog = intent.getParcelableExtra("dog");
        textView2_parcelable_dog.setText(dog.toString());
    }
 
    /**
     * 在Activity可见,但还不能进行交互时会调用该方法
     * 在onCreate之后调用
     */
    @Override
    protected void onStart() {
        super.onStart();
        System.out.println("Main2Activity-onStart");
    }
 
    /**
     * 当Activity可以交互时调用
     * 在onStart之后调用,该方法被调用后就表示Activity进入了激活状态
     * resumed状态
     */
    @Override
    protected void onResume() {
        super.onResume();
        System.out.println("Main2Activity-onResume");
    }
 
    /**
     * 一个从stopped状态的Activity重新被激活时调用
     * 接着会调用onStart()方法
     */
    @Override
    protected void onRestart() {
        super.onRestart();
        System.out.println("Main2Activity-onRestart");
    }
 
    /**
     * 当前Activity被另一个Activity覆盖,失去焦点,但还可见,不能交互
     * 那么此时当前Activity进入了paused状态(暂停状态)
     * 当此状态下Activity重新获取焦点时会再调用onResume()方法
     */
    @Override
    protected void onPause() {
        super.onPause();
        System.out.println("Main2Activity-onPause");
    }
 
 
 
    /**
     * 当前Activity被另一个Activity完全覆盖,不可见且不可交互
     * 那么此时当前Activity进入了stopped状态(停止状态)
     * 此状态下的Activity被重新显示时,会调用OnRestart()方法
     */
    @Override
    protected void onStop() {
        super.onStop();
        System.out.println("Main2Activity-onStop");
    }
 
    /**
     * 当前Activity被销毁时调用,表示结束生命周期
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        System.out.println("Main2Activity-onDestroy");
    }
 
    public void openActivity(View v){
        //打开另一个Activity,一个Intent对象代表一个意图
        Intent intent = new Intent(this,MainActivity.class);
        startActivity(intent);//启动Activity
    }
}

Parcelable传值时 对象的准备:

public class Dog implements Parcelable{
    private String name;
    private String sex;
    private int age;
 
    //对象的创建器(我们目的是要从包裹里把数据取出来,并封装成对象(Dog))
    public static final Parcelable.Creator<Dog> CREATOR = new Parcelable.Creator<Dog>(){
        //从包裹里把数据取出来
        @Override
        public Dog createFromParcel(Parcel source) {
            System.out.println("createFromParcel");
            Dog dog = new Dog();
            dog.setName(source.readString());
            dog.setSex(source.readString());
            dog.setAge(source.readInt());
            return dog;
        }
        @Override
        public Dog[] newArray(int size) {
            return new Dog[size];
        }
    };
 
 
    <h2><pre name="code" class="java"> <span style="font-size:18px;">/**
     * 内容的描述标记(通常使用默认实现)
     * @return
     */
    @Override
    public int describeContents() {
        return 0;
    }
 
    /**
     * 打包,把数据写入包裹对象
     * @param dest
     * @param flags
     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(sex);
        dest.writeInt(age);
    }</span>
 
public String getName() { 
    return name; } 
public void setName(String name) { 
    this.name = name; } 
public String getSex() { 
    return sex; } 
public void setSex(String sex) {
    this.sex = sex; } 
public int getAge() { 
    return age; }
 public void setAge(int age) { 
    this.age = age; } 
@Override
 public String toString() { 
 return "Dog{" + "name='" + name + '\'' + ", sex='" + sex + '\'' + ", age=" + age + '}'; }
 } 
 


​

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值