您的位置:首页 > 移动开发 > Android开发

Android之Activity之间的数据通信方式大全(一)

2015-09-29 23:20 405 查看
最近二期项目正在讨论需求,本人小小程序员只有搞搞维护的份。刚工作不久,技术经验不足,随时准备找份更好的工作,闲来无事,看看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之间的数据通信方式大全(二)继续吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: