您的位置:首页 > 其它

达内课程-Activity的生命周期

2018-01-20 11:37 246 查看

Activity

Activity是Android系统的核心组件,用于处理UI相关的业务

系统的核心组件是有系统进行管理和维护的

【创建新的Activity】

1、自定义类,继承自android.app.Activity

2、注册,在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集合中移除
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: