一、Serialiable与Paracle

①、作用    ②、使用

二、Binder与AIDL

①、各自的作用

三、如何使用IPC机制

举例

四、IPC机制的原理

①、流程图  ②、自己编译自动生成的Aidl代码

回答:

Serialiable的使用

步骤:1、创建类并继承Serializable接口  2、将对象序列化到文件中 3、从文件中获取序列化的文件

详细步骤:

1、创建Book类,并继承Serializable,编写serialVersionUID降低反序列化失败的概率

public class Book implements Serializable {
private static final long serialVersionUID = 0X1111L; private String name;
private String author;
private String publish; public Book(String author, String name, String publish) {
this.author = author;
this.name = name;
this.publish = publish;
} @Override
public String toString() {
return "Book{" +
"author='" + author + '\'' +
", name='" + name + '\'' +
", publish='" + publish + '\'' +
'}';
}
}

Book

2、通过Android自带的文件储存器保存文件。

public class MainActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Book book = new Book("asd","zxc","qweqw");
try {
//利用自带的类,创建文件
FileOutputStream stream = openFileOutput("serialiable",MODE_APPEND);
ObjectOutputStream dos = new ObjectOutputStream(stream);
//将Book对象序列化
dos.writeObject(book);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} //layout中对Button使用 android:onClick="launchSecondActivity"
public void launchSecondActivity(View view){
Intent intent = new Intent(this,SecondActivity.class);
startActivity(intent);
}
}

MainActivity

3、获取文件的流,并读取文件

public class SecondActivity extends Activity {
private static final String TAG = "SecondActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
try {
FileInputStream stream = openFileInput("serialiable");
ObjectInputStream ois = new ObjectInputStream(stream);
Book book = (Book) ois.readObject();
Log.d(TAG,book+"");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (StreamCorruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}

SecondActivity

Parcelable的使用

步骤:1.创建Book类,并继承Parcelable  2、重写Parcelable的接口  3、创建Creator

详细步骤:

public class Book implements Parcelable {
private String name;
private String author;
private String publish; public Book(String author, String name, String publish) {
this.author = author;
this.name = name;
this.publish = publish;
} public Book(Parcel parcel){
this.author = parcel.readString();
this.name = parcel.readString();
this.publish = parcel.readString();
} @Override
public String toString() {
return "Book{" +
"author='" + author + '\'' +
", name='" + name + '\'' +
", publish='" + publish + '\'' +
'}';
} @Override
public int describeContents() {
return 0;
} @Override
public void writeToParcel(Parcel dest, int flags) {
}
}

Book

②、重写writeToParcel()

    @Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(author);
dest.writeString(name);
dest.writeString(publish);
}

Book

③、创建获取器Creator

    public Book(Parcel parcel){
this.author = parcel.readString();
this.name = parcel.readString();
this.publish = parcel.readString();
} public static final Parcelable.Creator<Book> CREATOR = new Parcelable.Creator<Book>(){
@Override
public Book createFromParcel(Parcel source) {
return new Book(source);
} @Override
public Book[] newArray(int size) {
return new Book[0];
}
};

Book

完整代码

public class Book implements Parcelable {
private String name;
private String author;
private String publish; public Book(String author, String name, String publish) {
this.author = author;
this.name = name;
this.publish = publish;
} @Override
public String toString() {
return "Book{" +
"author='" + author + '\'' +
", name='" + name + '\'' +
", publish='" + publish + '\'' +
'}';
} @Override
public int describeContents() {
return 0;
} @Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(author);
dest.writeString(name);
dest.writeString(publish);
} public Book(Parcel parcel){
this.author = parcel.readString();
this.name = parcel.readString();
this.publish = parcel.readString();
} public static final Parcelable.Creator<Book> CREATOR = new Parcelable.Creator<Book>(){
@Override
public Book createFromParcel(Parcel source) {
return new Book(source);
} @Override
public Book[] newArray(int size) {
return new Book[0];
}
};
}

Book

IPC的简单使用:

任务:完成多进程间Book的添加和获取

步骤1、在java文件夹下创建aidl文件夹(需要进行IPC的文件都放在这个地方)

步骤2、在aidl文件夹下创建Book,并继承Parcelable

(1)、创建Book类

public class Book {
private String author;
private String name;
private String publish; public Book(String author, String name, String publish) {
this.author = author;
this.name = name;
this.publish = publish;
} @Override
public String toString() {
return "Book{" +
"author='" + author + '\'' +
", name='" + name + '\'' +
", publish='" + publish + '\'' +
'}';
}
}

Book

(2)、继承Parcelable

public class Book implements Parcelable{
private String author;
private String name;
private String publish; public Book(String author, String name, String publish) {
this.author = author;
this.name = name;
this.publish = publish;
} @Override
public String toString() {
return "Book{" +
"author='" + author + '\'' +
", name='" + name + '\'' +
", publish='" + publish + '\'' +
'}';
}
//不用修改
@Override
public int describeContents() {
return 0;
} @Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(author);
dest.writeString(name);
dest.writeString(publish);
} public static Parcelable.Creator<Book> CREATOR = new Parcelable.Creator<Book>(){ @Override
public Book createFromParcel(Parcel source) {
return new Book(source);
} @Override
public Book[] newArray(int size) {
return new Book[0];
}
};
//读取的顺序跟保存的顺序需要一致
public Book(Parcel parcel){
author = parcel.readString();
name = parcel.readString();
publish = parcel.readString();
}
}

Book

步骤3、在aidl文件夹中声明Book(只有在aidl声明的类才能在aidl中调用),会生成src/main下的aidl文件夹

package aidl;
// Declare any non-default types here with import statements
parcelable Book;

Book.aidl

步骤4、在src/main/aidl文件夹中创建IBookManager

// IBookManager.aidl
package aidl;
//需要自己添加import声明
import aidl.Book;
// Declare any non-default types here with import statements
interface IBookManager {
//注意:需要填写in out inout 参数的类型
void addBook(in Book book);
List getBook();
}

IBookManager.aidl

步骤5、创建Service,并实现Binder(IBookManager)

public class BookManagerService extends Service{
private static final String TAG = "BookManagerService";
private List<Book> mBookItems; @Override
public void onCreate() {
super.onCreate();
mBookItems = new ArrayList<>();
} @Nullable
@Override
public IBinder onBind(Intent intent) {
return new IBookManager.Stub(){
@Override
public void addBook(Book book) throws RemoteException {
mBookItems.add(book);
Log.d(TAG,book+" ");
} @Override
public List getBook() throws RemoteException {
return mBookItems;
}
};
}
}

BookManagerService

步骤6、测试,Binder死亡时候重新创建的使用

public class MainActivity extends AppCompatActivity {
private IBookManager manager;
private ServiceConnection connection;
//当Binder被以外终止的时候调用
private IBinder.DeathRecipient deathRecipient = new IBinder.DeathRecipient() {
@Override
public void binderDied() {
if (manager != null){
manager.asBinder().unlinkToDeath(deathRecipient,0);
manager = null;
}
//接下来重新binderService
createService();
Intent intent = new Intent(MainActivity.this, BookManagerService.class);
bindService(intent,connection, Service.BIND_AUTO_CREATE);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
createService();
} private void createService() {
connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
manager = IBookManager.Stub.asInterface(service);
Book book = new Book("asd","zxc","qweqw");
try {
manager.addBook(book);
} catch (RemoteException e) {
e.printStackTrace();
}
try {
//绑定死亡接口
service.linkToDeath(deathRecipient, 0);
} catch (RemoteException e) {
e.printStackTrace();
}
} @Override
public void onServiceDisconnected(ComponentName name) {
//以外终止时候调用
}
};
} public void launchSecondActivity(View view){
Intent intent = new Intent(this, BookManagerService.class);
bindService(intent,connection, Service.BIND_AUTO_CREATE);
}
}

MainActivity

第二章——第二节 IPC机制的概述和使用的更多相关文章

  1. Ionic 入门与实战之第二章第二节:Ionic 环境搭建之 Ionic Lab 使用

    原文发表于我的技术博客 本文是「Ionic 入门与实战」系列连载的第二章第二节,主要对 Ionic Lab 工具作了介绍,并讲解了其使用方法,这也是一个开发 Ionic 比较好的调试工具. 原文发表于 ...

  2. Ionic 入门与实战之第二章第一节:Ionic 环境搭建之开发环境配置

    原文发表于我的技术博客 本文是「Ionic 入门与实战」系列连载的第二章第一节,主要对 Ionic 的开发环境配置做了简要的介绍,本文介绍的开发环境为 Mac 系统,Windows 系统基本类似,少许 ...

  3. Anciroid的IPC机制-Binder概述

    在Linux系统中,是以进程为单位分配和管理资源的.出于保护机制,一个进程不能直接访问另一个进程的资源,也就是说,进程之间互相封闭.但是,在一个复杂的应用系统中,通常会使用多个相关的进程来共同完成一项 ...

  4. (第二章第二部分)TensorFlow框架之读取图片数据

    系列博客链接: (第二章第一部分)TensorFlow框架之文件读取流程:https://www.cnblogs.com/kongweisi/p/11050302.html 本文概述: 目标 说明图片 ...

  5. 第二章:Posix IPC

    2.1:概述 以下三种类型的IPC合称为“Posix IPC”: Posix消息队列 Posix信号量 Posix共享内存区 Posix IPC在访问它们的函数和描述它们的信息上有一些类似点.本章讲述 ...

  6. tensorflow2.0学习笔记第二章第二节

    2.2复杂度和学习率 指数衰减学习率可以先用较大的学习率,快速得到较优解,然后逐步减少学习率,使得模型在训练后期稳定指数衰减学习率 = 初始学习率 * 学习率衰减率^(当前轮数/多少轮衰减一次) 空间 ...

  7. tensorflow2.0学习笔记第二章第一节

    2.1预备知识 # 条件判断tf.where(条件语句,真返回A,假返回B) import tensorflow as tf a = tf.constant([1,2,3,1,1]) b = tf.c ...

  8. 第二章 第二个spring-boot程序

    上一节的代码是spring-boot的入门程序,也是官方文档上的一个程序.这一节会引入spring-boot官方文档推荐的方式来开发代码,并引入我们在spring开发中service层等的调用. 1. ...

  9. 第二章 第二个spring-boot程序(转载)

    本编博客转发自:http://www.cnblogs.com/java-zhao/p/5336369.html 上一节的代码是spring-boot的入门程序,也是官方文档上的一个程序.这一节会引入s ...

随机推荐

  1. 安装python3.4

    1.http://www.python.org下载适合自己机型的镜像文件 2.一路“next”到底,安装python到C盘上 3.计算机-属性-高级系统设置-环境变量,将刚刚安装的python路径添加 ...

  2. github在eclipse中的配置

    http://www.cnblogs.com/yejiurui/archive/2013/07/29/3223153.html http://blog.csdn.net/shehun1/article ...

  3. C++指针初始化总结

    1.字符指针的初始化 在c语言中 "string"保存的就是首个字符所在的地址  所以可以把 字符串常量"string" 赋值给指针 char *p;  &qu ...

  4. java 实现排序

    package com.cjs.sort; /** * 此类用来提供针对整数的各种排序算法 * * @author S * @version 1.0 */ public class MySort { ...

  5. 基于Android的物理类游戏,源代码(JAVA)分享

    游戏视频DEMO:http://v.youku.com/v_show/id_XNTM5MzM1Mzg0.html?from=s1.8-1-1.2 说明:一个自己做的Android上的物理类游戏,物理引 ...

  6. poj 2288 Islands and Bridges_状态压缩dp_哈密尔顿回路问题

    题目链接 题目描述:哈密尔顿路问题.n个点,每一个点有权值,设哈密尔顿路为 C1C2...Cn,Ci的权值为Vi,一条哈密尔顿路的值分为三部分计算: 1.每一个点的权值之和 2.对于图中的每一条CiC ...

  7. 线段树(build,insert,dfs操作)

    模板原型: 解决零散数点在已知线段上的出现次数.思想是将线段用长线覆盖,将长线转化成线段树.用权值记录各个数点出现的次数,最后进行查询.代码解释见注释. #include <bits/stdc+ ...

  8. 绩效等级系统与MBO

    1. 目标管理(MBO)在一定时期内(一般为一年)组织活动的期望成果,是组织使命在一定时期内的具体化,是衡量组织活动有效性的标准.由于组织活动个体活动的有机叠加,因此只有各个员工.各个部门的工作对组织 ...

  9. VPN拨号后使用本地网络上网

    网络环境大概是这样了:我在家里用ADSL上网,通过VPN连接到公司的服务器.但是连接VPN后,只能登录到公司的服务器,与INTERNET就断开了,QQ.网页都断开了.公司的服务器应该是连网的,可能被限 ...

  10. hdu 2846

    字典树的变形,常规字典树用来求前缀的,所以把每个单词拆成len个词建树,为了避免abab这样的查ab时会出现两次,每次加一个标记,如果该节点上次的建树的单词与本次相同就不更新,否则更新 #includ ...