Activity之间的通信方式

在这篇笔记中《Android学习笔记之Activity》,有提到Activity之间的通信方式有 5 种,但没有展开内容详细去讲述,所以在这篇笔记详细去讲述每一种通信方式的实现方法。

  • 在Intent跳转时携带数据
  • 借助类的静态变量
  • 借助全局变量 Application
  • 借助Service服务
  • 借助外部存储来实现通讯
    • 借助 SharedPreference
    • 使用Android数据库 SQLite
    • 使用 File本地文件

一、在Intent跳转时携带数据

Intent是Android四大组件(Activity、Service、BroadcastReceiver、ContentProvider)之间通信的纽带,在Intent中携带数据也是四大组件之间数据通信最常用、最普通的方式。常规写法如下:

// 第一种,创建用于封装数据的Bundle对象
Bundle bundle = new Bundle();
bundle.putString("name", "Activity");
bundle.putInt("count", 6);
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtras(bundle); // 将Bundle对象嵌入Intent中
startActivity(intent);

// 第二种,比较简单的写法
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
//程序自动创建Bundle,然后将对Intent添加的数据装载在Bundle中,对用户透明
intent.putExtra("name", "Activity");
intent.putExtra("count", 6);
startActivity(intent);

在SecondActivity中获取Intent跳转时携带的数据:

Intent intent = getIntent();
String name = intent.getStringExtra("name","");
int age = intent.getIntExtra("count", 0);

使用Bundle传值对比在Intent里直接赋值的好处:

  1. 减少重复赋值操作(需要传递多次);
  2. 除了基本类型,还可以传实现Serializable 接口的对象;
// 定义对象实现接口
public class User implements Serializable {
    //其他代码省略,和普通的bean一样
}
// 具体操作,将user对象传递
User user = new User();
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("user", user);
intent.putExtras(bundle);
startActivity(intent);
// 将数据取出
Intent intent = getIntent();
User user = (User)intent.getSerializableExtra("user");

延伸阅读:Android序列化Serializeble和Parcelable


二、借助类的静态变量来实现

由于类的静态成员可以通过“className.fileName”来访问,故而可以供两个Activity访问从而实现Activity之间的数据通信:

// 在MainActivity中,访问SecondActivity中的静态值
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        SecondActivity.name = "Son of the sea";
        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        startActivity(intent);
        }
}
public class SecondActivity extends AppCompatActivity {
    static String name = "Son of the king"; // 声明为静态file
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
         // 被MainActivity修改后,name已经不是king了。
        Toast.makeText(this, name, Toast.LENGTH_SHORT).show();
    }
}

输出 Son of the sea


三、借助全局变量 Application 来实现

和类的静态变量类似,但是这个类作为单独第三个类(最好是写一个Application类):

public class MyApplication  extends Application { {
    //此处声明一个public static 成员来实现数据通信
    private static String name = "Son of the sea"; 
    public void setName(String name){
          this.name = name;
    }
   public String getName() {
        return this.name ;
    }
}
MyApplication  app = (MyApplication) getApplicationContext();
app.setName("Son of the king"); 

MyApplication 作为全局 Application 类,那么必须在 AndroidManifest.xml 中对 MyApplication 进行声明:

   
        
            
                
                
            
        
    

四、借助Service服务

Service设计的本意,就是提供一些后台的服务,数据存取,也可以归于其职责的一部分。

Service是提供了直连机制,调用的Activity,可以通过bindService方法,与目标Service建立一条数据通路,拿到IBinder。这样,通过Android提供的IPC模型(进程间通信),就可以进行远程方法的调用和数据的传输了。

通过这种模式,可以解决一定问题,但是对于Service来说,实在是太大才小用了,Service的专长,不是在数据,还是在逻辑。对于传数据而言,Service还是重量了一点,不但是有连接耗精力,传输经由IPC,写起来也够费劲。而且作为组件,Service随时可能死掉,你还是要费劲心机的处理数据的持久化,得不偿失。


五、借助外部存储来实现通讯

由于数据存储单独写了一篇笔记,所以在这里就不重复去写了,如果有需要可以看这篇笔记:Android学习笔记之数据存储

5.1借助 SharedPreference来实现

SharedPreferences是Android平台上一个轻量级的存储辅助类,用来保存应用的一些常用配置,它提供了string,set,int,long,float,boolean六种数据类型。最终数据是以xml形式进行存储。在应用中通常做一些简单数据的持久化缓存。

5.2借助 SQLite 来实现

SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,在存储大量复杂的关系型数据的时可以使用,比前面学过的只适用于存储简单数据的两种存储方式要好很多。

5.3借助 Flie 来实现

文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供openFileInput()和openFileOutput()方法来读取设备上的文件。


总结

通过回顾Activity之间的通信方式的这五种方式,在需要使用到这些知识的时候,能快速联想这几种方式,有助于提高开发的效率。

你可能感兴趣的:(Activity之间的通信方式)