• Activity生命周期,Activity传值(Intent)


    生命周期: 从出生到死亡

    Activity生命周期的7个方法和3个循环

    onCreate() 创建时调用
    onRestart() 不可见到可见时调用
    onStart() 用户可见时调用
    onResume() 用户可交互时调用
    onPause() 用户不可交互时调用
    onStop() 用户不可见时调用
    onDestroy() 销毁时调用

    启动与退出的循环
    Activity启动 onCreate() -- onStart() -- onResume()
    Activity退出 onPause() -- onStop() -- onDestroy()

    可见与不可见的循环
    Activity不可见 onPause() -- onStop()
    Activity重新可见 onRestart() -- onStart() -- onResume()

    焦点失去与获得的循环
    Activity失去焦点 onPause()
    Activity获得焦点 onResume()

    -----------------------------------------
    Intent 在组件之间跳转的桥梁

    intent分为如下两类:
    明确的intent (显式的Intent)
    明确指定要跳转的Activity
    不明确的intent (隐式的Intent)
    没有直接指定要跳转哪个Activity 通过一系列过滤条件筛选要跳转的Activity


    1.1 明确intent跳转到相同包下的Activity
    intent.setClass()

    1.2 明确 intent跳转到不同包下的Activity
    intent.setClassName("应用程序的包名", "Activity的包名.Activity类名");
    特殊情况是:Activity的包名和应用程序的包名相同,则第二个参数可以简写为".Activity类名"

    1.3 明确intent跳转到不同应用下的Activity
    intent.setClassName("应用程序的包名", "Activity的包名.Activity类名");
    同时,被跳转的Activity需要添加action=MAIN的过滤器

    不明确的intent
    需要设置的过滤条件有7个:
    ComponentName --- 组件名称 用法基本上和setClassName()大同小异
    Action -- 动作
    Category -- 额外的动作
    Data -- 数据(格式为Uri对象)
    Extra -- 额外的数据
    Flag -- 标识
    Type -- 数据的类型(MIME) 多媒体格式的数据类型(文本、图片、音频、视频)

    2.1 不明确的intent跳转到相同包下的Activity
    跳转的Activity需要设置
    intent.setAction("com.second");
    同时被跳转的Activity需要在AndroidManifest.xml中设置intent过滤器:
    <intent-filter >
    <action android:name="com.second"/> --- 与跳转时set一致Action()的参数
    <category android:name="android.intent.category.DEFAULT"/> -- 不能省略
    </intent-filter>
    2.2 不明确的intent跳转到不同包下的Activity 方法同上
    2.3 不明确的intent跳转到不同应用下的Activiy 方法同上

    当SecondActivity需要回传参数时:
    1. MainActivity启动SecondActivity时需要调用startActivityForResult()
    并定义请求码
    2. SecondActivity在合适的使用调用setResult()设置返回码和返回的参数
    然后调用finish()结束当前Activity
    3. MainActivity需要重写onActivityResult()捕获SecondActivity返回的结果

    常用的返回码为:
    RESULT_OK 成功
    RESULT_CANCEL 失败
    RESULT_FIRST_USER 用户自定义的返回码
    RESULT_FIRST_USER + 1
    RESULT_FIRST_USER + 2
    ……

    Activity间传递参数的方法


    方法1. 通过putExtra()传递基本数据类型

    方法2. 通过putExtras()传递Bundle数据类型
    方法3. 通过Application读写全局变量

    方法4. 把基本的数据类型封装到一个对象中,然后通过intent传递该对象
    需要考虑对Person对象进行序列化

    Java中的序列化使用Serializable
    Android中的序列化使用Parcelable

    Serializable方式:

    这是一种最简单的方式,我们需要做的仅仅是对可序列化的类,实现Serializable方法即可。

    public class Person implements Serializable{
        private String mName;
        private String mAddress;
     
        public String getName() {
          return mName;
        }
     
        public void setName(String name) {
            mName = name;
        }
     
        public String getAddress() {
            return mAddress;
        }
     
        public void setAddress(String address) {
            mAddress = address;
        }
    }

    这个时候,就已经可以使用Intent 的putExtra() 方法传递这个自定义对象了,在Activity中这样使用。

    Person person = new Person();
    person.setName("Hwaphon");
    person.setAddress("Anhui");
     
    Intent intent = new Intent(MainActivity.this,SecondActivity.class);
    intent.putExtra("person",person);
    startActivity(intent);
    finish();

    接受数据。

    Intent intent = getIntent();
    Person person = (Person) intent.getSerializableExtra("person");

     可以看到 使用Serializable方法非常简单,但是Serializable会把整个对象序列化,开销非常大,为了追求效率,就不得不使用Parcelable方法了。

    Parcelable方式:

    用法如下:
    1. 需要对可序列化的类,实现Parcelable接口
    2. 实现Parcelable接口中的抽象方法
       describeContents() 该方法直接返回0


       writeToParcel(Parcel out, int flags) 把需要序列化的参数写入out中 比如:

    3.除了这两个方法以外,我们还需要创建一个 Parcelable.Creator接口的实现,这个接口中也需要我们实现两个方法

      createFromParcel(Parcel in) 用于将写入Parcel容器中的数据读出来,用读出来的数据实例化一个对象,并且返回。对in进行反序列化(需要通过Person的构造器实现)

      newArray(Parcel in) :创建一个长度为 size 的数组并且返回,一般而言,直接返回return T[size] 即可。反序列化多个元素时使用。

    public class Person implements Parcelable{
        private String mName;
        private String mAddress;
     
        public String getName() {
          return mName;
        }
     
        public void setName(String name) {
          mName = name;
        }
     
        public String getAddress() {
            return mAddress;
        }
     
        public void setAddress(String address) {
          mAddress = address;
        }
     
        @Override
        public int describeContents() {
          return 0;
        }
     
        @Override
        public void writeToParcel(Parcel parcel, int i) {
          parcel.writeString(mName);
          parcel.writeString(mAddress);
        }
     
      public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>(){
          @Override
            public Person createFromParcel(Parcel parcel) {
              Person person = new Person();
              person.mName = parcel.readString();
              person.mAddess = parcel.readString();
              return person;
          }
     
          @Override
          public Person[] newArray(int i) {
              return new Person[i];
          }
        };
    }

    这个时候的接收方法与Serializable有点不同,如下

    Intent intent = getIntent();
    Person person = (Person) intent.getParcelableExtra("person");

    writeToParcel()方法中,我们可以将我们想要的数据写入容器,如果是我们不需要的数据,那么我们可以放弃写入,这也是Parcelabel 方法比 Serializable方法高效的原因所在。但是,这种方法比Serializable 方法多了太多的实现代码了,有没有什么办法能改变这一现状呢?可以使用插件一键生成这些代码,比如说 Android Parcelable code generator 插件,可以直接在Android Studio Plugins去下载该插件,下载完之后 点击 Alt+Insert就可以看到Parcelable选项了。

    Intent传递对象、List对象:

    前提:对象实现Parcelable接口

    Activity A :

     intent = new Intent(v.getContext(),NoticeDetailsActivity.class);

    //传递对象

    bundle.putParcelable("notice", notice);

    //传递list,此次只能传ArrayList intent.putParcelableArrayListExtra(
    "noticeList", (ArrayList<? extends Parcelable>) noticeList); v.getContext().startActivity(intent);

    Activity B:

    Notice notice = intent.getParcelableExtra("notice");

    List<Notice> noticeList = intent.getParcelableArrayListExtra("noticeList");

    参考至:https://www.jb51.net/article/93762.htm



  • 相关阅读:
    在devc++中使用to_string
    死磕Spring之AOP篇
    死磕Spring之AOP篇
    service to hadoop01/hadoop01:8020 Datanode denied communication with namenode because the host is not in the include-list
    Hadoop和HBASE对应兼容版本
    Flink SQL CDC中如何定义watermark和计算列
    Scala函数详解
    HBase 底层原理详解
    流计算 Oceanus SQL 开发指南
    NLP(二十二):基于依存句法的关键词抽取算法
  • 原文地址:https://www.cnblogs.com/fangg/p/5572301.html
Copyright © 2020-2023  润新知