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中任意一个,流程如图





1 0
原创粉丝点击