Android开发中重要组件activity 生命周期以及启动模式分析

作者:简简单单 2015-07-31

Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务。

Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件。

在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。

Activity生命周期

安卓活动由一个返回栈管理

安卓活动有四个状态

1.运行状态

  当一个活动位于栈顶的时候,这个活动就处于运行状态,也就是和用户进行交互的那个界面。

2.暂停状态

  当活动不处于栈顶,但依然可见。意思就是这个活动没有被完全覆盖,上面有一层对话框之类的。

3.停止状态

  活动不处于栈顶,完全不可见。这个好理解吧,就是用户看不到了。

4.销毁状态

  活动从栈中移除了,也就是被用户关闭了。

Activity共有七个回调方法,覆盖了活动整个生命周期

1.onCreate()

  活动创建时调用,一般被用来初始化。

2.onStart()

  由不可见重新可见的时候调用。

3.onResume()

  当活动到达栈顶的时候调用,也就是活动准备和用户交互的时候调用

4.onPause()

  启动或者恢复另一个活动的时候调用。

5.onStop()

  当活动完全不可见的时候会执行,注意是完全不可见,若是是启动一个对话框形式的活动,则不会启动。

6.onDestroy()

  当活动被销毁之前调用

7.onRestart()

  当活动由停止状态变为运行状态之前调用

下图很直观的表示了活动的生命周期


 
你可以用如下示例代码 仔细探索一下 通过logcat打印的内容 你能很容易的弄明白

public class MainActivity extends Activity {
    public static final String TAG="MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG,"onCreate");
        Log.d(TAG,this.toString());
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        if(savedInstanceState!=null)
        {
            String temp=savedInstanceState.getString("data_key");
            Log.d(TAG,temp);
        }
        Button startNormal=(Button)findViewById(R.id.start_normal_activity);
        Button startDialog=(Button)findViewById(R.id.start_dialog_activity);
        startNormal.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,NormalActivity.class);
                startActivity(intent);
            }
        });
        startDialog.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,DialogActivity.class);
                startActivity(intent);
            }
        });
    }
    @Override
    public void onStart(){
        super.onStart();
        Log.d(TAG,"onStart");
    }
    @Override
    public void onResume(){
        super.onResume();
        Log.d(TAG,"onResume");
    }
    @Override
    public void onPause(){
        super.onPause();
        Log.d(TAG,"onPause");
    }
    @Override
    public void onStop(){
        super.onStop();
        Log.d(TAG,"onStop");
    }
    @Override
    public void onDestroy(){
        super.onDestroy();
        Log.d(TAG,"onDestroy");
    }
    @Override
    public void onRestart(){
        super.onRestart();
        Log.d(TAG,"onRestart");
    }


关于启动模式

activity的启动也共有四种

要修改activity的启动模式,需要在AndroidManifest.xml中修改activity标签下的   android:launchMode


    
        
        
    


 
1.standard

  这是活动的默认启动模式 ,这种启动模式,每次启动都会在栈中新建一个该活动的实例

  好比在FirstActivity的基础上再启动一个FirstActivity  如果你要返回的话你就要按两次返回键才能返回到桌面

2.singleTop

  这种模式很好的解决了上一种模式的问题

  如果FirstActivity这个活动已经在栈顶了 那么如果你要再启动FirstActivity 是不会再创建新的实例了的

  但是这种方法仅限于FirstActivity在栈顶的情况,如果FirstActivity不在栈顶,也就是不在用户能看到的界面,那么还是会创建新的实例。

3.singleTask

  singleTask完美解决创建重复活动实例的情况。每次启动活动,它会自动查找栈中是否存在该活动的实例,若存在直接使用,不存在才创建

4.singleInstance

  这个比较特殊,它启动活动时,会新建一个栈来存放新启动的活动。这种模式可以解决不同应用程序之间调用活动的问题。

相关文章

精彩推荐