zoukankan      html  css  js  c++  java
  • Android开发Activity生命周期回顾理解

    Activity和Servlet一样,都用了回调机制。我们通过类比servlet来学习Activity。当一个servlet开发出来之后,该servlet运行于Web服务器中。服务器何时创建servlet的实例,何时调用servlet的方法向用户生成响应,程序员无法控制,这种回调由服务器自行决定。Activity也一样,被开发出来,开发者只要在AndroidManifest.xml文件配置该Activity即可。至于该Activity何时被实例化,它的方法何时被调用,对开发者来说完全是透明的。

    当开发者开发一个Servlet时,根据不同的需求场景,可能需要选择性的的实现如下方法:

    • init(servletConfig config)
    • destroy()
    • doGet(HttpServletRequest req,HttpServletResponse resp)
    • doPost(HttpServletRequest req,HttpServletResponse resp)
    • sevice(HttpServletRequest req,HttpServletResponse resp
    • 当把Servlet部署到Web应用中之后,Web服务器将会在特定的时刻,调用该Servlet上面的各种方法---这种调用就被称为回调。

    Activity的回到机制与此类似,当Activity被部署到Android应用之后,随着应用程序的运行,Activity会不断的在不同的状态进行切换,该activity中特定的方法就会被回调-----开发者就可以选择性的重写这些方法来加入业务相关的处理。Android运行过程的不同状态被称为生命周期。

    Android的生命周期:当activity处于Android的应用中的运行时,它的活动状态由Android运行时以Activity栈的形式管理。当前活动的Activity位于栈顶。

    Android的生命周期演示:android大致经过如下四个状态:

    • 活动状态:当前Activity位于前台,用户可见,可以获得焦点。
    • 暂停状态:其他Activity位于前台,该Activity依然可见,只是不能获得焦点。
    • 停止状态:该Activity不可见,失去焦点
    • 销毁装填:该activity结束,或者activity所在的Dalvik进程被结束。

    下面是官方API所提供的生命周期图:

    //img-my.csdn.net/uploads/201007/28/0_12803210018q71.gif

    下面使用代码亲自测下Android的生命周期,测完就明白了:

    复制代码
    package com.lp.ecjtu.activitydemo1;
    
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.util.Log;
    import android.view.Menu;
    import android.widget.EditText;
    
    public class MainActivity extends Activity {
        private static final String TAG = "MainActivity";
        private EditText editText;
    //创建Activity被回调
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            editText = (EditText) findViewById(R.id.editText);
            Log.e(TAG, "Start onCreate =========");
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
        //启动Activity被回调
        @Override
        protected void onStart() {
            // TODO Auto-generated method stub
            super.onStart();
            Log.e(TAG, "Start onStart =========");
        }
        //重新启动Activity被回调
        @Override
        protected void onRestart() {
            // TODO Auto-generated method stub
            super.onRestart();
            Log.e(TAG, "Start onRestart =========");
        }
        //恢复Activty被回调
        @Override
        protected void onResume() {
            // TODO Auto-generated method stub
            super.onResume();
            Log.e(TAG, "Start onResume =========");
        }
        //暂停Activity被回调
        @Override
        protected void onPause() {
            // TODO Auto-generated method stub
            super.onPause();
            Log.e(TAG, "start onPause=============");
        }    
        //停止Activity被回调
        @Override
        protected void onStop() {
            // TODO Auto-generated method stub
            super.onStop();
            Log.e(TAG, "start onStop=============");
        }
        //销毁Activity被回调
        @Override
        protected void onDestroy() {
            // TODO Auto-generated method stub
            super.onDestroy();
            Log.e(TAG, "start onDestroy=============");
        }
    
    }
    复制代码

    运行上面的代码:我们打开应用程序时回调了OnCreate()-->onStart()-->onResume()方法。在LogCat窗口可以看到:

    Back键:当我们按返回键的时候这个应用程序或者Activity将结束,依次回调了OnPause()-->onStop()-->Ondestroy()方法:在LogCat窗口可以看到:

    HOME键:当我们正在打游戏的时候,突然来了条短信,我们想看短息,按HOME键,然后打开短信的应用,当我们按HOME键的时候Activity先后执行了OnPause()-->OnStop方法,在LogCat窗口可以看到:

    而我们看完短息在启动应用的时候:会执行OnRestart()-->onStart-->OnResume方法。在LogCat窗口可以看到:

    通过上面的操作,想必我们都对Android Activity生命周期有了深刻的了解,我们就可以在开发Activity的时候,选择性的重写生命周期的方法来解决业务上的一些需求。

    例如:下面的这个例子,当我们在看视屏的时候,或者在注册的时候,刚好填完用户的注册信息,不小心按到了Home键,当我们在进入应用程序的时候,发现之前填的注册信息全没了,这时候我们就要哭了,说明这个应用程序做的比较垃圾。正常情况下,我们之前填写的注册信息还在,也就是说和我们按Home键之前的状态是一致的。

    为了理解,我们用一个小例子说明问题:

    在XML代码代码中增加EditText:

    复制代码
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" 
        android:orientation="vertical">
    
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/hello_Activity" />
    
        <EditText
            android:id="@+id/editText"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:ems="10" />
    
    </LinearLayout>
    复制代码

    java代码不变,运行程序,在EditText中输入peter,

    然后按HOME键,在次启动MainActivity,发现之前输入的内容没了。

    这显然不是正常的应用程序,我们都会哭的。那么就需要我们队生命周期非常了解了,当我们按Home键的时候,Activity回调了onPause-->OnStop()方法,再次进入应用程序的时候回调了OnRestart-->OnStart-->onResume()方法,说明我们只要在onPause()和OnRestart方法里面做处理既可以保存之前的状态:下面看代码

    复制代码
    package com.lp.ecjtu.activitydemo1;
    
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.util.Log;
    import android.view.Menu;
    import android.widget.EditText;
    
    public class MainActivity extends Activity {
        private static final String TAG = "MainActivity";
        private EditText editText;
        //定义一个String字符串用于存放用户输入的字符串
        private String userString;
        //创建Activity被回调
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            editText = (EditText) findViewById(R.id.editText);
            Log.e(TAG, "Start onCreate =========");
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
        //启动Activity被回调
        @Override
        protected void onStart() {
            // TODO Auto-generated method stub
            super.onStart();
            Log.e(TAG, "Start onStart =========");
        }
        //重新启动Activity被回调
        @Override
        protected void onRestart() {
            // TODO Auto-generated method stub
            super.onRestart();
            //再次启动应用时,把先前用户输入的值重新设置EditText
            editText.setText(userString);
            Log.e(TAG, "Start onRestart =========");
        }
        //恢复Activty被回调
        @Override
        protected void onResume() {
            // TODO Auto-generated method stub
            super.onResume();
            Log.e(TAG, "Start onResume =========");
        }
        //暂停Activity被回调
        @Override
        protected void onPause() {
            // TODO Auto-generated method stub
            super.onPause();
            //按home键的时候,保存用户输入的字符串信息。
            userString = editText.getText().toString();
            Log.e(TAG, "start onPause=============");
        }    
        //停止Activity被回调
        @Override
        protected void onStop() {
            // TODO Auto-generated method stub
            super.onStop();
            Log.e(TAG, "start onStop=============");
        }
        //销毁Activity被回调
        @Override
        protected void onDestroy() {
            // TODO Auto-generated method stub
            super.onDestroy();
            Log.e(TAG, "start onDestroy=============");
        }
    
    }
    复制代码

    重新启动app,按home键,在进入应用程序OK了,看下面的图:

    总结:理解生命周期的关键是,我们可以在开发过程选择性的重写生命周期中的方法,解决一些实际问题,这才是关键,学以致用!

    Face your past without regret. Handle your present with confidence.Prepare for future without fear. keep the faith and drop the fear. 面对过去无怨无悔,把握现在充满信心,备战未来无所畏惧。保持信念,克服恐惧!一点一滴的积累,一点一滴的沉淀,学技术需要不断的积淀!
  • 相关阅读:
    通过 curl 命令访问 K8S API
    k8s 调度 Affinity
    golang 定期发送 RA 报文
    Ticker 使用
    查看 host/container veth pair 关系
    Kubernetes 服务 service 的负载均衡分析
    698 TypeScript泛型的使用:泛型实现类型参数化,泛型接口,泛型类,泛型约束
    697 TypeScript接口的使用:接口的声明,可选属性,只读属性,索引类型,函数类型,接口继承,交叉类型,接口的实现,字面量赋值,枚举类型
    696 TypeScript类的使用:类的定义,继承,多态,成员修饰符,readonly,getters/setters,静态成员,抽象类abstract,抽象类演练,类的类型
    695 TypeScript函数类型:可选参数,默认参数,剩余参数,this类型,函数的重载,联合类型和重载
  • 原文地址:https://www.cnblogs.com/hanease/p/15717011.html
Copyright © 2011-2022 走看看