• Android笔记(五十八)Android总结:四大组件——Activity篇


    什么是Activity

           Activity是一种包含用户界面的组件,主要用于和用户进行交互,一个APP通常由多个Activity组成。

           每个Activity都对应一个布局文件,通过setContentView()方法来载入布局文件。并且通过用户对布局文件中的组件所发出的事件来做出相应的反映。

    Activity的四种状态

                  1)激活状态,此时activity运行在屏幕前台

                  2)暂停状态,此时activity失去焦点,但是用户仍然可以看到(例如这个activity上遮盖了一个透明的或者非全屏的activity)

                  3)停止状态,此时activity被其他activity完全覆盖

                  4)销毁状态,此时activity将会被系统清理出内存

    Activity的回调方法

                  onCreate()                     创建,activity初次创建时被调用,该方法中一般进行一些静态设置。

                  onStart()                        运行,activity对用户即将可见的时候调用

                  onResume()    获取焦点,当activity将要与用户进行交互时候调用

                  onPause()                      失去焦点,当系统要启动一个其他的activity时调用(在其他activity显示之前调用)

                  onStop()                         暂停,当另外一个activity恢复并遮盖当前activity,导致其对用户不可见时调用。

                  onDestroy()    销毁,在activity被销毁前所调用的最后一个方法

                  onRestart()      重新启动

                  这七个方法贯穿整个Activity的生命周期。

    Activity的生命周期

                  activity的生命周期可以根据不同的标准分为完整生命周期、可见生命周期和前台生命周期。

                  完整生命周期:onCreate()创建→onStrart()启动→onResume()获取焦点→onPause()失去焦点→onStop()暂停→onDestroy()销毁

                  可见生命周期: onStrart()启动→onResume()获取焦点→onPause()失去焦点→onStop()暂停

                  前台生命周期: onResume()获取焦点→onPause()失去焦点

    Activity的启动模式

                  Activity有四种启动模式:standardsingleTopsingleTasksingleInstance

                  standard默认启动方式,每开启一个新的activity,就在返回栈的顶端添加一个新的Activity实例,退出时依次退出。

                  singleTop在启动的时候,如果发现栈顶上是要启动的Activity,则系统不在创建新的Activity。

                  singleTask在启动的时候,会扫描整个返回栈,如果发现栈中有要启动的Activity,则把这个Activity上所有的Activity统统出栈。

                  singleInstance有一个单独的栈来管理这个Activity,不管哪个程序访问这个Activity,都会共同使用这个栈。

    Activity值传递

    传递值

                  使用putExtra()方法传递数据,该方法的第一个参数是键,第二个参数是要传递的数据,接收的Activity通过一系列getXXXExtra()方法将值取出使用。

    传递对象

                  intent可以传递Serializable或者Parcelable对象,要传递的对象实现Serializable或者Parcelable接口,就可以将对象传入到一个Bundle中,然后使用intent的putExtra()方法将对象传递过去,接收的Activity通过getSerializableExtra或者getParcelableExtra方法获得对象。

    MainActivity.java

    package cn.lixyz.activitydemo;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
    
        private Button to_activity_button;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            to_activity_button = (Button) findViewById(R.id.to_activity_button);
            to_activity_button.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    Student student = new Student();
                    student.setId(10);
                    student.setName("韩梅梅");
    
                    Teacher teacher = new Teacher();
                    teacher.setId(101);
                    teacher.setName("王老师");
    
                    intent.putExtra("studentBundle", teacher);
                    intent.putExtra("teacherBundle", student);
    
                    startActivity(intent);
    
                }
            });
        }
    }
    View Code

    SecondActivity.java

    package cn.lixyz.activitydemo;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.TextView;
    
    public class SecondActivity extends Activity {
    
        private TextView text;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
    
            Intent intent = getIntent();
            Teacher teacher = (Teacher) intent.getSerializableExtra("studentBundle");
            Student student = intent.getParcelableExtra("teacherBundle");
    
            Log.d("TTTT", "老师:id=" + teacher.getId() + ",name=" + teacher.getName());
            Log.d("TTTT", "学生:id=" + student.getId() + ",name=" + student.getName());
    
        }
    
    }
    View Code

    Teacher.java

    package cn.lixyz.activitydemo;
    
    import java.io.Serializable;
    
    public class Teacher implements Serializable {
        private int id;
        private String name;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    }
    View Code

    Student.java

    package cn.lixyz.activitydemo;
    
    import android.os.Parcel;
    import android.os.Parcelable;
    
    public class Student implements Parcelable {
    
        private int id;
        private String name;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public static final Parcelable.Creator<Student> CREATOR = new Creator<Student>() {
    
            public Student createFromParcel(Parcel source) {
                // TODO Auto-generated method stub
                Student stu = new Student();
                stu.name = source.readString();
                stu.id = source.readInt();
                return stu;
            }
    
            public Student[] newArray(int size) {
                // TODO Auto-generated method stub
                return new Student[size];
            }
    
        };
    
        @Override
        public int describeContents() {
            // TODO Auto-generated method stub
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            // TODO Auto-generated method stub
            dest.writeString(name);
            dest.writeInt(id);
        }
    
    }
    View Code

      运行结果:

    传递值给上一个activity

           可以使用startActivityForResutlt()方法来启动另一个activity,而在另外一个activity中,新建一个Intent将要传递的值使用putExtra方法存放到intent中,并且setResult为RESULT_OK,这样,在第一个activity的onActivityResult方法中就可以获取到返回来的值了。

    MainActivity.java

    package cn.lixyz.activitydemo;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
    
        private Button to_activity_button;
        public static final int RESULT_CODE = 1;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            to_activity_button = (Button) findViewById(R.id.to_activity_button);
            to_activity_button.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    Student student = new Student();
                    student.setId(10);
                    student.setName("韩梅梅");
    
                    Teacher teacher = new Teacher();
                    teacher.setId(101);
                    teacher.setName("王老师");
    
                    intent.putExtra("studentBundle", teacher);
                    intent.putExtra("teacherBundle", student);
    
                    // startActivityForResult(intent, RESULT_CODE);
                    startActivity(intent);
                }
            });
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            // TODO Auto-generated method stub
            super.onActivityResult(requestCode, resultCode, data);
            Log.d("TTTT", "onActivityResult方法运行了");
            if (resultCode == -1) {
                String resultData = data.getStringExtra("return_data");
                Log.d("TTTT", resultData);
            }
        }
    }
    View Code

    SecondActivity.java

    package cn.lixyz.activitydemo;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    public class SecondActivity extends Activity {
    
        private Button button;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
    
            button = (Button) findViewById(R.id.button);
    
            button.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent();
                    intent.putExtra("return_data", "HelloWorld");
                    setResult(RESULT_OK, intent);
                    finish();
                }
            });
    
        }
    
    }
    View Code

    当Activity被意外回收时,数据该怎么办?

           当一个Activity被pause或者stop的时候,这个Activity的对象实际上还是保存在内存中,因此这个Activity中的信息(成员和状态信息)还可以重新获取到. 

           如果系统为了整理内存而销毁了整个Activity对象时,系统没法简单的原封不动地恢复先前的Activity对象及其状态信息. 

           从android手册上来看,Activity中提供了一个方法:onSavedInstanceState(Bundle outState).当系统销毁一个Activity时,会将Activity的状态信息已键值对形式存放在bundle对象中. 

           第一次启动Activity时,这个bundle对象是空的,null.如果Activity被系统销毁了,然后用户要回退回去看的话,系统会调用这个 Activity的onCreate方法,并把bundle对象传递过去. 

           这个函数有默认的行为,因此就算你不覆盖它,它在Activity中也有实现. 

           这回我总算明白了为什么onCreate方法的定义是"protected void onCreate (Bundle savedInstanceState)"这个样子的了. 

           另外,刚才查看了一下Activity的源码,发现Activity还有个onRestoreInstanceState(Bundle outState)方法.这个方法的描述中也写到在Activity恢复先前保存的状态时会被调用.

    Activity转跳之显式Intent和隐式Intent

           显式Intent就是我们之前经常使用的直接指定转跳目标的形式,然后我们使用startActivity方法将intent传入就会转跳到我们向要的Activity中去

           隐式Intent并不明确的指定我们想要启动哪个Activity,而是指定了一些列的action和category等信息,然后让系统去分析这个intent并找到合适的activity进行转跳。

  • 相关阅读:
    ICMPv6 Type 和 rfc
    Redis学习
    Vue学习(一)
    《一线架构师实践指南》读后感(五)
    《一线架构师实践指南》读后感(四)
    Stream流
    泛型
    《架构漫谈》读后感
    《一线架构师实践指南》读后感(三)
    《一线架构师实践指南》读后感(二)
  • 原文地址:https://www.cnblogs.com/xs104/p/4963669.html
Copyright © 2020-2023  润新知