您的位置:首页 > 移动开发 > Android开发

Android四大组件之Activity,Activity生命周期

2017-03-16 17:25 471 查看
      Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器。

     

      Activity作为四大组件之一,其生命周期也就是它所在的进程的生命周期。Activity生命周期需要深入理解,后续的开发和调试都会使用到。

      

  一、  应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。

          下图是一张经典的Activity生命周期流程图

                                  


     1、onCreate()当第一次调用一个Activity就会执行

     2、onStart()表示当前的Activity处于可见状态

     3、onResume()表示当Activity可以得到用户焦点

 
   4、onPause()表示当前Activity被遮挡,即使其用户焦点

 
   5、onStop()表示当前Activity不可见

 
   6、 onDestory()表示当前的activity被销毁

 
   7、 当Activity没有被销毁的时候重新调用这个Activity就会调用onRestart方法
     根据官方给出的说明,可以清楚的知道,在什么状态下,应该处理那些事件。即那些事件放在哪个状态下处理是合适的。

二、为了加深对Activity生命周期的认知,需要看下在多个Activity的时候,对应的生命周期的信息。
       例如,我们在第一个Activity里面,通过点击button按钮来启动第二个Activity。

package com.android.activity.demo;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class FirstActivity extends Activity implements View.OnClickListener {

private static final String TAG = "FirstActivity";

private Button mButton1 = null;
private Button mButton2 = null;
private Button mButton3 = null;
private Button mButton4 = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
XLog.i(TAG, "onCreate()");
setContentView(R.layou
4000
t.activity_first);
findView();
setListener();
}

private void findView() {
mButton1 = (Button) findViewById(R.id.btn_start_second_activity01);
mButton2 = (Button) findViewById(R.id.btn_start_second_activity02);
mButton3 = (Button) findViewById(R.id.btn_start_second_activity03);
mButton4 = (Button) findViewById(R.id.btn_start_second_activity04);
}

private void setListener() {
mButton1.setOnClickListener(this);
mButton2.setOnClickListener(this);
mButton3.setOnClickListener(this);
mButton4.setOnClickListener(this);
}

@Override
protected void onRestart() {
super.onRestart();
XLog.i(TAG, "onRestart()");
}

@Override
protected void onStart() {
super.onStart();
XLog.i(TAG, "onStart()");
}

@Override
protected void onResume() {
super.onResume();
XLog.i(TAG, "onResume()");
}

@Override
protected void onPause() {
super.onPause();
XLog.i(TAG, "onPause()");
}

@Override
protected void onStop() {
super.onStop();
XLog.i(TAG, "onStop()");
}

@Override
protected void onDestroy() {
super.onDestroy();
XLog.i(TAG, "onDestroy()");
}

@Override
public void onClick(View view) {
int id = view.getId();
XLog.i(TAG, "onClick() id = 0x" + Integer.toHexString(id));
switch (id) {
case R.id.btn_start_second_activity01: {
startSecondActivityByAction();
break;
}

case R.id.btn_start_second_activity02: {
startSecondActivityByClass();
break;
}

case R.id.btn_start_second_activity03: {
startSecondActivityByPackage();
break;
}

case R.id.btn_start_second_activity04: {
startSecondActivityByComponent();
break;
}

default:
break;
}
}

private void startSecondActivityByAction() {
XLog.i(TAG, "startSecondActivityByAction()");
Intent intent = new Intent();
intent.setAction("android.intent.action.SECONDACTIVITY_START");
intent.addCategory(Intent.CATEGORY_DEFAULT);
try {
startActivity(intent);
} catch (Exception e) {
XLog.i(TAG, "start activity error!");
}
}

private void startSecondActivityByClass() {
XLog.i(TAG, "startSecondActivityByClass()");
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
try {
startActivity(intent);
} catch (Exception e) {
XLog.i(TAG, "start activity error!");
}
}

private void startSecondActivityByPackage() {
XLog.i(TAG, "startSecondActivityByPackage()");
Intent intent = new Intent();
intent.setClassName(getPackageName(), getPackageName() + ".SecondActivity");
try {
startActivity(intent);
} catch (Exception e) {
XLog.i(TAG, "start activity error!");
}
}

private void startSecondActivityByComponent() {
XLog.i(TAG, "startSecondActivityByComponent()");
Intent intent = new Intent();
intent.setComponent(new ComponentName(getPackageName(), getPackageName() + ".SecondActivity"));
try {
startActivity(intent);
} catch (Exception e) {
XLog.i(TAG, "start activity error!");
}
}
}


  第二个Activity的部分

package com.android.activity.demo;

import android.app.Activity;
import android.os.Bundle;

public class SecondActivity extends Activity {
private static final String TAG = "SecondActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
XLog.i(TAG, "onCreate()");
setContentView(R.layout.activity_second);
}

@Override
protected void onRestart() {
super.onRestart();
XLog.i(TAG, "onRestart()");
}

@Override
protected void onStart() {
super.onStart();
XLog.i(TAG, "onStart()");
}

@Override
protected void onResume() {
super.onResume();
XLog.i(TAG, "onResume()");
}

@Override
protected void onPause() {
super.onPause();
XLog.i(TAG, "onPause()");
}

@Override
protected void onStop() {
super.onStop();
XLog.i(TAG, "onStop()");
}

@Override
protected void onDestroy() {
super.onDestroy();
XLog.i(TAG, "onDestroy()");
}
}


  对应的AndroidManifest.xml的配置

<activity
android:name="com.android.activity.demo.SecondActivity"
android:label="@string/second_activity_name" >
<intent-filter>
<action android:name="android.intent.action.SECONDACTIVITY_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>


1、当我们启动一个Activity的时候,输出的log如下

03-17 09:02:21.766: I/ActivityDemo(12870): FirstActivity onCreate()
03-17 09:02:21.776: I/ActivityDemo(12870): FirstActivity onStart()
03-17 09:02:21.776: I/ActivityDemo(12870): FirstActivity onResume()
可以看到,分别先后调用了 onCreate()  onStart() onResume()

2、当我们按返回键退出第一个应用的时候,输出log如下

03-17 09:04:01.624: I/ActivityDemo(12870): FirstActivity onPause()
03-17 09:04:02.115: I/ActivityDemo(12870): FirstActivity onStop()
03-17 09:04:02.115: I/ActivityDemo(12870): FirstActivity onDestroy()


 退出应用的时候,分别先后调用了onPause() OnStop() onDestroy()  

3、第一个应用启动到第二个应用的时候,输出log如下:

03-17 09:05:36.637: I/ActivityDemo(12870): FirstActivity onClick() id = 0x7f060002
03-17 09:05:36.638: I/ActivityDemo(12870): FirstActivity startSecondActivityByAction()
03-17 09:05:36.765: I/ActivityDemo(12870): FirstActivity onPause()
03-17 09:05:36.777: I/ActivityDemo(12870): SecondActivity onCreate()
03-17 09:05:36.780: I/ActivityDemo(12870): SecondActivity onStart()
03-17 09:05:36.780: I/ActivityDemo(12870): SecondActivity onResume()
03-17 09:05:37.222: I/ActivityDemo(12870): FirstActivity onStop()
启动到第二个Activity的时候,先是第一个应用的onPause(),失去焦点,被压到后台。

第二个应用的onCreate(创建) onStart(可见) onResume(可以获取焦点)。
当第二个应用onResume()可以获取焦点的时候,在把第一个应用onStop()不可见

4、从第二个应用返回第一个应用,输出log如下:

03-17 09:07:03.518: I/ActivityDemo(12870): SecondActivity onPause()
03-17 09:07:03.523: I/ActivityDemo(12870): FirstActivity onRestart()
03-17 09:07:03.523: I/ActivityDemo(12870): FirstActivity onStart()
03-17 09:07:03.523: I/ActivityDemo(12870): FirstActivity onResume()
03-17 09:07:03.905: I/ActivityDemo(12870): SecondActivity onStop()
03-17 09:07:03.905: I/ActivityDemo(12870): SecondActivity onDestroy()


先是第二个应用的onPause,失去焦点。
第一个应用被重新唤醒 onRestart, onStart可见,onResume可以获取焦点
然后才是第二个应用的onStop不可见,被销毁ondestory

附件:Demo对应的Sorce
Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: