Intent 的用法你已经比较熟悉了,我们可以借助它来启动活动,发送广播,启动服务等。在进行上诉操作的时候,我们还可以在Intent中添加一些附加数据,以达到传值的效果,比如在MainActivity中传值:
package com.example.parcelableapplication; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; public class MainActivity extends AppCompatActivity { private EditText edt; private Button btn ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); edt = findViewById(R.id.edt); btn = findViewById(R.id.btn); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String data = edt.getText().toString(); Intent intent = new Intent(MainActivity.this,SecondActivity.class); intent.putExtra("send_data",data); startActivity(intent); } }); } }
然后再在SecondActivity中取出来:
package com.example.parcelableapplication; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.widget.TextView; public class SecondActivity extends AppCompatActivity { private TextView txt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); txt = findViewById(R.id.txt); String data = getIntent().getStringExtra("send_data"); txt.setText(data); } }
但是不知道你有没有发现,putExtra()方法中所支持的数据类型是有限的,虽然常用的一些数据类型它都会支持。但是当你想去传递一些自定义对象的时候,就会发现无从下手。我们就学习一下使用Intent来传递对象的技巧。
Serializable方式
使用Intent来传递对象通常有两种实现方式: Serializable和Parcelable。
Serializable是序列化的意思,表示将一个对象转换成可存储可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。至于序列化的方法也很简单,只需要让一个类去实现Serializable这个接口就可以了。
比如说有一个Person类,其中包含了name 和 age这两个字段,想要将它序列化就可以这样写:
Person类:
package com.example.parcelableapplication; import java.io.Serializable; public class Person implements Serializable { private String name ; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
MainActivity的设置:
package com.example.parcelableapplication; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; public class MainActivity extends AppCompatActivity { private EditText edt,edt_age; private Button btn ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); edt = findViewById(R.id.edt); edt_age = findViewById(R.id.edt_age); btn = findViewById(R.id.btn); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String name = edt.getText().toString(); int age = Integer.parseInt(edt_age.getText().toString()); Person person = new Person(); person.setName(name); person.setAge(age); Intent intent = new Intent(MainActivity.this,SecondActivity.class); intent.putExtra("person_data",person); startActivity(intent); } }); } }
然后传值给SecondActivity,然后再取值出来:
package com.example.parcelableapplication; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.widget.TextView; public class SecondActivity extends AppCompatActivity { private TextView txt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); txt = findViewById(R.id.txt); Person person = (Person)getIntent().getSerializableExtra("person_data"); int age = person.getAge(); String name = person.getName(); if(age >= 18){ txt.setText("嗨,"+name+"你貌似有点老哦,"+age+"岁的臭老娘们了。"); }else{ txt.setText("嗨"+name+",你来得刚刚好!"+age+"的美丽少女"); } } }