• Android_Activity生命周期


      

     

     

     

    什么是Android 的四大组件呢?接下来简单了解下。

      1.  Activity

         首先,Activity是Android系统中的四大组件之一,可以用于显示View。Activity是一个与用记交互的系统模块,几乎所有的Activity都是和用户进行交互的。

         Activity就是我们应用程序的界面,主要用来跟我们的用户进行交互的,比如一个文本框,按钮这些就是显示在Activity上的,并且可以接收数据,传递数据到后台,然后再显示出来。

     

      2.  service

        Service 我们是看不见的,对于绝大部分的数据的处理,业务的处理都是通过 Service 来完成的。

         

      3.   Broadcast Receiver 

        BroadcastReceiver组件是广播接收器,主要是用来监听系统的各个行为的,例如当电量不足的时候会给我们发送一条广播信息。

      4.   Content Provider

        ContentProvider类似于我们的档案馆,里面存放了我们的各种数据,例如通讯录中的信息等,这个组件就是运行程序对其进行访问,然后得到里面的数据。

    --http://blog.csdn.net/liuhe688/article/details/6733407

      熟悉javaEE的朋友们都了解servlet技术,我们想要实现一个自己的servlet,需要继承相应的基类,重写它的方法,这些方法会在合适的时间被servlet容器调用。

      其实Android中的Activity运行机制跟servlet有些相似之处,Android系统相当于servlet容器,Activity相当于一个servlet,

      我们的Activity处在这个容器中,一切创建实例、初始化、销毁实例等过程都是容器来调用的,

      这也就是所谓的“Don't call me, I'll call you.”机制

      我们先要知道一下MVC设计模式,在JAVAEE 中MVC设计模式已经很经典了,而且分的也比较清晰了,

      但是在Android中,好多人对MVC在Android开发中的应用不是很清楚,下面我就先来介绍一下MVC在Android开发中的应用:

    MVC

    M(Model 模型):
                 

    Model是应用程序的主体部分,所有的业务逻辑都应该写在这里,在Android中Model层与JavaEE中的变化不大,

    如:对数据库的操作,对网络等的操作都放在该层

    (但不是说它们都放在同一个包中,可以分开放,但它们统称为Model层)。

     V(View 视图):

    是应用程序中负责生成用户界面的部分,也是在整个MVC架构中用户唯一可以看到的一层,

    接收用户输入,显示处理结果;在Android应用中一般采用XML文件里德界面的描述,

    使用的时候可以非常方便的引入,当然也可以使用JavaScript+Html等方式作为View。

    C(Controller控制层):

    android的控制层的重任就要落在众多的activity的肩上了,所以在这里就要建议大家不要在activity中写太多的代码,

    尽量能过activity交割Model业务逻辑层处理。

      好了,在介绍过Android应用开发中的MVC架构后,我们就可以很明确的知道,在Android中Activity主要是用来做控制的,

      它可以选择要显示的View,也可以从View中获取数据然后把数据传给Model层进行处理,最后再来显示出处理结果。

      介绍过Activity的主要作用后,那么我们就要详细说一下Activity了。

      我们来看一下这一张生命周期流程图:

    --http://bbs.51cto.com/thread-954794-1.html

    Activity 的生命周期是被以下的函数控制的。

    public class Activity extends ApplicationContext {
          protected void onCreate(Bundle icicle);
          protected void onStart();
          protected void onRestart();
          protected void onResume();
          protected void onFreeze(Bundle outIcicle);
          protected void onPause();
          protected void onStop();
          protected void onDestroy();
    }

    onCreate(Bundle)

    函数是你进行初始化的地方,这个也是执行

    setContentView(View)

    函数的地方

    setContentView(View)             

    函数可以传入一个由XML编制的UI界面,可以使UI和具体实现完全分离。

    onPause()

    函数是处理用户离开当前 Activity 的地方。更重要的是,任何在当前

    Activity中的任何改变都要在这个函数中提交。

     

     

     

     

     

     

     

    活动状态

      活动状态

      当Activity处于Stack(栈)顶时,就是手机当前的现实屏幕,这是 Activity就处于activity或者运行状态。

      运行但是失去焦点

      当Activity还处于运行状态时,但是屏幕是有另外一个Activity处于文档处于焦点状态,当前的Activity就处于pause。

      停止

      当Activity被另一个Activity完全覆盖的时候,就被停止了,其实就是虽然在运行,但是用户却看不见。

      结束

      当Activity处于pause或者stop时,系统可以结束 Activity,回收资源,这是Activity就是处于结束状态了。

     

      处于结束状态的是Activity,如果要使用户可见,只要重启才可以。



    Activity的响应时间

      当前Activity所在的线程为主线程,它的响应时间为5秒,

      如果在当前运行的Activity中进行耗时的操作且响应时间起过5秒,那么程序就会报ANR错误。

      所以,这也是不建议在Activity中写太多复杂代码的原因之一。

      当然,有些代码只能写在Activity中,不然就运行不了(它们不是生命周期方法),

      比如你想要获得android系统或者硬件一的些信息,就必须在Activity中写出来,如果单独写一个工具类获得不了。

    --

    相信不少朋友也已经看过这个流程图了,也基本了解了Activity生命周期的几个过程,我们就来说一说这几个过程。

    1. 启动Activity:

    系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。

    2. 当前Activity被其他Activity覆盖其上或被锁屏:

    系统会调用onPause方法,暂停当前Activity的执行。

    3. 当前Activity由被覆盖状态回到前台或解锁屏:

    系统会调用onResume方法,再次进入运行状态。

    4. 当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台: 

    系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。

    5.   用户后退回到此Activity:

    系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。

    6. 当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,

      系统内存不足,杀死当前Activity,而后用户退回当前Activity: 

    再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。

    7. 用户退出当前Activity:

    系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。

      简单例子(现在也不懂     希望以后翻看这个文章的时候能懂)

    package com.scott.lifecycle;
    
    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.content.res.Configuration;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    
    
    public class MainActivity extends Activity {
    
        private static final String TAG = "LifeCycleActivity  ...>>>生命 周期 活动";
        private Context context = this;
        private int param = 1;
    
        // Activity 创建时被调用
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.i(TAG, "onCreate called.    ---->>> Activity 创建时被调用");
    
            setContentView(R.layout.activity_main);
    
            Button btn = (Button) findViewById(R.id.button1);
            btn.setOnClickListener(new View.OnClickListener() {
    
                public void onClick(View v) {
                    Intent intent = new Intent(context, MainActivity.class);
                    startActivity(intent);
                }
            });
    
        }
    
        // Activity创建或者从后台重新回到前台时被调用
        protected void onStart() {
            super.onStart();
            Log.i(TAG, "onStart called.        ---->>> Activity创建或者从后台重新回到前台时被调用");
        }
        
        //Activity从后台重新回到前台时被调用  
        @Override  
        protected void onRestart() {  
            super.onRestart();  
            Log.i(TAG, "onRestart called.    ---->>> Activity从后台重新回到前台时被调用  ");  
        }  
          
        //Activity创建或者从被覆盖、后台重新回到前台时被调用  
        @Override  
        protected void onResume() {  
            super.onResume();  
            Log.i(TAG, "onResume called.    ---->>> Activity创建或者从被覆盖、后台重新回到前台时被调用  ");  
        }  
          
        //Activity窗口获得或失去焦点时被调用,在onResume之后或onPause之后  
        /*@Override 
        public void onWindowFocusChanged(boolean hasFocus) { 
            super.onWindowFocusChanged(hasFocus); 
            Log.i(TAG, "onWindowFocusChanged called."); 
        }*/  
          
        //Activity被覆盖到下面或者锁屏时被调用  
        @Override  
        protected void onPause() {  
            super.onPause();  
            Log.i(TAG, "onPause called.        ---->>> Activity被覆盖到下面或者锁屏时被调用  ");  
            //有可能在执行完onPause或onStop后,系统资源紧张将Activity杀死,所以有必要在此保存持久数据  
        }  
          
        //退出当前Activity或者跳转到新Activity时被调用  
        @Override  
        protected void onStop() {  
            super.onStop();  
            Log.i(TAG, "onStop called.        ---->>> 退出当前Activity或者跳转到新Activity时被调用  ");     
        }  
          
        //退出当前Activity时被调用,调用之后Activity就结束了  
        @Override  
        protected void onDestroy() {  
            super.onDestroy();  
            Log.i(TAG, "onDestory called.    ---->>> 退出当前Activity时被调用,调用之后Activity就结束了  ");  
        }  
          
        /** 
         * Activity被系统杀死时被调用. 
         * 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死. 
         * 另外,当跳转到其他Activity或者按Home键回到主屏时该方法也会被调用,系统是为了保存当前View组件的状态. 
         * 在onPause之前被调用. 
         */  
        @Override  
        protected void onSaveInstanceState(Bundle outState) {  
            outState.putInt("param", param);  
            Log.i(TAG, "onSaveInstanceState called. put param: " + param);  
            Log.i(TAG, "onSaveInstanceState called. put param:        ---->>> Activity被系统杀死时被调用. ");  
            super.onSaveInstanceState(outState);  
        }  
          
        /** 
         * Activity被系统杀死后再重建时被调用. 
         * 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死,用户又启动该Activity. 
         * 这两种情况下onRestoreInstanceState都会被调用,在onStart之后. 
         */  
        @Override  
        protected void onRestoreInstanceState(Bundle savedInstanceState) {  
            param = savedInstanceState.getInt("param");  
            Log.i(TAG, "onRestoreInstanceState called. get param: " + param);  
            Log.i(TAG, "onRestoreInstanceState called. get param:     ---->>> Activity被系统杀死后再重建时被调用. ");  
            super.onRestoreInstanceState(savedInstanceState);  
        }  
        
      //当指定了android:configChanges="orientation"后,方向改变时onConfigurationChanged被调用  
        @Override  
        public void onConfigurationChanged(Configuration newConfig) {  
            super.onConfigurationChanged(newConfig);  
            Log.i(TAG, "onConfigurationChanged called.");  
            switch (newConfig.orientation) {  
            case Configuration.ORIENTATION_PORTRAIT:  
                setContentView(R.layout.orientation_portrait);  
                break;  
            case Configuration.ORIENTATION_LANDSCAPE:  
                setContentView(R.layout.orientation_landscape);  
                break;  
            }  
        }
    }

    建好项目  第一次部署到手机的运行结果:

    第一次  它调用了:onCreate 、onStart 和 onResume 

    手机   长按会主屏幕键 时 结果:

     花掉了进程    重新进入 

     点击 button 按钮

    点了一下  退出 (是退出了button 打开的页面   打开的以上一个相同的页面)

    锁屏

     打开屏幕   和退出

  • 相关阅读:
    css相关
    文章管理列表
    高性能MySQL基础篇
    mysql
    node.js开发实战
    React Hooks
    client-*,scroll-*,offset-*的区别
    将create-react-app从javascript迁移到typescript
    为Github项目添加Travis持续集成服务
    cookie储存
  • 原文地址:https://www.cnblogs.com/Seven-cjy/p/6075067.html
Copyright © 2020-2023  润新知