接着上篇Android之Activity之间的数据通信方式大全(一)继续
(4)借助外部存储来实现通讯
(4-1)使用SharedPreference实现Activity之间的数据通信
SharedPreference是Android中最简单的文件本地化存储方式,Android API也提供相当简单的方式来进行读写操作。下面简单看一下SharedPreference的使用:
首先,我们在MainActivity中先查看一下SharedPreference文件中的初始值,然后做更改:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取Application的SharedPreference对象
SharedPreferences sp = getApplication().getSharedPreferences("myInfo", 0);
//get方法获取值,如果没有存储对应的key-value则返回get方法给的默认值
String name = sp.getString("name", "null");
int age = sp.getInt("age", 0);
boolean isStudent = sp.getBoolean("isStudent", false);
//查看一下初始值
Toast.makeText(this, "MianActivity中:\n" + "name = " + name
+ "\nage = " + age + "\nisStudent = " + isStudent, Toast.LENGTH_SHORT).show();
//在写入时要先获取SharedPreference的Editor对象,经过Editor进行写入
SharedPreferences.Editor editor = sp.edit();
editor.putString("name", "WangJie");
editor.putInt("age", 23);
editor.putBoolean("isStudent", true);
//put完成后一定要commit(),否则不会生效
editor.commit();
Button btn = (Button) findViewById(R.id.button);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
}
然后,在SecondActivity中再次查看:
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
//获取Application的SharedPreference对象
//注意"name"值一定要一致,否则会新建一个SharedPreference对象(本地存储新增一个文件)
SharedPreferences sp = getApplication().getSharedPreferences("myInfo", 0);
String name = sp.getString("name", "null");
int age = sp.getInt("age", 0);
boolean isStudent = sp.getBoolean("isStudent", false);
Toast.makeText(this, "SecondActivity中查看:\n" + "name = " + name
+ "\nage = " + age + "\nisStudent = " + isStudent, Toast.LENGTH_SHORT).show();
}
}
结果看图:
不足之处在于——从SharedPreference的API就可以看出,采用SharedPreference只能存取标准数据类型的变量值int、float、long、boolean、String。对与一些复杂类型的就捉襟见肘了。
(4-2)使用SQLite来实现数据共享通信
和SharedPreference类似,SQLite也是Android提供的一种数据持久化操作方式之一。SQLite是遵循SQL标准的数据库,支持标准SQL语句进行操作,当然Android也为对SQL不熟悉的开发者提供了相应的API(但这些API大多需要传入很多参数,个人觉得很不好用,还是建议学学 SQL,毕竟Android也只用一些简单的增删改查)。
数据库是Application的私有文件,如果其他应用想访问该数据要用过ContentProvider来实现。
比如你用系统的录音机组件即时搞一段音频信息,它不是返回可能大到恐怖的录音数据,而是会返回给你一个
Uri
,它标明了这份数据在ContentProvider的地址信息,拿着这个Uri,领取数据就好,就像一张门票。不同Activity可以通过访问或更改数据库中对应的数据项来实现两个(多个Activity)之间的数据通信。
这里就不举例使用了,以后有机会会专门说说SQLite的使用。
(4-3)直接使用File来实现
其实从本质属性来讲,使用SharedPreference和SQLite来存取数据都是使用File来存取数据的方式——SharedPreference是存放在data/data/应用包名/shared_prefs目录下后缀为.xml的文件,SQLite是存放在data/data/应用包名/databases目录下的后缀为.db3的文件。只是Android系统为这些文件存取专门格式化了存取格式而已,本质上还是文件读写。
当然,如果你足够淡定,也可以用赤裸
裸的
File
来存储。如果这个文件存在手机私有目录下,那就内部使用,放在SD卡上,那就可以所有应用,一切分享。但是这样暴力的方式需要你在文件读写时进行大量的额外工作。
基于这样外部存储的数据传输,优缺点显而易见,它解决了困扰Intent的传输路径复杂,不利于传输大批量数据的问题,但同时,它有留下了
效率隐患
,复杂了
编程模型
。因为面对外部存储,开发者必须要考虑效率问题,很多时候,多线程就会被提上议程,这样,想不麻烦,都不行鸟。
(5)借助Service来实现
既然存在外部太慢,那么还是在内存级别解决问题好了,这时候,你可能就需要请出Android四大组件之一的Service了。Service设计的本意,就是提供一些后台的服务,数据存取,也可以归于其职责的一部分。
Service是提供了直连机制,调用的Activity,可以通过
bindService方法,与目标Service建立一条数据通路,拿到
IBinder。这样,通过Android提供的IPC模型(进程间通信),就可以进行远程方法的调用和数据的传输了。
通过这种模式,可以解决一定问题,但是对于Service来说,实在是太大才小用了,Service的专长,不是在数据,还是在逻辑。对于传数据而言,Service还是重量了一点,不但是有连接耗精力,传输经由IPC,写起来也够费劲。而且作为组件,Service随时可能死掉,你还是要费劲心机的处理数据的持久化,得不偿失。
本人能力有限,如有错误欢迎留言批评指正,大家一起讨论,共同进步!