Android中跨进程通信方式之使用文件共享

一、使用Serializable序列化对象

import java.io.Serializable;

public class User implements Serializable{
    private static final long serialVersionUID  = 1L;
    private String username;
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

}

serialVersionUID是序列化对象时向文件写入的一个UID,其目地是为了反序列化恢复该对象时,防止增加或删除一些字段或者改动某个类型,导致类的版本不同,恢复错误。

序列化过程:

        User user = new User();
        user.setUsername("zhangsan");
        user.setPassword("123");
        ObjectOutputStream os = null;
        try {
            os = new ObjectOutputStream(new FileOutputStream(getFilesDir()+"cache.txt"));
            os.writeObject(user);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

反序列化恢复过程:

        ObjectInputStream is = null;
        try {
            is = new ObjectInputStream(new FileInputStream(getFilesDir()+"cache.txt"));
            User newUser = (User) is.readObject();
            tv.setText(newUser.getUsername());
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

二、使用Parcelable序列化对象

import android.os.Parcel;
import android.os.Parcelable;

public class Student implements Parcelable{
    private String username;
    private String password;
    public Student(){
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public int describeContents() {
        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(username);
        dest.writeString(password);
    }
    public static final Parcelable.Creator<Student> CREATOR = new Creator<Student>() {

        @Override
        public Student[] newArray(int size) {
            return new Student[size];
        }

        @Override
        public Student createFromParcel(Parcel source) {
            return new Student(source);
        }
    };
    private Student(Parcel source){
        username = source.readString();
        password = source.readString();
    }

}

writeToParcel方法将实现序列化,通过Parcel的write方法实现。CREATOR 实现反序列化,通过Parcel的read方法实现。

这样便可以通过Intent,bundle传递Parcelable对象了。

                Intent intent = new Intent();
                intent.setClass(MainActivity.this, SecondActivity.class);
                Bundle bundle = new Bundle();
                Student student = new Student();
                student.setUsername("lisi");
                student.setPassword("456");
                bundle.putParcelable("student", student);
                intent.putExtras(bundle);
                startActivity(intent);

Serializable需要大量的I/O操作,需要将序列化的对象存储在设备或者网络传输时适用。

Parcelable是安卓的序列化方式,使用比较麻烦,但效率高。

注意:当Parcelable对象中有对象时,这个对象必须是Parcelable或者Serializable类型的。

序列化方式如下:

//user为Serializable
private User user;
dest.writeSerializable(user);
user = (User) source.readSerializable();
//teacher为Parcelable
private Teacher teacher;
dest.writeParcelable(teacher, 0);
//传递当前线程的上下文类加载器
teacher = source.readParcelable(Thread.currentThread().getContextClassLoader());
时间: 2024-08-07 04:33:05

Android中跨进程通信方式之使用文件共享的相关文章

Android中跨进程通信方式之使用Messenger

服务端MessengerService的process属性指定它的进程跟MainActivity不在一个进程 <service android:name="com.example.activity.MessengerService" android:process="com.example.activity.remote" > </service> 在MessengerService创建一个Messenger,以它底层的binder作为绑定服

Android中跨进程通信传递Parcelable对象时出现android.os.BadParcelableException: ClassNotFoundException when unmarsh

转载请注明出处:http://blog.csdn.net/bettarwang/article/details/45315091 按Google开发文档的说法,在跨进程通信时,推荐使用MessengerService而不是AIDL,所以最近在实现一个跨进程的Service时就采用了MessengerService的方法. 然后定义了这样一个类: public class BleServiceBean implements Parcelable { private String name; pri

【转】android中跨进程通讯的4种方式

转自:http://www.androidsdn.com/article/show/137 由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于android系统中4种应用程序组件:Activity.Content Provider.Broadcast和Service. 其中Activity可以跨进程调用其他应用程序的Activity: Content Pro

【朝花夕拾】一篇文章搞懂Android跨进程通信

前言 只要是面试中高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Android开发高级工程师必须要跨过的一道坎.如果您还对这方面的知识还做不到如数家珍,那就和我一起来攻克它吧! 本文主要包含了如下内容: 其行文脉络大致如下,希望能加深读者对这方面内容的记忆:(1)Android基于Linux系统,所以先说系统进程相关知识和Linux IPC.(2)总结Android的IPC

【朝花夕拾】性能优化篇之(八)AIDL与Android跨进程通信

一.Linux进程间通信 1.进程隔离 在操作系统中,进程与进程间的内存和数据都是不共享的.两个进程就好像大海中相互独立的两个岛屿,各自生活在互相平行的两个世界中,互不干扰,各自为政.这样做的目的,是为了避免进程间相互操作数据的现象发生,从而引起各自的安全问题.为了实现进程隔离,采用了虚拟地址空间,两个进程各自的虚拟地址不同,从逻辑上来实现彼此间的隔离. 马克思主义哲学说,人是一切社会关系的总和.任何一个个体都不可能完全隔离于外界,都不可避免地与外界"互通有无".进程也一样,时不时需要

如何让你的APK跑在 com.android.phone 进程

首先:为什么要跑在 com.android.phone 进程 这还用问,在同一个进程里就可以干很多事情了这是黑客行为 为什么能跑在统一进程? Google 在设计 Dalivk 虚拟机的时候就考虑到了将多个 apk 放在同一个进程运行,但是实际中,我们每安装一个应用都是跑在独立进程,独立虚拟机,其实也可以将你开发的所有应用跑在统一进程,统一虚拟机的 跑在同一进程的条件 1.同一签名 2.UID相同 'android:sharedUserId="android.uid.phone"' 3

chromium for android GPU进程结构分析

GPU进程的客户端(Browser进程,Render进程)都会创建一个 WebGraphicsContext3DCommandBufferImpl的实例,用于封装与GPU进程的通信. 所以我们从WebGraphicsContext3DCommandBufferImpl开始引出GPU进程的结构. 一.WebGraphicsContext3DCommandBufferImpl的创建. WebGraphicsContext3D暴露的接口基本与OpenGL ES 2.0 API对应. WebGraphi

android中进程的优先级

android中进程的优先级

[Android Pro] android 杀死进程的方法

1: 杀死自己进程的方法 android.os.Process.killProcess(Process.myPid()); 2:杀死别人进程的方法(不能杀死自己) -------a: activityManager.killBackgroundProcesses ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); activityManager.killBa