达内课程-Activity的生命周期
2018-01-20 11:37
246 查看
Activity
Activity是Android系统的核心组件,用于处理UI相关的业务系统的核心组件是有系统进行管理和维护的
【创建新的Activity】
1、自定义类,继承自android.app.Activity2、注册,在AndroidMenifest.xml文件中,在节点下,创建新的节点,并指定android:name属性,取值为自定义Activity类的包名和类名
【生命周期】
Activity的生命周期表现为会执行一系列的方法,包括:——onCreate()//创建时
onStart()
——onRestart()
——onResume()
onPause()
——onStop()
——onDestroy()//销毁时
当Activity第一次激活时,onCreate()->onStart()->onResume()
Activity被置于后台时(例如回到桌面时),onPause()->onStop()
Activity回到前台时(例如从桌面切回Activity时),onRestart()->onStart()->onResume()
退出Activity时,onPause()->onStop()->onDestroy()
查看Activity是否是同一个,可以根据this.hashCode来区分
关于音乐播放器的优化
另外关于优化,因为开启了子线程,即使把界面关掉了,主线程没有了,子线程依旧会运行,但是子线程已经没有运行的必要了,所以增加@Override protected void onDestroy() { //停止更新进度的线程 stopThread(); //释放资源 mediaPlayer.release(); mediaPlayer = null; super.onDestroy(); }
当回到桌面时,音乐在播放,但我们看不到界面,所以没有必要让子线程一直工作,所以增加
@Override protected void onPause() { //停止更新进度的线程 stopThread(); super.onPause(); }
当再回到播放器界面时,需要恢复子线程
@Override protected void onRestart() { if(mediaPlayer.isPlaying()){ //开启更新进度的线程 startThread(); } super.onRestart(); }
注意
以上代码的super语句不能删除
自己要实现的代码写在super语句之前
但是这样做有1个bug,播放音乐时,切换到桌面,音乐播放完切换到下一首,因为play()方法中有startThread()方法,所以线程又开启了
所以再定义一个值
//当前activity是否在后台,解决在后台播放时,下一首开启线程的bug private boolean isInBackground = false;
当切回桌面时,值应该置为true
@Override protected void onStop() { //程序进入后台 isInBackground = true; super.onStop(); }
切回程序时应该置为false,因为要在播放方法play()中进行判断,所以onRestart()也把之前的isPlaying的判断条件去掉
@Override protected void onRestart() { isInBackground = false; //开启更新进度的线程 startThread(); super.onRestart(); d403 }
然后在开启线程的方法中增加这个值的判断
//开启线程 private void startThread() { //判断线程对象是否存在,仅当不存在时需要创建并启用线程 if (updateProgressThread == null && !isInBackground && mediaPlayer.isPlaying()) { updateProgressThread = new UpdateProgressThread(); updateProgressThread.setRunning(true); updateProgressThread.start(); } }
Activity的状态
1、运行态//表现为Activity处于前台,可见,可控,生命周期停留在onResume()2、暂停态//表现为Activity局部可见,但不可控,生命周期方法停留在onPause()方法,通常是被另一个非全屏的Activity遮挡导致
3、停止态//表现为该Activity被置于后台,完全不可见,生命周期停留在onStop()
4、终止态//表现为该Activity已经被回调了onDestroy()方法,即已经销毁
在停止状态前,会短暂的表现为暂停态,onPause()是Activity被遮挡时调用的方法,真正被置于后台时调用的方法是onStop()
创建Activity
1、自定义类,继承自android.app.Activity
2、注册,在AndroidMenifest.xml文件中,在节点下,创建新的节点,并指定android:name属性,取值为自定义Activity类的包名和类名,如果想作为启动的第一个Activity,则在节点下增加,修改标题栏的名称可以增加label
<activity android:name=".SecondActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
激活Activity
在MainActivity中增加一个按钮,点击进到SecondActivity,关键代码如下public class MainActivity extends Activity implements View.OnClickListener{ //如果要用到Button特有的属性,可以声明成Button //如果只是普通的点击监听,可以声明成View是一样的 private View btnStartSecond; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnStartSecond = findViewById(R.id.btn); btnStartSecond.setOnClickListener(this); } @Override public void onClick(View v) { Intent intent = new Intent(this,SecondActivity.class); startActivity(intent); } }
2个Activity切换时的生命周期
从第一个Activiti跳转到第二个Activity时:
D/MainActivity: onCreate() D/MainActivity: onStart() D/MainActivity: onResume() D/MainActivity: onPause() D/SecondActivity: onCreate() D/SecondActivity: onStart() D/SecondActivity: onResume() D/MainActivity: onStop()
此时显示在SecondActivity,现在直接按返回键,来销毁SecondActivity
D/SecondActivity: onPause() D/MainActivity: onRestart() D/MainActivity: onStart() D/MainActivity: onResume() D/SecondActivity: onStop() D/SecondActivity: onDestroy()
现在在SecondActivity中增加一个按钮添加点击事件,跳转MainActivity
操作如下
从MainActivity跳转SecondActivity
D/MainActivity: onCreate() D/MainActivity: onStart() D/MainActivity: onResume() D/MainActivity: onPause() D/SecondActivity: onCreate() D/SecondActivity: onStart() D/SecondActivity: onResume() D/MainActivity: onStop()
然后点击SecondActivity中按钮跳转MainActivity
SecondActivity: onPause() D/MainActivity: onCreate() D/MainActivity: onStart() D/MainActivity: onResume() D/SecondActivity: onStop()
现在跳转的MainActivity已经不是原来的Activity了,但是你大爷还是你大爷。咦?……
想查看是不是同一个Activity可以根据它的hashCode判断,相同即为同一个Activity
this.hashCode()
停止Activity
在Activity内部调用finish()方法,即可停止/销毁当前Activity调用finish()方法的效果等同于按下设备上的Back键,导致Activity的生命周期方法:onPause()->onStop()->onDestroy()
停止当前应用中所有Activity
使用List集合记录下每一个激活的Activity对象,当需要全部停止时,遍历该集合,依次调用各Activity对象的finish()方法
记录Activity对象:在每一个Activity的onCreate()中,将当前Activity对象添加到List集合,在每一个Activity的onDestory()中,将当前的Activity对象从List集合中移除
相关文章推荐
- Android课程---Activity 的生命周期
- Android官方培训课程学习(二): 管理activity的生命周期
- Android官方开发文档Training系列课程中文版:管理Activity的生命周期之启动一个Activity
- Android官方开发文档Training系列课程中文版:管理Activity的生命周期之停止和重启Activity
- 达内课程-Activity
- Android官方开发文档Training系列课程中文版:管理Activity的生命周期之暂停和恢复Activity
- 达内课程-Activity的启动模式
- Android官方开发文档Training系列课程中文版:管理Activity的生命周期之Activity的重建
- Activity 的生命周期
- Activity的生命周期和一些常用技巧1
- Android开发学习之路--Activity之生命周期
- Activity的生命周期
- Android activity的生命周期
- 基础总结篇之一:Activity生命周期
- android锁屏和finish()后activity生命周期的变化
- Android Activity ABC页面跳转生命周期变化及activity + fragment生命周期变化(经典面试题)
- Activity 生命周期
- Android Activity的生命周期
- Android_屏幕翻转过程中Activity生命周期的变化,以及如果自定义屏幕翻转过程中执行的内容。
- 两分钟彻底让你明白Android Activity生命周期