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

最近二期项目正在讨论需求,本人小小程序员只有搞搞维护的份。刚工作不久,技术经验不足,随时准备找份更好的工作,闲来无事,看看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();
    }
}

看结果:
Android之Activity之间的数据通信方式大全(一)_第1张图片

(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中变更前的值:
Android之Activity之间的数据通信方式大全(一)_第2张图片
在后一个Activity中变更后的值:
Android之Activity之间的数据通信方式大全(一)_第3张图片
这是使用全局变量的本质,但是Java是编程思想不建议这样的写法,所以最好是将ForExampleClass继承Application,在应用的所有Activity都可以访问,并且要用get\set方法进行访问,可以看一下
@彬彬的博客Android使用全局变量和@邬良欢Android入门篇三:使用静态变量在Activity之间传递数据。
其实上边“(2)借助类的静态变量来实现”和“(3)借助全局变量来实现”很类似,只是在借助类的静态变量时接收信息的Activity中声明静态file,在别的Activity中做更改,而借助全局变量(建议继承Application,此时就是所谓的“使用Application”,因为Application类在本应用所有Activity中都可以访问,但是要注意内存泄漏的问题)是另外声明一个类,所有Activity共享这个类而已

————好了,一篇写不完了,剩下的下篇Android之Activity之间的数据通信方式大全(二)继续吧!

你可能感兴趣的:(数据传递,数据通信,信息传递,Activity通信)