zoukankan      html  css  js  c++  java
  • Android 全局获取 Context 与使用 Intent 传递对象

    =====================全局获取 Context========================

    Android 开发中很多地方需要用到 Context,比如弹出 Toast、启动活动、发送广播、操作数据库……

    由于很多操作都是在活动中进行的,而活动本身就是一个 Context 对象,所以获取 Context 并不是那么困难。

    但是,当应用程序的架构逐渐开始复杂起来的时候,很多的逻辑代码都将脱离 Activity 类,由此在某些情况下,获取 Context 并非那么容易。

    Android 提供了一个 Application 类,每当应用程序启动的时候,系统就会自动将这个类进行初始化。而我们可以定制一个自己的 Application 类,以便管理程序内一些全局的状态信息,比如说全局 Context。

    public class MyApplication extends Application {
        private static Context context;
    
        @Override
        public void onCreate() {
            super.onCreate();
            context =getApplicationContext();
        }
    
        public static Context getContext() {
            return context;
        }
    }

    这里我们重写了父类的 onCreate( )方法,并通过调用 getApplicationContext( )方法得到了一个应用程序级别的 Context,然后又提供了一个静态的 getContext( )方法,在这里将刚才获取到的 Context 进行返回。

    接下来需要告知系统,当程序启动的时候应该初始化 MyApplication 类,在 AndroidManifest 文件的<application>标签下进行指定就可以了。

    <application android:name="MyApplication">  ...  </application>

    这样就已经实现了一种全局获取 Context 的机制,之后不管你想在项目的任何地方使用 Context,只需要调用一下 MyApplication.getContext( )就可以了。

    Toast.makeText(MyApplication.getContext(),"全局Context获取成功",Toast.LENGTH_SHORT).show();

    =====================使用Intent传递对象=======================

    使用 Intent 来传递对象通常有两种实现方式,Serializable 和 Parcelable。

    Serializable方式:

      Serializable 是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可存储到本地。至于序列化的方法也很简单,只需要让一个类去实现 Serizable 这个接口就可以了。

    public class Festival implements Serializable {
        private String name;
        private String data;
        
        public Festival(String name,String data){
            this.name = name;
            this.data = data;
        }
    
        public String getName() {
            return name;
        }
    
        public String getData() {
            return data;
        }
    }

    这里让 Festival 类实现了 Serializable 接口,这样所有的 Festival 对象就都是可以序列化的了。

            Festival festival = new Festival("元旦节","1月1日");
            Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
            intent.putExtra("festival_object",festival);
            startActivity(intent);

    这里我们创建了一个 Festival 的实例,然后就直接将它传入到 putExtra( )方法中,通过 startActivity( )传递这个对象。

            Festival festival = (Festival)getIntent().getSerializableExtra("festival_object");

    这里调用了 getSerializableExtra( )方法来获取传递过来的序列化对象,接着再将它向下转型成 Festival 对象,这样就成功实现了使用 Intent 传递对象的功能了。

    Parcelable方式:

      Parcelable 方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是 Intent 所支持的数据类型,这样也就实现传递对象的功能了。

    public class Person implements Parcelable {
        
        private String name;
        private int age;
        
        //省略set和get方法
    
        protected Person(Parcel in) {
            name = in.readString();//读取name
            age = in.readInt();//读取age
        }
    
        public static final Creator<Person> CREATOR = new Creator<Person>() {
            @Override
            public Person createFromParcel(Parcel in) {
                return new Person(in);
            }
    
            @Override
            public Person[] newArray(int size) {
                return new Person[size];
            }
        };
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(name);//写出name
            dest.writeInt(age);//写入age
        }
    }

    首先让 Person 类实现 Parcelable 接口,这样就必须重写 describeContents( )和 writeToParcel( )这两个方法。其中describeContents( )方法直接返回 0 就可以了,而 writeToParcel( )方法中需要调用 Parcel 的 writeXxx( )方法将 Person 类中的字段一一写出。

    除此之外,还必须在 Person 类中提供一个名为 CREATOR 的常量,这里创建了 Parcelable.Creator 接口的一个实现,并将泛型指定为 Person。

    接着需要重写 createFromParcel( )和 newArray( )这两个方法,在 createFromParcel( )方法中去读取刚才写出的 name 和 age 字段,并创建一个 Person 对象进行返回,其中 name和age都是调用 Parcel 的 readXxx( )方法读取到的,注意这里的读取顺序一定要和写出顺序完全相同。而newArray()方法中只需要new出一个Person数组,并使用方法中传入的 size 作为数组大小就可以了。

            Person person = (Person)getIntent().getParcelableExtra("person_object");

    依然可以使用相同的代码来传递 Person 对象,只不过获取对象时调用的是 getParcelableExtra() 方法,其他地方完全相同。

    在传递对象时,Serializable 和 Parcelable 方法都是可行的,对比一下,Serializable 的方式较为简单,但由于会把整个对象进行序列化,因此效率方面会比 Parcelable方式低一些,根据情况需要合理运用这两种方式。

  • 相关阅读:
    P1121 环状最大两段子段和
    无题
    cdoj 1485 柱爷搞子串 sam treap
    自然数幂和
    Gym 100341C AVL Trees NTT
    线性筛分解质因子
    codeforces 366 Ant Man dp
    UVALive 6914 Maze Mayhem 轮廓线dp
    hdu 5790 Prefix 字典树 主席树
    莫比乌斯反演个人小结
  • 原文地址:https://www.cnblogs.com/woider/p/5350218.html
Copyright © 2011-2022 走看看