1. Revisão da atividade
Na análise da atividade dos quatro componentes principais do Android (on) , já falamos sobre o método de inicialização , ciclo de vida e modo de inicialização da atividade . Nesta seção, vamos falar sobre os dois pontos de conhecimento de passagem de parâmetros entre atividades e como iniciar atividades do sistema . A transferência de parâmetros entre atividades inclui o uso de Intent para transferir parâmetros , o uso de Bundle para transferir parâmetros e a transferência de dados complexos .
Dois, transferência de dados entre atividades
2.1, use o Intent para transferir dados
Usar Intent para transferir dados é principalmente para chamar o método Intent.putExtra (). Esse método tem dois parâmetros. O primeiro parâmetro é o nome e o segundo parâmetro é o valor. O tipo de valor é o seguinte:
O código específico para transferência de dados é o seguinte :
// 1、利用 Intent 传递数据
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("str", "Android 开发"); // 传递 String
intent.putExtra("flag", true);
startActivity(intent);
O código transmitido foi escrito, como recebê-lo? Podemos usar o método getIntent () para receber dados em SecondActivity, conforme mostrado abaixo:
TextView params = findViewById(R.id.tv_params);
// 接收数据
String str = getIntent().getStringExtra("str");
// 这里的 false 是默认值的意思,如果没有接收到 flag 的值就是 false
boolean flag = getIntent().getBooleanExtra("flag", false);
if (flag) {
params.setText(str);
} else {
params.setText("没有接受到数据");
}
Vejamos o efeito:
2.2. Use o pacote para transferir dados
Usar Bundle para transferir dados é principalmente usar Bundle para armazenar os dados a serem transferidos primeiro e, em seguida, transferir o conjunto de dados Bundle para a Atividade que precisa ser recebida. Vejamos o código transferido:
// 2、利用 Bundle 传递数据
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("str", "Android 开发");
bundle.putBoolean("flag", true);
intent.putExtra("myBundle", bundle);
startActivity(intent);
Receber o pacote também é muito simples, precisamos apenas chamar o método getIntent (). GetBundleExtra (). Vejamos o código:
Bundle bundle = getIntent().getBundleExtra("myBundle");
if (bundle != null) {
String str = bundle.getString("str");
boolean flag = bundle.getBoolean("flag");
if (flag) {
params.setText(str);
} else {
params.setText("没有接受到数据");
}
}
O efeito da passagem de dados de Bundle e de passagem de dados de Intent é exatamente o mesmo, mas a escrita é um pouco diferente.
2.3, a transferência de dados complexos entre atividades
Os dois métodos acima podem passar qualquer tipo básico de dados, mas se você quiser passar dados complexos (como um objeto), o que deve fazer? O Android nos fornece dois métodos para passar tipos complexos de dados:
2.3.1. Implementar a interface Serilziable para as classes que precisam ser aprovadas
Aqui criamos uma classe UserInfo para implementar a interface Serilziable, o código específico é o seguinte:
import java.io.Serializable;
public class UserInfo implements Serializable {
public String username;
public int age;
public int gender;
}
O código passado é o seguinte:
// 3、复杂类型的数据传递 实现 Serializable 接口
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
UserInfo userInfo = new UserInfo();
userInfo.username = "Bob";
userInfo.age = 25;
userInfo.gender = 1;
intent.putExtra("userInfo", userInfo);
startActivity(intent);
Para receber o objeto Serializable, precisamos chamar o método getIntent (). GetSerializableExtra (), vamos olhar o código:
UserInfo userInfo = (UserInfo) getIntent().getSerializableExtra("userInfo");
if (userInfo != null) {
String str = "名字:" + userInfo.username + " " + "年龄:" + userInfo.age + " " + "性别:" +
(userInfo.gender == 1 ? "男" : "女");
params.setText(str);
}
Vejamos o efeito:
2.3.2, implemente a interface Parceable para as classes que precisam ser aprovadas
Aqui, criamos uma classe Order para implementar a interface Parceable. Precisamos apenas reescrever o método describeContents e o método writeToParcel. O Creator é gerado automaticamente. O código específico é o seguinte:
public class Order implements Parcelable {
public String address;
public boolean isReceived;
public int count;
public Order() {
}
protected Order(Parcel in) {
address = in.readString();
isReceived = in.readByte() != 0;
count = in.readInt();
}
public static final Creator<Order> CREATOR = new Creator<Order>() {
@Override
public Order createFromParcel(Parcel in) {
return new Order(in);
}
@Override
public Order[] newArray(int size) {
return new Order[size];
}
};
@Override
public int describeContents() {
// 只有当对象中存在文件描述符的时候才需要返回 1,通常情况下返回 0 即可
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(address);
dest.writeBoolean(isReceived);
dest.writeInt(count);
}
}
O código passado é o seguinte:
// 4、复杂类型的数据传递 实现 Parcelable 接口
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Order order = new Order();
order.address = "测试地址";
order.isReceived = true;
order.count = 5;
intent.putExtra("order", order);
startActivity(intent);
Para receber o objeto Parcelable, precisamos chamar o método getIntent (). GetParcelableExtra (), vamos olhar o código:
Order order = getIntent().getParcelableExtra("order");
if (order != null) {
String str = "地址:" + order.address + " " + "购买数量:" + order.count + " " + "是否已经确认收货:" +
(order.isReceived ? "是" : "否");
params.setText(str);
}
Vejamos o efeito:
2.4, retorno de dados de atividade
Quando a segunda Activity precisa retornar dados para a primeira Activity, só precisamos iniciar a segunda Activity por meio do método startActivityForResult (). Quando a segunda Activity é fechada, o sistema Android chama de volta a primeira. Método onActivityResult () de Activity, neste método podemos obter alguns dados retornados pela segunda Activity.
O código específico de MainActivity é o seguinte:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_start).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 5、Activity 数据回传
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivityForResult(intent, 1000);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
String backData = data.getStringExtra("back_data");
Log.e("MainActivityTag", "requestCode:" + requestCode + " " + "resultCode:" + resultCode + " " +
"回传的数据:" + backData);
}
}
O código específico de SecondActivity é o seguinte:
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Intent intent = new Intent();
intent.putExtra("back_data", "回传数据是。。。。。。。。");
setResult(RESULT_OK, intent);
}
}
O resultado é o seguinte:
Três, inicie a atividade do sistema
Os componentes de atividade comumente usados no sistema Android incluem fazer chamadas , enviar mensagens de texto e ligar a câmera . Os métodos de inicialização são:
- intent.setAction (Intent.ACTION_DIAL);
- intent.setAction (Intent.ACTION_SENDTO)
- intent.setAction (MediaStore.ACTION_IMAGE_CAPTURE)
O código específico é o seguinte:
- número de discagem
Intent intent = new Intent(); intent.setAction(Intent.ACTION_DIAL); startActivity(intent);
- enviar mensagens
Intent intent = new Intent(); intent.setAction(Intent.ACTION_SENDTO); Uri smsToUri = Uri.parse("smsto:" + 10086); intent.setData(smsToUri); intent.putExtra("sms_body", "短信内容"); startActivity(intent);
- ligue uma câmera
Intent intent = new Intent(); intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); startActivity(intent);
Os efeitos específicos são os seguintes:
Quatro, resumo
Até agora, falamos sobre os cinco métodos de inicialização , ciclo de vida , quatro modos de inicialização , transferência de dados entre atividades e como iniciar os componentes de atividade do sistema .