因为不同进程都是享有独立资源的,所以全局变量这些都是无效的,必须有其他的进程间通信方式。

一、基本知识

1:怎样使用多进程

Android正常使用的多进程的办法只有一种,就是在Service或Activity的属性里面设置remote属性

这样,我们打开Main2Activty的时候,该活动或服务就会以一个新的进程来创建

2:查看进程信息

通过adb shell连接上我们的手机,输入ps命令,查看所有的进程

可以使用ps|grep命令 + 包名 直接查看我们的app的进程信息   这里的grep是查询文本的命令

可以看到,有两个不同的进程。第一个是我们的MainActivity,没有指定属性,默认进程名是包名。第二是Main2Activity,默认是包名+:remote

3:对象的序列化

3.1:什么是序列化?

简单点来说,序列化就是把我们包含了数据的对象,转化成一堆数据,保存在文件中。

3.2:序列化的作用?

(1).永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中

(2).通过序列化操作将对象数据在网络上进行传输(由于网络传输是以字节流的方式对数据进行传输的.因此序列化的目的是将对象数据转换成字节流的形式)

(3).将对象数据在进程之间进行传递(Activity之间传递对象数据时,需要在当前的Activity中对对象数据进行序列化操作.在另一个Activity中需要进行反序列化操作讲数据取出)

(4).Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长(即每个对象都在JVM中)但在现实应用中,就可能要停止JVM运行,但有要保存某些指定的对象,并在将来重新读取被保存的对象。这是Java对象序列化就能够实现该功能。(可选择入数据库、或文件的形式保存)

(5).序列化对象的时候只是针对变量进行序列化,不针对方法进行序列化.

(6).在Intent之间,基本的数据类型直接进行相关传递即可,但是一旦数据类型比较复杂的时候,就需要进行序列化操作了.

可以简单的理解为,转化为数据流之后,方便计算机直接传数据或保存数据。

3.3:怎么序列化

自定义的类必须实现 Serializable 或者 Parcelable 接口

3.3.1:Serializable

这是Java提供的一个序列化的接口,非常简单,只需自行声明一个版本ID即可,其他的都已经封装好了。

//自定义类

public class SerialUser implements Serializable {

    //版本号
private static final long serialVersionUID = 2016L; //成员
String name;
int age; //构造函数
public SerialUser(String name,int age){ this.name = name;
this.age = age; }
}

//序列化过程 MainActivity

public class MainActivity extends AppCompatActivity {

    Button button;

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); button = (Button)findViewById(R.id.button); //使用序列化的类
//序列化过程
SerialUser user = new SerialUser("小明",20);
try { File file = new File(Environment.getExternalStorageDirectory()
+ "/my.txt"); ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
out.writeObject(user);
out.close(); } catch (IOException e) {
Log.d("TAG",e.toString());
} button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { Intent intent = new Intent(MainActivity.this,Main2Activity.class);
startActivity(intent); }
}); }
}

//反序列化过程 Main2Activity

public class Main2Activity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2); Log.d("TAG","new process"); //反序列化的过程
try { File file = new File(Environment.getExternalStorageDirectory()
+ "/my.txt"); ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
SerialUser user = (SerialUser)in.readObject();
in.close();
Log.d("TAG","ok");
Log.d("TAG",user.name+user.age); } catch (IOException e) {
Log.d("TAG",e.toString());
} catch (ClassNotFoundException e) {
Log.d("TAG",e.toString());
} }
}

效果图

顺便看看中间文件my.txt里面到底存了什么数据

3.3.2:Parcelable

Parcelable不像Serialable那样,可以直接指定中间文件。所以反序列化时不能够通过打开文件读取的方式来进行。

我们要实现完整Parcelable接口就行了。Parcelable一般是通过Intent使用的,放进Intent里面来传递数据。

public class ParcelUser implements Parcelable {

    //成员
String name;
String sex;
int age; //构造
public ParcelUser(String name,String sex,int age){ this.name = name; this.sex = sex; this.age = age; } //一般都是返回0,不用管
@Override
public int describeContents() {
return 0;
} //必须实现的
//其实只是针对成员变量保存一下就好
@Override
public void writeToParcel(Parcel dest, int flags) { dest.writeString(name);
dest.writeString(sex);
dest.writeInt(age); } //反序列化,这个地方系统没有提供来实现,自己要补上
//该实现的地方都实现就对了
public static final Parcelable.Creator<ParcelUser> CREATOR = new Creator<ParcelUser>() {
@Override
public ParcelUser createFromParcel(Parcel source) {
return new ParcelUser(source );
} @Override
public ParcelUser[] newArray(int size) {
return new ParcelUser[size];
}
}; //反序列化的构造函数
private ParcelUser(Parcel in){ this.name = in.readString();
this.sex = in.readString();
this.age = in.readInt(); } }

MainActivity:

public class MainActivity extends AppCompatActivity {

    Button button;

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); button = (Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { Intent intent = new Intent(MainActivity.this,Main2Activity.class); ParcelUser user = new ParcelUser("小红","女",16); intent.putExtra("user",user); startActivity(intent); }
}); }
}

Main2Activity:

public class Main2Activity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2); Log.d("TAG", "new process"); //反序列化的过程
Intent intent = getIntent(); ParcelUser user = intent.getParcelableExtra("user"); Log.d("TAG",user.name);
Log.d("TAG",user.sex);
Log.d("TAG",user.age+""); } }

Android六大进程间通信方式总结之一:基本知识的更多相关文章

  1. 国内Android应用推广的六大主流方式

    国内Android应用推广的六大主流方式 http://mobi.baike.com/article-19433.html 随着Android市场份额的飞速增长,越来越多的国内开发团队和公司開始投入A ...

  2. 最快的进程间通信方式你get了么

    前言:天下武功为快不破!在信息爆炸.快速发展的新时代...,扯远了....进程间通信方式有很多,但最快的方式你知道么?由我娓娓道来... 一.共享内存方式 主角闪亮登场了,噔噔瞪...,最快的方式就是 ...

  3. Android六大基本布局

    一.基本理论Android六大基本布局分别是:线性布局LinearLayout.表格布局TableLayout.相对布局RelativeLayout.层布局FrameLayout.绝对布局Absolu ...

  4. 每个Android开发者必须知道的内存管理知识

    原文:每个Android开发者必须知道的内存管理知识 拷贝在此处,以备后续查看. 相信一步步走过来的Android从业者,每个人都会遇到OOM的情况.如何避免和防范OOM的出现,对于每一个程序员来说确 ...

  5. Android开发——进程间通信之AIDL(二)

    0.  前言 不论是Android还是其它操作系统.都会有自己的IPC机制.所谓IPC(Inter-Process Communication)即进程间通信.首先线程和进程是非常不同的概念,线程是CP ...

  6. Android数据存储方式--SharedPreferences

    Android数据存储方式有如下四种:SharedPreferences.存储到文件.SQLite数据库.内容提供者(Content provider).存储到网络服务器. 本文主要介绍一下Share ...

  7. 在android用Get方式发送http请求

    烦人的日子终于过去啦,终于又可以写博客啦,对自己的android学习做个总结,方便以后查看...... 一.在android用Get方式发送http请求,使用的是java标准类,也比较简单. 主要分以 ...

  8. Android 采用post方式提交数据到服务器

    接着上篇<Android 采用get方式提交数据到服务器>,本文来实现采用post方式提交数据到服务器 首先对比一下get方式和post方式: 修改布局: <LinearLayout ...

  9. Android+struts2+JSON方式的手机开发(Login)

    在手机的后台服务无论是调用WebService还是Http请求,多数都是采用Android的HttpClient实现相关的调用实现.本文实现Android+Struts2+JSON方式实现为手机前台提 ...

随机推荐

  1. MpVue开发之组件引入的问题

    再一次开发订餐系统中,遇到订餐页面引入头部商品列表,底部组件时,报错,模块编译失败,未进入缓存区. 我以为是新添加的模块没有重新启动导致的,然后重新与运行npm run dev后还是失败, 最后经过反 ...

  2. 2017年 ACM Journal Latex templates 新模板生成 acmart.cls 文件

    假定你的文稿在:/user/acmart-master那么cd /user/acmart-masterlatex acmart.ins最后可得到acmart.cls.

  3. WPF/UWP 的 Grid 布局竟然有 Bug,还不止一个!了解 Grid 中那些未定义的布局规则

    只要你用 XAML 写代码,我敢打赌你一定用各种方式使(nuè)用(dài)过 Grid.不知你有没有在此过程中看到过 Grid 那些匪夷所思的布局结果呢? 本文将带你来看看 Grid 布局中的 Bu ...

  4. Docker环境下eShopOnContainers部署

    从头开始学eShopOnContainers--Visual Studio 2017环境配置 https://www.cnblogs.com/dusthunter/p/9973815.html 一.安 ...

  5. objectForKey与valueForKey在NSDictionary中的差异

    从 NSDictionary 取值的时候有两个方法,objectForKey: 和 valueForKey:,这两个方法具体有什么不同呢? 先从 NSDictionary 文档中来看这两个方法的定义: ...

  6. geohash 精度

    关于地图的距离.  $list1=Db::name('museum')->where('id','in',$user['gz'])->order('ACOS(SIN(('.$lat.' * ...

  7. FastAdmin env.sample 的用法

    FastAdmin env.sample 的用法 在 FastAdmin 的 1.0.0.20180513 中我提交了一个 PR,增加 env.sample 内容如下: [app] debug = f ...

  8. 20 几个知名公司的 Java 面试题汇总

    查看不同公司新鲜真实的Java面试题,摘自Glassdoor.com 巴克莱投资: 假设有一个 getNextparson() 方法返回 Person 对象,Person 类实现了 comparabl ...

  9. SharePoint2013集成Exchange之任务同步

    SharePoint可以将任务列表到outlook中,但在sharepoint 2013 上这个功能似乎不是很好用,如下图所示,点击任务列表的"同步到Outlook"按钮: 在弹出 ...

  10. 微信卡券开发,代金券修改卡券信息返回40145错误码: invalid update! Can not both set PayCell and CenterCellInfo(include: center_title, center_sub_title, center_url). hint: [DZ9rna0637ent1]

      修改代金券,接口返回的数组是这样的内容 Array ( [errcode] => 40145 [errmsg] => invalid update! Can not both set  ...