Android_聊一聊Activity(一)

来源:互联网 发布:淘宝买家改评价怎么改 编辑:程序博客网 时间:2024/06/05 13:28

activity是Android四大组件之一,其在应用中的表现就是一个界面,加载各式各样的UI布局展示给用户。用户还可以在各个activity中进行跳转,这就构成了某些特定的操作流程。应用启动时会加载一个默认的activity,类似于main()函数作为APP的入口。我们需要在清单文件AndroidManifest.xml中声明:

<intent-filter>    <action android:name="android.intent.action.MAIN" />    <category android:name="android.intent.category.LAUNCHER" /></intent-filter>

1. activity的生命周期

onCreate()
它会在activity第一次被创建时调用,此时activity是不可见的,我们通常在此过程设置布局,控件监听等操作;

onStart()
它在onCreate()函数之后调用,此时activity仍为不可见状态。

onResume()
这个函数是在activity由不可见变为可见时调用,执行完此函数后activity会请求AMS渲染它管理的视图,此时的activity一定在栈顶且处于运行状态。

onPause()
函数在系统准备启动或者恢复另一个activity时调用,也就是activity即将从可见变为不可见,通常在此函数做CPU内存释放、保存一些关键数据的操作。

onStop()
这个函数在activity完全不可见时调用,它和onPause()函数的区别在于,当新启动的activity是一个对话框式的activity时,onPause()会被执行,而onStop()则不会执行。

onDestroy()
这个函数在activity被销毁之前调用,函数执行后activity处于销毁状态。

onRestart()
这个函数在activity由停止状态变为运行状态之前调用,activity被重新启动了。

其生命周期参见官方示意图
这里写图片描述

2. android:configChanges属性

当设备的某些属性发生变化时可能会影响activity的生命周期,比如在横竖屏切换的过程中activity会经历一个销毁重建的过程。android:configChanges属性可设置多个值用’|’隔开,它不会让activity重置而是调用onConfigurationChanged()函数。
“mcc“ 移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。
“mnc“ 移动网号,在一个国家或者地区中,用于区分手机用户的服务商。
“locale“ 所在地区发生变化。
“touchscreen“ 触摸屏已经改变。(这不应该常发生。)
“keyboard“ 键盘模式发生变化,例如:用户接入外部键盘输入。
“keyboardHidden“ 用户打开手机硬件键盘
“navigation“ 导航型发生了变化。(这不应该常发生。)
“orientation“ 设备旋转,横向显示和竖向显示模式切换。
“fontScale“ 全局字体大小缩放发生改变
对android:configChanges属性,一般认为有以下几点:
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
但是,自从Android 3.2(API 13),在设置Activity的android:configChanges=”orientation|keyboardHidden”后,还是一样会重新调用各个生命周期的。因为screen size也开始跟着设备的横竖切换而改变。所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置”orientation”,你还必须设置”ScreenSize”。
解决方法:
AndroidManifest.xml中设置android:configChanges=”orientation|screenSize“

3. activity的启动模式

每个APP都是由若干个activity组成,Android内部用栈来管理activity,栈是一种后进先出的集合,对Android来说,当前显示的activity处于栈的栈顶,在我们按下后退键时栈顶的该activity出栈,原来栈顶下的activity变为新的栈顶显示到设备上。
有些时候,我们因为各种原因需要限制activity在栈中出现的次数及规则,Android系统提供了activity的4种启动模式。standard、singleTop、singleTask、singleInstance。

1.在AndroidManifest.xml清单文件中声明activity时在标签launchMode中声明启动方式。

<activityandroid:name=".MyActivity"android:launchMode=" singleTask"android:label="@string/app_name" ></activity>

2.通过设置Intent的Flag模式
Activity中的Flags。
FLAG_ACTIVITY_NEW_TASK对应singleTask
FLAG_ACTIVITY_SINGLE_TOP对应singleTop
FLAG_ACTIVITY_CLEAR_TOP,它启动时,在同一栈中所有位于它上面的activity全部出栈
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,具有这个标记为的activity不会出现在activity的历史列表中。

Intent mIntent =new Intent(MainActivity.this,MainActivity.class);                mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(mIntent);

standard(标准启动模式)
这是activity启动的标准模式,也是默认的启动模式。该模式下activity可以被多次实例化,不论当前activity处在栈的哪一位值,启动activity都会被重新实例化。

singleTop(栈顶单一模式)
如果该模式下的activity已经处在栈顶,这时在启动该activity不会创建新的实例,而是会重用栈顶的activity并调用该实例的onNewIntent()函数将Intent对象传递到该实例中。
如果该模式下的activity不在栈顶,它的启动处理方式和standard模式相同。

singleTask(全栈单一模式)
此模式下栈中只允许一个activity实例。
如果栈中不存在该activity时,会创建一个实例并将该activity置于栈顶。
如果栈中已存在该activity时,不会再创建新的实例,会将该activity之上的所有栈出栈,将该activity置于栈顶的位置,同时调用onNewIntent()函数将Intent对象传递到该实例中。

singleInstance(全局单一模式)
设置了该模式的activity会开辟另一个栈用来管理该activity,如果它被再次启动时不会创建新的实例而是重用新栈中的该实例,同时调用onNewIntent()函数传递Intent对象。
singleTask表明在此应用栈中只存在一个实例,singleInstance系统中只会存在一个实例。

4.Intent在activity间传递数据

Intent传递一般数据

1.在activity中发送数据

Intent  intent = new Intent(MainActivity.this,SecondActivity.class);Bundle bundle = new Bundle();bundle.putString("name","戚东亮");bundle.putInt("age",25);intent.putExtras(bundle);startActivity(intent);

2.在activity中接收数据

Intent intent = getIntent();bundle = intent.getExtras();String mName = bundle.getString("name");int mAge = bundle.getInt("age");Log.d(TAG, "姓名:"+mName+",年龄:"+mAge);

Intent传递JavaBean,实现Serializable接口

public class Person implements Serializable{    private static final long serialVersionUID = 1L;    private int age;    private String name;    public int getAge(){        return age;    }    public void setAge(int age){        this.age = age;    }    public String getName(){        return name;    }    public void setName(String name){        this.name = name;    }    @Override    public String toString(){        return "Person{" +"age=" + age + ", name='" + name + '\'' + '}';    }}

在activity中发送数据

Person person= new Person();person.setName("戚东亮");person.setAge(25);Intent  intent = new Intent(MainActivity.this,SecondActivity.class);intent.putExtra("person",person);startActivity(intent);

在activity中接收数据

Intent intent = getIntent();Person mPerson = (Person)intent.getSerializableExtra("person");Log.d(TAG, mPerson.toString());

Intent传递JavaBean,实现Parcelable接口

public class User  implements Parcelable{    private int age;    private String name;    public User(){    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public int describeContents() {        return 0;    }    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeInt(this.age);        dest.writeString(this.name);    }    protected User(Parcel in) {        this.age = in.readInt();        this.name = in.readString();    }    public static final Creator<User> CREATOR = new Creator<User>(){        @Override        public User createFromParcel(Parcel source){            return new User(source);        }        @Override        public User[] newArray(int size) {            return new User[size];        }    };    @Override    public String toString(){        return "User{" + "age=" + age + ", name='" + name + '\'' + '}';    }}

在activity中发送数据

User user = new User();user.setAge(25);user.setName("戚东亮");Intent  intent = new Intent(MainActivity.this,SecondActivity.class);intent.putExtra("user",user);startActivity(intent);

在activity中接收数据

Intent intent = getIntent();User mUser = (User) intent.getParcelableExtra("user");Log.d(TAG, mUser.toString());

Intent传递集合
在原Activity发送数据

ArrayList<Person> personArrayList = new ArrayList<Person>();Person Aperson= new Person();Aperson.setName("周建");Aperson.setAge(25);personArrayList.add(Aperson);Person Bperson= new Person();Bperson.setName("zhoujian");Bperson.setAge(28);personArrayList.add(Bperson);Intent  intent = new Intent(MainActivity.this,SecondActivity.class);intent.putExtra("personArrayList",(Serializable)personArrayList);startActivity(intent);

在目标Activity接受数据

Intent intent = getIntent();ArrayList<Person> mList = (ArrayList<Person>) intent.getSerializableExtra("personArrayList");Log.d(TAG, mList.toString());

onActivityResult

private void clickEvent() {        mButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent intent = new Intent(MainActivity.this, SecondActivity.class);                //requestCode                startActivityForResult(intent, INTENT_FLAG);            }        });    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        if (resultCode == RESULT_OK)        {            switch (requestCode)            {                case INTENT_FLAG:                    String result = data.getStringExtra("msg");                    Toast.makeText(this, result, Toast.LENGTH_SHORT).show();                    break;            }        }    }
private void clickEvent() {        mBtBack.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent intent = new  Intent();                intent.putExtra("msg","我来自第二个界面");                setResult(RESULT_OK,intent);                finish();            }        });    }
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 饥荒海难狗来了怎么办 饥荒海难拖网掉水里了怎么办 饥荒遇到了猪人怎么办 饥荒龙蝇赖在家不走怎么办 饥荒海难崩档了怎么办 gta5全是rpf文件怎么办 饥荒没有海象人营地怎么办 饥荒海滩猎犬来了怎么办 宝宝换牙门牙上长颗尖牙怎么办 肉卡在牙缝里怎么办 电脑做系统卡死怎么办 苹果6升级太卡怎么办 电脑玩不了联机饥荒怎么办 饥荒渡渡鸟死了一只怎么办 饥荒电脑联机植物生病怎么办 开车蹭到别人车怎么办 立定跳不会收腹怎么办 1岁宝宝有蛔虫怎么办 手机屏幕总是有网页跳出来怎么办 cs游戏屏幕变成正方形怎么办 大王卡被收回了怎么办 模拟人生4小人生病了怎么办 创造与魔法死后怎么办? 脚不小心扭伤了该怎么办 小鸡脚扭伤了该怎么办 跳高比赛最终成绩相等怎么办 热车1200怠速降不下来怎么办 大腿根骨髓水肿越来越疼怎么办 倒库方向打晚了怎么办 签吻芳颜祛斑液脸脱皮怎么办 3d右边工具栏消失了怎么办 3d菜单栏消失了怎么办 觉得自己性无能不敢谈对象怎么办 护士面试时被问到病人坠床怎么办 三次元仪器坏了怎么办 运动同手同脚怎么办 狗狗突然害怕不敢走路怎么办 一岁半宝宝因为害怕不敢走路怎么办 猫把背拱起来怎么办 穿猫跟鞋走路不稳怎么办 狗狗后腿内八字怎么办