1.アクティビティレビュー
Android(上)の4つの主要コンポーネントの活動の分析、我々はすでに話しました起動方法、ライフサイクルとのスタートアップモード活動。このセクションでは、のの話を聞かせて2つの知識ポイントの活動の間でパラメータを渡すと、どのようにシステムの活動を開始するために。アクティビティ間のパラメーターの転送には、パラメーターを転送するためのIntentの使用、パラメーターを転送するためのBundleの使用、および複雑なデータの転送が含まれます。
2、アクティビティ間のデータ転送
2.1、インテントを使用してデータを転送する
Intentを使用してデータを転送するのは、主にIntent.putExtra()メソッドを呼び出すことです。このメソッドには2つのパラメーターがあります。最初のパラメーターはnameで、2番目のパラメーターはvalueです。valueのタイプは次のとおりです
。データを転送するための特定のコードは次のとおりです。 :
// 1、利用 Intent 传递数据
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("str", "Android 开发"); // 传递 String
intent.putExtra("flag", true);
startActivity(intent);
送信されたコードは書かれていますが、どうやって受け取るのですか?以下に示すように、getIntent()メソッドを使用してSecondActivityでデータを受信できます。
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("没有接受到数据");
}
効果を見てみましょう:
2.2。バンドルを使用してデータを転送する
バンドルを使用してデータを転送するのは、主にバンドルを使用して最初に転送するデータを保存し、次にバンドルデータセットを受信する必要のあるアクティビティに転送することです。転送されたコードを見てみましょう。
// 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);
バンドルの受信も非常に簡単で、getIntent()。getBundleExtra()メソッドを呼び出すだけで済みます。コードを見てみましょう。
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("没有接受到数据");
}
}
バンドル受け渡しデータとインテント受け渡しデータの効果はまったく同じですが、書き込みが少し異なります。
2.3、アクティビティ間の複雑なデータの転送
上記の2つのメソッドは、基本的なタイプのデータを渡すことができますが、複雑なデータ(オブジェクトなど)を渡す場合は、どうすればよいですか?Androidには、複雑なタイプのデータを渡すための2つの方法があります。
2.3.1。渡す必要のあるクラスのSerilziableインターフェイスを実装する
ここでは、Serilziableインターフェイスを実装するためのUserInfoクラスを作成します。具体的なコードは次のとおりです。
import java.io.Serializable;
public class UserInfo implements Serializable {
public String username;
public int age;
public int gender;
}
渡されるコードは次のとおりです。
// 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);
Serializableオブジェクトを受け取るには、getIntent()。getSerializableExtra()メソッドを呼び出す必要があります。コードを見てみましょう。
UserInfo userInfo = (UserInfo) getIntent().getSerializableExtra("userInfo");
if (userInfo != null) {
String str = "名字:" + userInfo.username + " " + "年龄:" + userInfo.age + " " + "性别:" +
(userInfo.gender == 1 ? "男" : "女");
params.setText(str);
}
効果を見てみましょう:
2.3.2、渡す必要のあるクラスのParceableインターフェイスを実装する
ここでは、Parceableインターフェイスを実装するためのOrderクラスを作成します。describeContentsメソッドとwriteToParcelメソッドを書き直すだけで済みます。Creatorは自動的に生成されます。具体的なコードは次のとおりです。
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);
}
}
渡されるコードは次のとおりです。
// 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);
Parcelableオブジェクトを受け取るには、getIntent()。getParcelableExtra()メソッドを呼び出す必要があります。コードを見てみましょう。
Order order = getIntent().getParcelableExtra("order");
if (order != null) {
String str = "地址:" + order.address + " " + "购买数量:" + order.count + " " + "是否已经确认收货:" +
(order.isReceived ? "是" : "否");
params.setText(str);
}
効果を見てみましょう:
2.4、アクティビティデータの戻り値
2番目のアクティビティが最初のアクティビティにデータを返す必要がある場合、startActivityForResult()メソッドを介して2番目のアクティビティを開始するだけで済みます。2番目のアクティビティが閉じられると、Androidシステムは最初のアクティビティをコールバックします。アクティビティのonActivityResult()メソッド。このメソッドでは、2番目のアクティビティによって返されるデータを取得できます。
MainActivityの具体的なコードは次のとおりです。
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);
}
}
SecondActivityの具体的なコードは次のとおりです。
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);
}
}
結果は次のとおりです。
3、システムのアクティビティを開始します
Androidシステムで一般的に使用されるアクティビティコンポーネントには、電話をかける、テキストメッセージを送信する、カメラの電源を入れるなどがあります。起動方法は次のとおりです。
- intent.setAction(Intent.ACTION_DIAL);
- intent.setAction(Intent.ACTION_SENDTO)
- intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE)
具体的なコードは次のとおりです。
- 番号をダイヤル
Intent intent = new Intent(); intent.setAction(Intent.ACTION_DIAL); startActivity(intent);
- メッセージを送る
Intent intent = new Intent(); intent.setAction(Intent.ACTION_SENDTO); Uri smsToUri = Uri.parse("smsto:" + 10086); intent.setData(smsToUri); intent.putExtra("sms_body", "短信内容"); startActivity(intent);
- カメラの電源を入れます
Intent intent = new Intent(); intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); startActivity(intent);
具体的な効果は次のとおりです。
4、まとめ
これまで、5つの起動方法、ライフサイクル、4つの起動モード、アクティビティ間のデータ転送、およびシステムアクティビティコンポーネントの起動方法について説明してきました。