给自己做个笔记,温故而知新!
介绍
在一个完整的应用之间,会存在多个Activity,这些Activity之间避免不了要进行跳转以及通信(相互至之间传递数据);
Activity之间的跳转
1.跳转到下一个新的Activity
Intent intent =new Intent(TestActivity.this,TestBActivity.class);
intent.putExtra("toTestB",1);
startActivity(intent);
获取传递过来的值
Intent intent = getIntent();
int getData = intent.getIntExtra("toTestB",0);
2.跳转到下一个新的Activity,然后将数据传递到上一个Activity,并且跳转回到上一个Activity:
用到的方法 onActivityResult与startActivityForResult这个方法配合使用,跳转的activity中使用setResult(int resulttCode,Intent intent)。
第一个Activity中用到的代码:
//发送跳转请求
private int REQUEST_CODE = 1;
Intent intent =new Intent(TestActivity.this,TestBActivity.class);
startActivityForResult(intent,REQUEST_CODE);
//接收返回的数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_CODE && resultCode == RESULT_OK){
String str = data.getStringExtra("result");
Log.e(TAG,"result:"+str);
}
}
第二Activity用到的代码:
Intent intent = new Intent();
intent.putExtra("result","1");
setResult(RESULT_OK,intent);
finish();
Activity之间的通信方式
通信方式有5种
-
Intent跳转时携带数据
-
借助类的静态变量
-
借助全局变量Application
-
借助Service服务
-
借助外部存储通信
1.SharedPreference存储数据通信
2.Android的本地数据库Sqlite,greendao,room
3.存储于手机上的本地文件代码实现
Intent传递携带参数的数据类型
-
基本数据类型
-
传递自定义对象(需要实现Serializable或者Parcelable接口)
-
传递自定义对象集合
Intent intent = new Intent(Aactivity.this,Bactivity.class);
/*第一种简单传递数据*/
intent.putExtra("fromA","easy");
startActivity(intent);
/*第二种使用bundle传递数据*/
Bundle bundle = new Bundle();
bundle.putString("fromA","bundle");
intent.putExtras(bundle);
startActivity(intent);
/*使用Bundle传递单个对象*/
User user = new User("zhyang");
Bundle bundles = new Bundle();
bundles.putSerializable("user",user);
intent.putExtras(bundles);
startActivity(intent);
/*使用Bundle传递集合对象*/
User user1 = new User("zhyang");
User user2 = new User("liyang");
List<User> lists = new ArrayList<>();
lists.add(user1);
lists.add(user2);
Bundle bundles1 = new Bundle();
bundles1.putSerializable("user", (Serializable) lists);
intent.putExtras(bundles1);
startActivity(intent);
数据接收
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
tv = findViewById(R.id.tv);
Intent intent = getIntent();
String dateFromA = intent.getStringExtra("fromA");
User user = (User) intent.getSerializableExtra("user");
List<User> users = (List<User>) intent.getSerializableExtra("user");
tv.setText("从A传递过来的数据:"+ users.size());
}
使用Bundle传值对比在Intent里直接赋值的好处:
1.减少重复赋值操作(需要传递多次);
2.除了基本类型,还可以传实现Serializable或者Parcelable接口的对象;