版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38703938/article/details/84793751
参考博客:https://blog.csdn.net/u014005316/article/details/53378531
文件共享介绍
这种实现方式是多个进程通过读写来实现通信的,因为Android是基于Linux系统的,并发读/写是可行的,甚至可以多进程同时对同一个文件进行读写,尽管这可能出现问题。这里还要注意一个特例,也就是SharePreferences也是属于文件的一种,但多进程中一般不使用这种方式,这种会丢失数据、数据损坏等未知错误,具体这些后面总结ipc在Android中的实现方式时说明。
案例解析
这里自己写的一个案例,与参考博客最大的区别在于我使用的机器是6.0以上,涉及动态权限的问题(需要额外注意一下)
MainActivity代码:
package learn.yfg.com.ipctest;
import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Message;
import android.os.Messenger;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import learn.yfg.com.ipctest.untils.MyConstants;
import learn.yfg.com.ipctest.untils.MyUtils;
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static final String TAG = "MainActivity";
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
persistToFile();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
checkPermission();
}
@Override
protected void onResume() {
super.onResume();
}
private void persistToFile() {
new Thread(new Runnable() {
@Override
public void run() {
User1 user = new User1(1, "hello world", false);
File dir = new File(MyConstants.CHAPTER_2_PATH);
if (!dir.exists()) {
dir.mkdirs();
}
File cachedFile = new File(MyConstants.CACHE_FILE_PATH);
ObjectOutputStream objectOutputStream = null;
try {
objectOutputStream = new ObjectOutputStream(
new FileOutputStream(cachedFile));
objectOutputStream.writeObject(user);
Log.d("fff", "persist user:" + user);
} catch (IOException e) {
e.printStackTrace();
} finally {
MyUtils.close(objectOutputStream);
}
}
}).start();
}
private void checkPermission() {
//检查权限(NEED_PERMISSION)是否被授权 PackageManager.PERMISSION_GRANTED表示同意授权
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
//用户已经拒绝过一次,再次弹出权限申请对话框需要给用户一个解释
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission
.WRITE_EXTERNAL_STORAGE)) {
Toast.makeText(this, "请开通相关权限,否则无法正常使用本应用!", Toast.LENGTH_SHORT).show();
}
//申请权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_EXTERNAL_STORAGE);
} else {
Toast.makeText(this, "授权成功!", Toast.LENGTH_SHORT).show();
Log.e(TAG, "checkPermission: 已经授权!");
}
}
}
SecondActivity代码:
package learn.yfg.com.ipctest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import learn.yfg.com.ipctest.untils.MyConstants;
import learn.yfg.com.ipctest.untils.MyUtils;
public class SecondActivity extends AppCompatActivity {
private static final String TAG ="SecondActivity" ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
recoverFromFile();
String s = getIntent().getStringExtra("ggg");
Log.d("fff", "qqq");
}
@Override
protected void onResume() {
super.onResume();
}
private void recoverFromFile() {
new Thread(new Runnable() {
@Override
public void run() {
User1 user = null;
File cachedFile = new File(MyConstants.CACHE_FILE_PATH);
if (cachedFile.exists()) {
ObjectInputStream objectInputStream = null;
try {
objectInputStream = new ObjectInputStream(
new FileInputStream(cachedFile));
user = (User1) objectInputStream.readObject();
Log.d("fff", "recover user:" + user);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
MyUtils.close(objectInputStream);
}
}
}
}).start();
}
}
以上为核心代码,需要注意的:
1.首先需要开启多线程,Mainactivity和SecondActivity属于两个线程。
2.User1这个实体类需要序列化
3.里面涉及的两个静态常量:
public static final String CHAPTER_2_PATH = Environment .getExternalStorageDirectory().getAbsolutePath() + "/cache/"; public static final String CACHE_FILE_PATH = CHAPTER_2_PATH + ".person.txt";
4.里面涉及的close方法:
public static void close(Closeable closeable) {
try {
if (closeable != null) {
closeable.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
根据上面代码和说明应该很容易实现ipc,最后可通过log观看结果