在这篇笔记中《Android学习笔记之Activity》,有提到Activity之间的通信方式
有 5 种,但没有展开内容详细去讲述,所以在这篇笔记详细去讲述每一种通信方式的实现方法。
- 在Intent跳转时携带数据
- 借助类的静态变量
- 借助全局变量 Application
- 借助Service服务
- 借助外部存储来实现通讯
- 借助 SharedPreference
- 使用Android数据库 SQLite
- 使用 File本地文件
一、在Intent跳转时携带数据
Intent是Android四大组件(Activity、Service、BroadcastReceiver、ContentProvider)之间通信的纽带,在Intent中携带数据也是四大组件之间数据通信最常用、最普通的方式。常规写法如下:
// 第一种,创建用于封装数据的Bundle对象
Bundle bundle = new Bundle();
bundle.putString("name", "Activity");
bundle.putInt("count", 6);
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtras(bundle); // 将Bundle对象嵌入Intent中
startActivity(intent);
// 第二种,比较简单的写法
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
//程序自动创建Bundle,然后将对Intent添加的数据装载在Bundle中,对用户透明
intent.putExtra("name", "Activity");
intent.putExtra("count", 6);
startActivity(intent);
在SecondActivity中获取Intent跳转时携带的数据:
Intent intent = getIntent();
String name = intent.getStringExtra("name","");
int age = intent.getIntExtra("count", 0);
使用Bundle传值对比在Intent里直接赋值的好处:
- 减少重复赋值操作(需要传递多次);
- 除了基本类型,还可以传实现Serializable 接口的对象;
// 定义对象实现接口
public class User implements Serializable {
//其他代码省略,和普通的bean一样
}
// 具体操作,将user对象传递
User user = new User();
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("user", user);
intent.putExtras(bundle);
startActivity(intent);
// 将数据取出
Intent intent = getIntent();
User user = (User)intent.getSerializableExtra("user");
延伸阅读:Android序列化Serializeble和Parcelable
二、借助类的静态变量来实现
由于类的静态成员可以通过“className.fileName”来访问,故而可以供两个Activity访问从而实现Activity之间的数据通信:
// 在MainActivity中,访问SecondActivity中的静态值
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
...
SecondActivity.name = "Son of the sea";
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
}
public class SecondActivity extends AppCompatActivity {
static String name = "Son of the king"; // 声明为静态file
@Override
protected void onCreate(Bundle savedInstanceState) {
...
// 被MainActivity修改后,name已经不是king了。
Toast.makeText(this, name, Toast.LENGTH_SHORT).show();
}
}
输出 Son of the sea
三、借助全局变量 Application 来实现
和类的静态变量类似,但是这个类作为单独第三个类(最好是写一个Application类):
public class MyApplication extends Application { {
//此处声明一个public static 成员来实现数据通信
private static String name = "Son of the sea";
public void setName(String name){
this.name = name;
}
public String getName() {
return this.name ;
}
}
MyApplication app = (MyApplication) getApplicationContext();
app.setName("Son of the king");
MyApplication 作为全局 Application 类,那么必须在 AndroidManifest.xml 中对 MyApplication 进行声明:
四、借助Service服务
Service设计的本意,就是提供一些后台的服务,数据存取,也可以归于其职责的一部分。
Service是提供了直连机制,调用的Activity,可以通过bindService方法,与目标Service建立一条数据通路,拿到IBinder。这样,通过Android提供的IPC模型(进程间通信),就可以进行远程方法的调用和数据的传输了。
通过这种模式,可以解决一定问题,但是对于Service来说,实在是太大才小用了,Service的专长,不是在数据,还是在逻辑。对于传数据而言,Service还是重量了一点,不但是有连接耗精力,传输经由IPC,写起来也够费劲。而且作为组件,Service随时可能死掉,你还是要费劲心机的处理数据的持久化,得不偿失。
五、借助外部存储来实现通讯
由于数据存储单独写了一篇笔记,所以在这里就不重复去写了,如果有需要可以看这篇笔记:Android学习笔记之数据存储
5.1借助 SharedPreference来实现
SharedPreferences是Android平台上一个轻量级的存储辅助类,用来保存应用的一些常用配置,它提供了string,set,int,long,float,boolean六种数据类型。最终数据是以xml形式进行存储。在应用中通常做一些简单数据的持久化缓存。
5.2借助 SQLite 来实现
SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,在存储大量复杂的关系型数据的时可以使用,比前面学过的只适用于存储简单数据的两种存储方式要好很多。
5.3借助 Flie 来实现
文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供openFileInput()和openFileOutput()方法来读取设备上的文件。
总结
通过回顾Activity之间的通信方式的这五种方式,在需要使用到这些知识的时候,能快速联想这几种方式,有助于提高开发的效率。