最近二期项目正在讨论需求,本人小小程序员只有搞搞维护的份。刚工作不久,技术经验不足,随时准备找份更好的工作,闲来无事,看看Android面试经典啥的,就看到有问Activity之间数据通信方式都有哪些(*只是Activity之间通信,不讨论Service、Broadcast),忽然想想自己也不是很确定了解的全不全。看了挺多文档,大多只涉及到其中几点,现在整理一下,共自己和大家参考,如有欠缺欢迎留言指正,本人热衷回帖,共同讨论学习。
Activity之间的数据通信方式主要有以下????种:
- Intent
- 借助类的静态变量
- 借助全局变量/Application
- 借助外部工具
– 借助SharedPreference
– 使用Android数据库SQLite
– 赤裸裸的使用File
– Android剪切板 - 借助Service
(1) 在Intent跳转时携带数据
Intent是Android四大组件(Activity、Service、BroadcastReceiver、ContentProvider)之间通信的纽带,在Intent中携带数据也是四大组件之间数据通信最常用、最普通的方式。常规写法如下:
//创建用于封装数据的Bundle对象
Bundle bundle = new Bundle();
bundle.putString("name", "WangJie");
bundle.putInt("age", 23);
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
//将Bundle对象嵌入Intent中
intent.putExtras(bundle);
startActivity(intent);
更简洁,也是更智能的写法是:
//创建Intent对象
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
//程序自动创建Bundle,然后将对Intent添加的数据装载在Bundle中,对用户透明
intent.putExtra("name", "WangJie");
intent.putExtra("age", 23);
startActivity(intent);
在SecondActivity中获取intent跳转时携带的数据:
//intent要用this的getIntent()获取
Intent intent = getIntent();
//用intent.getXXXExtra("key-name")或是intent.getXXXExtra("key-name", default-value)获取值
String name = intent.getStringExtra("key1");
int age = intent.getIntExtra("key2", 0);
(2)借助类的静态变量来实现
由于类的静态成员可以通过“className.fileName”来访问,故而可以供两个Activity访问从而实现Activity之间的数据通信:
在MainActivity中:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//先查看一下未更改的值
SecondActivity.age = 23;
Button btn = (Button) findViewById(R.id.button);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//到SecondActivity中查看对age更改是否有效
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
}
在SecondActivity中:
public class SecondActivity extends AppCompatActivity {
//声明为静态file
static int age = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
//在MainActivity中更改了age,所以这里肯定不是"1"
Toast.makeText(this, "在MianActivity中更改了age后的值 = " + age, Toast.LENGTH_SHORT).show();
}
}
看结果:
(3)借助全局变量来实现/Application
和类的静态变量类似,但是这个类作为单独第三个类(最好是写一个Application类):
public class ForExampleClass {
//此处声明一个public static 成员来实现数据通信
public static int age = 0;
}
在一个Activity中对类的静态变量进行访问和更改:
//先查看一下未更改的值
Toast.makeText(this, "age = " + ForExampleClass.age, Toast.LENGTH_SHORT).show();
//在一个Activity中对类的静态变量进行变更
ForExampleClass.age = 23;
然后在另一个Activity中访问该变量,来验证这种通信方式:
//在另一个Activity中访问更改后的变量来验证
Toast.makeText(this, "更改后的age = " + ForExampleClass.age, Toast.LENGTH_SHORT).show();
看结果:
在前一个Activity中变更前的值:
在后一个Activity中变更后的值:
这是使用全局变量的本质,但是Java是编程思想不建议这样的写法,所以最好是将ForExampleClass继承Application,在应用的所有Activity都可以访问,并且要用get\set方法进行访问,可以看一下
@彬彬的博客Android使用全局变量和@邬良欢Android入门篇三:使用静态变量在Activity之间传递数据。
其实上边“(2)借助类的静态变量来实现”和“(3)借助全局变量来实现”很类似,只是在借助类的静态变量时接收信息的Activity中声明静态file,在别的Activity中做更改,而借助全局变量(建议继承Application,此时就是所谓的“使用Application”,因为Application类在本应用所有Activity中都可以访问,但是要注意内存泄漏的问题)是另外声明一个类,所有Activity共享这个类而已
————好了,一篇写不完了,剩下的下篇Android之Activity之间的数据通信方式大全(二)继续吧!