最近二期项目正在讨论需求,本人小小程序员只有搞搞维护的份。刚工作不久,技术经验不足,随时准备找份更好的工作,闲来无事,看看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之间的数据通信方式大全(二)继续吧!

更多相关文章

  1. Android(安卓)Alert Dialog解决点击按钮对话框不关闭/的问题
  2. Android内存泄漏终极解决篇(下)
  3. 从实际问题中分析 Android中@id与@+id区别
  4. 火线扫描Android静态代码
  5. 个人使用的Android(安卓)Studio快捷键(MAC版)
  6. Facebook Fresco体验 (一)
  7. Android高版本收不到静态注册的广播
  8. Android(安卓)Wifi IP 设置
  9. ubuntu android 命令环境下操作sqlite

随机推荐

  1. Android中通过getSystemService取得服务
  2. android service 学习(上)
  3. Android(安卓)ViewPager嵌套ViewPager+Fr
  4. Android(安卓)菜单(OptionMenu)大全 建立
  5. 在Android(安卓)Service中弹出系统全屏对
  6. Android的四大天王
  7. Android(安卓)ScrollView自动滑动一段距
  8. javaeye中的一些好的android博客
  9. Android(安卓)调用 Web Service
  10. Android(安卓)shape中的padding无效