zoukankan      html  css  js  c++  java
  • Android开发教程 葵花宝典第二层 Activity生命周期

    Hi 大家好

       今天我准备花一节课来讲讲Activity的生命周期,这个概念还是比较重要的,相信大家看书或者资料都会提及它,可想而知!希望大家能看了我的博客后能搞明白生命周期的概念以及在以后的代码编写中,代码往哪里去写。

     照例,上笑话。。。

     有的女人就是Windows虽然很优秀,但是安全隐患太大。
     有的女人就是MFC她条件很好,然而不是谁都能玩的起。
       有的女人就是C#长的很漂亮,但是家务活不行。
       有的女人就是C++,她会默默的为你做很多的事情。
       有的女人就是汇编虽然很麻烦,但是有的时候还得求它。
       有的女人就是SQL,她会为你的发展带来莫大的帮助。  感慨下,呵呵

     这是Android帮助文档中的图,我先发上。帮助文档位置在例如我将SDK文件夹放在D盘,那么我的帮助文档路径为

      D:\Adnroid\android-sdk-windows\docs\index.html  英文好的朋友可以参考这个帮助文档

    我们主要会学习以下七个生命周期函数,活动(窗体)的生命周期函数并不止这七个,后面会说到。。耐心看

    以下是对每个生命周期函数的中文解释

    大家看过这些解释,对它有了一个大概的认识,那么接下来我们动手开始编写代码,来看看运行时的效果,这是代码

    publicclass MainActivity extends Activity {
    Button btn1;
    /** Called when the activity is first created. */
    @Override
    publicvoid onCreate(Bundle savedInstanceState) {
    System.out.println(
    "第一个活动(窗体)初始化------------- onCreate");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    btn1
    =(Button) findViewById(R.id.btn1);
    btn1.setOnClickListener(
    new Button.OnClickListener() {
    @Override
    publicvoid onClick(View v) {
    Intent intent
    =new Intent();
    intent.setClass(MainActivity.
    this, ResultActivity.class);
    startActivity(intent);
    }
    });
    }
    @Override
    protectedvoid onStart() {
    // TODO Auto-generated method stub
    super.onStart();
    System.out.println(
    "第一个活动(窗体)初始化完毕,并将要显示时------------- onStart");
    }
    @Override
    protectedvoid onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    System.out.println(
    "第一个活动(窗体)在即将于用户交互时------------- onResume");
    }

    @Override
    protectedvoid onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    System.out.println(
    "第一个活动(窗体)在系统即将启动第二个活动时------------- onPause");
    }

    @Override
    protectedvoid onStop() {
    // TODO Auto-generated method stub
    super.onStop();
    System.out.println(
    "第一个活动(窗体)在用户不可见时------------- onStop");
    }
    @Override
    protectedvoid onRestart() {
    // TODO Auto-generated method stub
    super.onRestart();
    System.out.println(
    "第一个活动(窗体)当重新启动时------------- onRestart");
    }
    @Override
    protectedvoid onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    System.out.println(
    "第一个活动(窗体)当活动销毁时------------- onDestroy");
    }

    }
    publicclass ResultActivity extends Activity {
    TextView txtResult;
    Button btn1;
    @Override
    protectedvoid onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    System.out.println("第二个活动(窗体)初始化------------- onCreate");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.result);
    txtResult
    = (TextView)findViewById(R.id.txtResult);
    txtResult.setText(
    "第二个窗体");
    btn1
    = (Button)findViewById(R.id.btn1);

    btn1.setOnClickListener(
    new Button.OnClickListener() {
    @Override
    publicvoid onClick(View v) {
    Intent i
    =new Intent();
    i.setClass(ResultActivity.
    this, MainActivity.class);
    startActivity(i);
    }
    });
    }



    @Override
    protectedvoid onStart() {
    // TODO Auto-generated method stub
    super.onStart();
    System.out.println(
    "第二个活动(窗体)初始化完毕,并将要显示时------------- onStart");
    }

    @Override
    protectedvoid onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    System.out.println(
    "第二个活动(窗体)在即将于用户交互时------------- onResume");
    }

    @Override
    protectedvoid onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    System.out.println(
    "第二个活动(窗体)在系统即将启动第二个活动时------------- onPause");
    }


    @Override
    protectedvoid onStop() {
    // TODO Auto-generated method stub
    super.onStop();
    System.out.println(
    "第二个活动(窗体)在用户不可见时------------- onStop");
    }

    @Override
    protectedvoid onRestart() {
    // TODO Auto-generated method stub
    super.onRestart();
    System.out.println(
    "第二个活动(窗体)当重新启动时------------- onRestart");
    }

    @Override
    protectedvoid onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    System.out.println(
    "第二个活动(窗体)当活动销毁时------------- onDestroy");
    }
    }

    如果大家要创建多个活动(窗体)时,需要到AndroidManifest.xml中进行活动(窗体)的注册

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="TSD.Jason.Example"
    android:versionCode
    ="1"
    android:versionName
    ="1.0">
    <uses-sdk android:minSdkVersion="8"/>

    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
    <activity android:name=".MainActivity"
    android:label
    ="@string/app_name">
    <intent-filter>
    <action android:name="android.intent.action.MAIN"/>
    <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
    </activity>
    <activity android:name=".ResultActivity"></activity>
    </application>
    </manifest>

    在这里说下,如何LogCat切换到Java透视图中

    在Java透视图的左下角有一个小图标,点击后 -> 其它 -> Android -> LogCat -> 确定 此时LogCat就会出现在我们的包资源管理器那里,你可以拖动它到你想要放置的地方。

    由于我们在代码中使用了System.out.println 那么 我们可以在LogCat中去新建一个Filter 如何建立呢?

    点击那个绿色的加号,会弹出一个窗体 ,在Filter Name 中任意输入一个名字 ,我这里叫做Sys,在By Log Tag 中输入 System.out 然后确定,此时就会创建成功,我们在程序中使用的System.out.println 就会显示在刚才建立的那个选项卡中。

    大家观察,打印结果

    到这里,两个窗体跳转所要执行的函数,大家应该是能够明白了。

    当我们按下Home键,又该如何执行呢?

    大家看图,然后再参照最开始的那七个生命周期的说明,自己动手实践下,就能明白了

    当点击Back键后,其实,Android操作系统是在向活动栈中逐一销毁之前压入的活动。大家可以这样做个试验,两个窗体直接反复跳转4次,在跳转前,在编辑框中输入一些值,然后在点击Back键,看要点击几次,并看编辑框中的值。

    Full Lifetime 全周期介于调用 onCreateonDestroy之间。在一些情况下,终止一个活动并不调用 onDestroyActivity通过调用 onCreate来初始化用户界面,数据,启动服务以及线程。onCreate方法有个Bundle对象参数,这个参数含有最后一次调用 onSaveIntanceState保存的UI状态数据。我们可以在 onCreate中利用这个参数来恢复UI状态数据,或者重写 onRestoreInstanceState。重写 onDestroy释放资源,关闭数据库等操作。
    为了写出比较高效的代码,有个比较好的建议是避免创建短期对象。快速的创建和销毁对象容易增加碎片回收线程的压力,这样会直接影响用户体验。

     Visible Lifetime 可视期介于调用 onStartonStop之间。此时Activity是可见的,但是不能响应用户事件。一个Activity在其生命周期中是有可能经历多个可视期的。在非常极端的情况下,系统也有可能终止一个处于可视期的活动,这种情况很少见。onStop方法通常用于暂时或者停止那些用来更新UI的动画,线程,定时器,服务等,所以当活动不可见的时占用的系统资源是很少的。当活动由不可见状态转化为可见状态时,在 onStart中再启动相关的线程和服务。onStartonStop同样也用来注册和取消注册(unregister)那些用来更新UI的广播接收者。在活动不可见时我们需要取消注册接受者(Receivers),特别是那些支持目的动作(Intent)以及更新UI的接收者。

    Activity Lifetime 当活动的 onResume被调用,活动进入激活期;当 onPause被调用时,激活期结束。一个活动被激活,它将处于前景屏幕,同时响应用户的事件。同样在活动的生命周期结束之前,存在多个激活期,一旦有新的活动被激活,当前活动将会失去焦点(暂停甚至停止……)。激活期是活动生命周期比较活跃的部分,会频繁调用 onResumeonPause,所以为了有良好的用户体验,在 onResumeonPause方法中的代码需要有更高的效率。
    在调用 onPause之前,活动会调用 onSaveInstanceState来保存活动的UI状态到 Bundle ,这个 Bundle 就是 onCreateonRestoreInstanceState这两个方法的参数了。onSaveInstanceState保存UI状态(比如多选按钮的状态,界面焦点=),这样当活动被重新激活时,能够正确显示被暂停前的UI。多数的活动都重写 onPause方法来提交未保存的数据,我们也可以在此选择是否暂停线程,广播接收者,这完全依软件架构本身而定。在 onResume中一般不执行太多的代码,创建UI一般在 onCreate或者 onRestoreInstanceState中实现。
     
      以上就是我对生命周期的理解以及整理,希望能帮到大家理解。
      PPT和源码下载 北京天圣达有限公司
  • 相关阅读:
    .NET Core开发实战(第10课:环境变量配置提供程序)--学习笔记
    .NET Core开发实战(第9课:命令行配置提供程序)--学习笔记
    .NET Core开发实战(第8课:配置框架:让服务无缝适应各种环境)--学习笔记
    .NET Core开发实战(第7课:用Autofac增强容器能力)--学习笔记(下)
    .NET Core开发实战(第7课:用Autofac增强容器能力)--学习笔记(上)
    .NET Core开发实战(第6课:作用域与对象释放行为)--学习笔记(下)
    .NET Core开发实战(第6课:作用域与对象释放行为)--学习笔记(上)
    .NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(下)
    .NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(中)
    .NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(上)
  • 原文地址:https://www.cnblogs.com/jasoncc/p/2113314.html
Copyright © 2011-2022 走看看