Activity
来源:互联网 发布:syslog日志服务器端口 编辑:程序博客网 时间:2024/05/23 19:25
一、Activity概述
Activity是主要为用户提供任务交互画面的组件,是使用最为频繁的一种组件。
二、Activity生命周期
1、onCreate():Activity第一次创建时调用,这里应完成所有常见的初始化工作——调用setContentView()加载界面布局资源、初
始化所需数据等。本方法传入了一个包含该Activity前一个状态的Bundle对象,下一个回调方法为onStart()。
2、onRestart():Activity被停止后、又被再次启动之前调用,下一个回调方法为onStart()。
3、onStart():Activity要显示给用户之前调用,此时Activity已可见,但还没有出现在前台,无法和用户交互。如果Activity进入前台,则
下一个回调方法是onResume();如果进入隐藏状态,则下一个回调方法为onStop()。
4、onResume():Activity开始与用户交互之前调用。这时Activity是在Activity栈的顶端,用户可以向其中输入。下一个回调方法
总是onPause()。
5、onPause():当系统准备启动另一个正在恢复的Activity时调用。这个方法通常用于把未保存的改动提交为永久数据、停止动画
播放、以及其它可能消耗CPU的工作等等。 它应该非常迅速地完成工作,因为下一个Activity在本方法返回前是不
会被恢复运行的。
6、onStop():当activity不再对用户可见时调用。原因可能是它即将被销毁、或者其它Activity(已有或新建的)被恢复运行并要
覆盖本Activity。如果Activity还会回来与用户交互,则下一个回调方法是onRestart();如果这个activity即将消
失,则下一个回调方法是onDestroy();如果Activity返回前台,则下一个回调方法是onResume();如果进入用户
不可见状态,则下一个是onStop()。
7、onDestroy():在本Activity被销毁前调用。这是Activity收到的最后一个调用。 可能是因为Activity完成了工作(有些人在这里
调用finish()), 也可能是因为系统为了腾出空间而临时销毁Activity的本实例。 可以利用isFinishing() 方法来
区分这两种情况。
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; public void doClick(View v){ Intent intent = new Intent(MainActivity.this , SecondActivity.class); startActivity(intent); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i(TAG , "--------onCreate--------"); } @Override protected void onRestart() { super.onRestart(); Log.i(TAG , "--------onRestart--------"); } @Override protected void onStart() { super.onStart(); Log.i(TAG , "--------onStart--------"); } @Override protected void onResume() { super.onResume(); Log.i(TAG , "--------onResume--------"); } @Override protected void onPause() { super.onPause(); Log.i(TAG , "--------onPause--------"); } @Override protected void onStop() { super.onStop(); Log.i(TAG , "--------onStop--------"); } @Override protected void onDestroy() { super.onDestroy(); Log.i(TAG , "--------onDestroy--------"); }}
启动Activity
跳转至其他Activity
点击Back键
8、异常情况下的生命周期
Activity除受用户操作所导致的生命周期方法调度,还有一些异常也会,如系统配置发生改变或系统内存不足
-onSaveInstanceState():在Activity销毁时保存状态信息,调用时机为onStop()之前,与onPause()没有固定时间顺序
-onRestoreInstanceState():接收onSaveInstanceState()所保存的Bundle对象,调用时机在onStart()之后
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private TextView textView; public void doClick(View v){ Intent intent = new Intent(MainActivity.this , SecondActivity.class); startActivity(intent); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i(TAG , "--------onCreate--------"); textView = (TextView) findViewById(R.id.tx); if(savedInstanceState != null) textView.setText(savedInstanceState.getString("name")); } @Override protected void onRestart() { super.onRestart(); Log.i(TAG , "--------onRestart--------"); } @Override protected void onStart() { super.onStart(); Log.i(TAG , "--------onStart--------"); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Log.i(TAG , "--------onRestoreInstanceState--------"); } @Override protected void onResume() { super.onResume(); Log.i(TAG , "--------onResume--------"); } @Override protected void onPause() { super.onPause(); Log.i(TAG , "--------onPause--------"); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log.i(TAG , "--------onSaveInstanceState--------"); outState.putString("name" , "MurphySL"); } @Override protected void onStop() { super.onStop(); Log.i(TAG , "--------onStop--------"); } @Override protected void onDestroy() { super.onDestroy(); Log.i(TAG , "--------onDestroy--------"); }}
横竖屏切换
-onConfigurationChange():若系统配置改变后,不想重新创建Activity,可在AndroidMenifest.xml中添加configChanges属性为 orientation,系统将不调用onSaveInstanceState() 、onRestoreInstanceState(),取而代之调用onConfigurationChange()方法
三、Activity Task与BackStack
task是一个具有栈结构的容器,是多个Activity的集合,Activity集合中也可包含其他应用中的Activity。启动一个应用,系统就会为之创建一个task。当用户返回home屏执行另一个task时,一个task被移动到后台执行,此时其返回栈也被保存后台,同时android为新task创建一个新返回栈,当它再次运行回到前台时,其返回栈被移到前台,并恢复之前执行的Activity。若后台有太多task运行,系统将会杀死一些task释放内存。
task中的Activity集合按照启动顺序排队存入一个栈,即BackStack。BackStack以“last in , frist out”方式运行。
四、Activity启动模式
1、指定启动模式方法
-在AndroidManifest.xml中配置<activity>的launchMode属性
-通过Intent中设置标志位,调用Intent对象的addFlags()方法
FLAG_ACTIVITY_NEW_TASK:singleTask模式
FLAG_ACTIVITY_SINGLE_TOP:singleTop模式
FLAG_ACTIVITY_CLEAR_TOP:当此Activity启动时,同一task所有位于它上面的Activity全部出栈
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:此Activity不会出现在历史Activity的列表中,等同于Activity属性 android:excludeFromRecents = "true"
2、LaunchMode
-standard(标准模式):系统启动Activity的task中创建一个新Activity实例,该activity可被实例化多次,各个实例可以属于不同 task,一个task中也可存在多个实例
public void doClick(View v){ Intent intent = new Intent(MainActivity.this , MainActivity.class); startActivity(intent); textView.setText(this.toString());}
切换同一Activity界面,结果均为MainActivivty实例,但序列号不同
-singleTop(栈顶复用模式):如果Activity已经存在一个实例且位于当前task的栈顶,系统会调用已有实例的onNewIntent()方法把 intent传递给已有实例,而不是创建一个新的Activity实例,且不会调用onCreate()与onStart()
切换同一activity界面,结果均为MainActivivty实例,且序列号相同
MainActivity跳转至SecondActivity,再跳转至MainActivity,两个MainActtivity序列号不同,由于MainActivity不处于栈顶,所以生成新实例
-singleTask(栈内复用模式):如果Activity已在task中存在实例,系统会通过调用其实例的onNewIntent()方法把intent传给已有实 例,而不是再创建新实例,此Activity同一时刻只能存在一个实例
MainActivity跳转至SecondActivity再跳转至MainActivity,再跳转至SecondActivity,MainActivity序列号不变,SecondActivity序列号改变,由于第二次跳转过程中系统发现有存在的MainActivity实例,于是不再生成新实例,而是将MainActivity之上的Activty实例全部出栈,将MainActivity变为栈顶,第三次跳转时由于不存在SecondActivity实例,于是生成新实例序列号改变
-singleInstance(单实例模式):除了系统不会把其他Activity放入当前实例所在task外,其他均与singleTask相同,Activity总是它所 在task的唯一成员,它所启动的任何Activity都会放入其他task中
MainActivity跳转至SecondActivity,重新启用了一个task放置SecondActivity,再跳转至MainActivity回到原始栈结构
若修改MainActivty的launchMode值为singleTop、singleTask、singleInstance中任意一个,流程如图
- Activity
- Activity
- Activity。。。
- Activity
- Activity
- Activity
- Activity
- Activity
- Activity
- Activity
- activity
- Activity
- Activity
- activity
- Activity
- activity
- activity
- activity
- 在mvn项目里添加spark_sql依赖
- ViewDragHelper的使用
- php错误日志
- 安卓常见布局
- u-boot向linux内核传递启动参数
- Activity
- vi 使用记录
- mysql连接数据库
- yarn模式运行spark
- Jenkins + Ant + Java + TestNg + ReportNg + Appium 进行持续集成
- errno.h
- Linux下安装Hadoop(2.7.1)详解及WordCount运行
- 微信支付和微信第三方登录的冲突问题
- php中的错误处理