共享文件实现进程间通信其实就是两个进程通过读/写同一个文件来实现数据交换,本篇我们来用共享文件实现进程间通信
话不多说,直接上代码(以下代码是在我基础篇代码基础上添加了文件共享的内容)
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button button1=(Button)findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
}
});
WriteToFile();
}
public static final String CACHE_PATH = Environment.getExternalStorageDirectory() + "/IPCCache";
private void WriteToFile() {
final People people = new People("ipc");
final String fileName = "file.txt";
new Thread(new Runnable() {
@Override
public void run() {
File dir = new File(CACHE_PATH,fileName);
if (!dir.exists()) {
dir.mkdir();
}
File cacheFile = new File(CACHE_PATH);
ObjectOutputStream objectOutputStream = null;
try {
if(!cacheFile.exists())
cacheFile.createNewFile();
objectOutputStream = new ObjectOutputStream(new FileOutputStream(cacheFile));
objectOutputStream.writeObject(people);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Button button2 = (Button)findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(SecondActivity.this,ThirdActivity.class);
startActivity(intent);
}
});
readFromFile();
}
private void readFromFile() {
final String fileName = "file.txt";
new Thread(new Runnable() {
@Override
public void run() {
File cacheFile = new File(FirstActivity.CACHE_PATH);
if(!cacheFile.exists())
return;
ObjectInputStream objectInputStream = null;
try {
objectInputStream = new ObjectInputStream(new FileInputStream(cacheFile));
People people = (People) objectInputStream.readObject();
Log.d("MyActivity", "people is " + people.getName());
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
Log.d("MyActivity", "people not found ");
e.printStackTrace();
}
}
}).start();
}
}
别忘记在mainfest中添加读写和文件夹创建权限
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
我将上面的代码运行在Android4.4虚拟机上可以正常运行,在7.0以上的版本会报Permission denied的错误
下一篇 Messenger实现进程间通信
特别感谢《Android 开发艺术探索》