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

一、基本知识

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. 细说C语言的优先级和结合性

    Table0. 为什么要掌握优先级1. 优先级1.1 优先级图表1.2 运算符实例1.3 优先级顺口溜2. 结合性3. 参考资料 写代码的时候,常会翻看的一个表就是“c语言运算符优先级表”.c的运算符 ...

  2. mac下安装伪分布hadoop2.6.0和hbase1.0.1.1

    1.安装JDK,我安装的是java1.7 2.创建管理员账户 3.安装ssh服务(如果已有跳过此步) 4.ssh无密码验证登陆 以上过程略,可参考ubuntu下安装hadoop一文. 5.下载并解压h ...

  3. BZOJ1563 NOI2009 诗人小G【决策单调性优化DP】

    LINK 因为是图片题就懒得挂了 简要题意:有n个串,拼接两个串需要加一个空格,给你l和p,问你拼接后每个串的总长减l的绝对值的p次方的最小值 首先打表发现一下这题是决策单调的对于所有数据都成立就当他 ...

  4. BZOJ2243 SDOI2011 染色 【树链剖分】

    BZOJ2243 SDOI2011 染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色 ...

  5. HDU2825 Wireless Password 【AC自动机】【状压DP】

    HDU2825 Wireless Password Problem Description Liyuan lives in a old apartment. One day, he suddenly ...

  6. hdu4261 Estimation[暴力dp+对顶堆]

    https://vjudge.net/problem/HDU-4261 对于一个长2000的数列划分最多25个块,每块代价为块内每个数与块内中位数差的绝对值之和,求最小总代价. 套路化地,设$f[i] ...

  7. jsp_include

    jsp__include指令先包含后编译 include 行为 先编译后包含 <jsp:include page="head.jsp"></jsp:include ...

  8. oracle表空间维护常用命令

    ---查看表空间的名字及文件所在位置: select tablespace_name, file_id, file_name,round(bytes/(1024*1024),0) total_spac ...

  9. Web 漏洞分析与防御之 XSS(一)

    原文地址:Web 漏洞分析与防御之 XSS(一) 博客地址:http://www.extlight.com 一.全称 跨站脚本攻击(Cross Site Scripting) 二.原理 通过在网站中的 ...

  10. webservice-之使用axis+spring开发

    一.环境配置 :在 eclipse 中配置引入相应的 spring框架( core/Remoting/Web ). axis 包.   二.代码开发 1.  在 MyEclipse 中建立一个新的 J ...