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(); } }); }
- Android_聊一聊Activity(一)
- Android_聊一聊Activity(二)
- android_多activity
- android_动画学习笔记(一)
- Android_实现activity之间切换的动画效果(overridePendingTransition)
- 【android_温故知新】深入理解 Activity
- Android_四大组件之一Activity
- Android_简单笔记一
- Android_蓝牙详解一
- Android_访问网络一(使用HttpURLConnection访问)
- Android_控件布局初步(一)第一季重制版
- Android_百度地图(一)简单的定位
- android_定义多个Activity及跳转
- android_不显示界面的activity调用
- 初学Android_方法总结(一)
- Android Activity (一)
- Activity生命周期(一)
- activity生命周期(一)
- JavaScript中清空数组的三种方式
- 两个矩阵,合并成一个矩阵
- 【caffe源码研究】第三章:源码篇(4) :Solver
- 设计模式--[7]解释器模式
- string与new string跟StringBuffer和StringBuilder的区别
- Android_聊一聊Activity(一)
- Ajax用jsonp方式跨域发送请求
- Lambda表达式在Android开发中的应用
- Android菜鸟练习第三十五课 Service基本使用
- android studio 获取SHA1(指纹)
- Eclipse启动Tomcat错误:Several ports (8080, 8009) required by Tomcat v6.0 Server at localhost are already
- AndroidStudio 错误:Read-Only Status of Files
- Hadoop YARN中内存和CPU两种资源的调度和隔离
- 一个解决中午吃什么去哪吃的程序