简单的分析了一下需求,项目中一共两个Activity,其中第一个Activity里面有一个按钮,当点击按钮的时候,跳转到第二个Activity中,并且跳转之前要往文件里面写入数据。
通过文件流的方式来得到具体的数据
第一步,建立两个Activity,并且运行在不同的进程中,所以这里面我们在第二个Activity中声明了第二个进程:
<activity android:name=".SecondActivity" android:process=":second"></activity>
这里面直接用process的关键字声明了有第二个进程。
我们在建立一个实体类的对象,这个对象是我们用来传递数据的,这里面又一个坑,就是这个实体类必须实现包裹化,否则,会爆出以下的异常
java.io.WriteAbortedException: Read an exception; java.io.NotSerializableException: yjc.com.filejinchng.Person
这里面提示我们数据没有序列化,虽然我也不知道为什么要序列化,,尴尬了,,照做就是了,给她个序列化
public class Person implements Serializable { private String name; private int age; @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
可以看到这里面我有复习了toString的方法,这样复写了之后,就不会调用父类的方法了,直接就把字符串打印了出来的
然后在第一个Activity中的将一个对象写入数据流中,如下面所示
public class MainActivity extends AppCompatActivity { private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button= (Button) findViewById(R.id.button1); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(MainActivity.this,SecondActivity.class); try { FileOutputStream person = openFileOutput("person", MODE_PRIVATE); ObjectOutputStream objectOutputStream=new ObjectOutputStream(person); Person person1=new Person(); person1.setName("fff"); person1.setAge(11); objectOutputStream.writeObject(person1); objectOutputStream.flush(); objectOutputStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } startActivity(intent); } }); } }这里是发送数据的一方,这里面通过onpenFileOutput的方法打开了一个输出流,并在这个输出流里面写入了数据的名字和访问数据的权限,这里面数据的访问的权限是私有的
然后通过开启ObjectOutPutStream这个方法将数据流写入了,然后新建立一个对象,将这个对象放入流中。发送出去
最后在接受的地方,也需要相同的步骤,只是这个步骤不是FileOutPutStream了是FileInPutStream流,如下面所示:
public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { setContentView(R.layout.second); super.onCreate(savedInstanceState); try { FileInputStream person = openFileInput("person"); ObjectInputStream objectInputStream=new ObjectInputStream(person); Object o = objectInputStream.readObject(); objectInputStream.close(); Log.d("SecondActivity", "o:" + o); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }这样就实现了文件的通讯的方式了。