美文网首页
8Activity间传递数据

8Activity间传递数据

作者: 水固态中 | 来源:发表于2018-01-28 00:00 被阅读0次

    Activity之间传递数据一般通过以下几种方式实现:

    1. 通过intent传递数据
    2. 通过Application
    3. 使用单例
    4. 静态成员变量。(可以考虑 WeakReferences)
    5. 持久化(sqlite、share preference、file等)

    一、通过intent传递数据

    1. 直接传递,intent.putExtra(key, value)
    2. 通过bundle,intent.putExtras(bundle);

    注意:

    1. 这两种都要求传递的对象必须可序列化(Parcelable、Serializable)
    2. 通过intent传递数据是有大小限制滴,超过限制,要么抛异常,要么新的Activity启动失败,如果传递图片要转换成byte[ ]。

    实例

    类实现Serializable接口

    public class NewsBean implements Serializable
        {
    

    第一个activity

    NewsResultBean.NewsBean newsBean=newsBeanList.get(position);
    Intent intent=newIntent(ActivityNewsList.this,ActivityNewsArticle.class);
    Bundle bundle=new Bundle();
    bundle.putSerializable("newsBean",newsBean);
    //将数据放进其intent中
    intent.putExtras(bundle);
    startActivity(intent);
    

    接收数据

    Intent intent=getIntent();
    Bundle bundle=intent.getExtras();
    NewsResultBean.NewsBean newsBean=(NewsResultBean.NewsBean) bundle.getSerializable("newsBean");
    

    二、Application

    有时候,两个页面之间没有跳转关系,但是这两页面之间却需要传递一些数据,甚至说某个页面获得的数据要被之后的很多页面拿来使用,这个时候就需要applicaiton。
    application是与应用程序的生命周期一致的,即只要应用程序不关掉,他就会存活。只有应用程序退出了它才会给销毁。
    但是需要注意的是:
    当由于某些原因(比如系统内存不足),我们的app会被系统强制杀死,此时再次点击进入应用时,系统会直接进入被杀死前的那个界面,制造一种从来没有被杀死的假象。那么问题来了,系统强制停止了应用,进程死了,那么再次启动时Application自然新的,那里边的数据自然木有啦,如果直接使用很可能报空指针或者其他错误。
    因此还是要考虑好这种情况的:

    1. 使用时一定要做好非空判断
    2. 如果数据为空,可以考虑逻辑上让应用直接返回到最初的activity,比如用 FLAG_ACTIVITY_CLEAR_TASK 或者 BroadcastReceiver 杀掉其他的activity。

    创建application子类

    public class MyApplication extends Application {
        private String str;
        private int myInt;
        
        public String getStr() {
            return str;
        }
        public void setStr(String str) {
            this.str = str;
        }
    }
    

    设置数据

    //返回当前activity的applicaiton对象
    mapp=(MyApplication) getApplication();
    mapp.setStr("张三");
    

    获得数据

    mapp=(MyApplication) getApplication();
    String str=mapp.getStr();
    

    三、使用单例

    public class DataHolder {
      private String data;
      public String getData() {return data;}
      public void setData(String data) {this.data = data;}
      private static final DataHolder holder = new DataHolder();
      public static DataHolder getInstance() {return holder;}
    }
    

    设置数据

    DataHolder.getInstance().setData(data);
    

    获得数据

    String data = DataHolder.getInstance().getData();
    

    五、持久化数据

    那就是sqlite、share preference、file等了。
    优点:
    (1)应用中所有地方都可以访问
    (2)即使应用被强杀也不是问题了
    缺点:
    (1)操作麻烦
    (2)效率低下
    (3)io读写嘛,其实还是比较容易出错的

    相关文章

      网友评论

          本文标题:8Activity间传递数据

          本文链接:https://www.haomeiwen.com/subject/nfaoaxtx.html