网络推广网站怎么做,青岛快速网站排名,建工集团两学一做网站,定制建站原文地址 : http://android.xsoftlab.net/training/basics/activity-lifecycle/index.html
导言
用户通过导航退出或者返回应用的时候#xff0c;应用中Activity的生命周期会在不同的状态之间变换。举个例子#xff0c;当Activity初次启动的时候#xff0c;它会来到系统的…原文地址 : http://android.xsoftlab.net/training/basics/activity-lifecycle/index.html
导言
用户通过导航退出或者返回应用的时候应用中Activity的生命周期会在不同的状态之间变换。举个例子当Activity初次启动的时候它会来到系统的前面然后得到用户焦点。在这个过程中Android系统会调用Activity的一系列生命周期函数。如果用户执行了启动另一个Activity的动作或是转换到其它APP上了Android则会调用另一部分的生命周期函数看起来就像是进入了后台(虽然现在这个Activity是完全不可见状态的但是它的状态还是会被完整的保存着)。
在生命周期回调函数中你可以在用户离开或者重新进入Activity时定义Activity的行为。举个例子如果你正在构建一个流媒体播放器当用户转换到其它APP时你可能希望暂停视频播放并暂停网络连接当用户又返回当前的Activity时你希望重新建立网络连接并在原来的位置继续播放视频。
这节课介绍了每个Activity实例的重要生命周期回调函数的回调及如何使用它们。所以当Activity不再使用它们的时候Activity需要释放那些不再会重新使用的资源就像用户所期待的那样。
启动一个Activity
不像其他程序一样App并不是从main()函数启动的。Android系统在Activity的实例中通过调用指定的回调函数进行启动。这样可以确保它们的生命周期状态保持一致。Activity启动的时候有一列按顺序执行的回调函数在终结的时候也有一列的按顺序执行的回调函数。
这节课提供了大多数的生命周期函数概要以及展示在创建一个新的Activity实例时如何处理第一个生命周期函数。
了解生命周期函数
在Activity的生命中系统会按顺序调用核心的生命周期函数集类似一个阶梯状的金字塔。正因为这样Activity的每一个生命周期状态在这个过程都是单独分开的。当系统创建了一个新的Activity实例每一个回调函数都会移动Activity的状态到前一个的顶部。那么在最顶部的状态便是Activity运行在前台的状态并且用户可以直接与它交互。
如果用户开始离开这个Activity系统会调用其它函数来移除刚才的每一个状态以便逐渐销毁这个Activity。在一些例子中Activity的状态会移除一部分然后等待(比如用户将其它APP切换到了前面)等待到activity的状态再一次回到顶部(用户回到了这个Activity)恢复用户离开时的状态。下图是简单的生命周期说明示意图
因为Activity非常复杂你可能没有必要实现所有的生命周期函数。然而懂得每一个生命周期函数是很重要的确保可以通过它们的实现用户所期待的行为方式。可能有几种方式可以通过实现生命周期函数保证APP有良好的行为习惯包括以下
当在使用APP时用户接到电话或者转到别的APP上时确保不要崩溃。当用户不再使用部分资源的时候请及时释放它。当用户离开APP然后又返回APP时不要丢失用户的进度比如输入的文字和看到的视频位置。当屏幕在水平方向或垂直方向旋转时不要丢失用户进度更不要崩溃。
你将会学习接下来的课程这里有一些上图所展示的状态然而这里只列了3种状态也就是说在一个时期内Activity只是在这3个状态中的一个内。
Resumed 在这个状态下activity位于前台并且用户可以直接与它交互。
Paused 在这个状态下activity被其它Activity掩盖了一部分其它Activity位于前台并且是半透明状或者是只掩盖了一部分。在这个状态下activity不再接收用户输入不能执行任何代码。
Stopped 在这个状态下activity完全被隐藏对用户完全不可见。这里考虑到它位于后台。当停止时activity的所有状态信息比如成员变量都会被保留但是不能再执行任何代码。
其它状态(onCreate和onStart)是非常短暂的系统通过调用下一个生命周期函数会非常顺序的从这个状态移动到下一个状态。所以在在系统调用了onCreate()方法只会很快的调用onStart()然后紧接着就是onResume().
这就是最基本的生命周期。现在你将会学习一些特殊的生命周期行为。
指定App的启动Activity
当用户在主屏幕上点击了你应用的图标系统会启动应用内声明了”launcher”的Activity并调用该Activity的onCreate方法。这个Activity就是APP呈现给用户的主入口界面。
你可以在Android的清单文件中声明哪一个Activity是APP的主入口界面AndroidManifest.xml位于工程的根目录内。
APP的主Activity必须在清单文件中以标签 intent-filter声明并且需要包含MAIN行为以及LAUNCHER类别
activity android:name.MainActivity android:labelstring/app_nameintent-filteraction android:nameandroid.intent.action.MAIN /category android:nameandroid.intent.category.LAUNCHER //intent-filter
/activity Note:当你使用Android SDK工具创建了一个新的Android工程时这个默认的工程会在清单文件中包含一个以这种过滤声明的Activity。 如果MAIN行为或者LAUNCHER类别没有在应用的其中一个Activity声明的话那么APP的图标将不会出现在设备的主屏幕应用列表上。
创建一个新的实例
很多APP会包含好几个不同的Activity以便让用户执行不同的行动。当用户点击了APP的启动图标创建了一个主Activity或者是在APP内点击响应按钮启动了别的Activity系统会通过调用onCreate方法创建每一个Activity的实例。
你必须实现onCreate方法来执行一个最基本的应用启动逻辑并且应该在Activity的整个生命周期中只执行一次。举个例子你实现的onCreate()方法应该定义用户界面以及可能要初始化一些类相关变量。
举个例子下面的这个onCreate的例子展示了一些代码来执行一些基础的设置比如声明用户界面定义一些成员变量然后配置一些UI。
TextView mTextView; // Member variable for text view in the layout
Override
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// Set the user interface layout for this Activity// The layout file is defined in the project res/layout/main_activity.xml filesetContentView(R.layout.main_activity);// Initialize member TextView so we can manipulate it latermTextView (TextView) findViewById(R.id.text_message);// Make sure were running on Honeycomb or higher to use ActionBar APIsif (Build.VERSION.SDK_INT Build.VERSION_CODES.HONEYCOMB) {// For the main activity, make sure the app icon in the action bar// does not behave as a buttonActionBar actionBar getActionBar();actionBar.setHomeButtonEnabled(false);}
} Caution:使用SDK_INT预防一些旧的系统运行新的API这样的话老系统会发生运行时错误。 onCreate()方法一旦执行完毕系统会很快的调用onStart和onResume方法。你的系统绝不会驻留在Created状态和Started状态。从技术上将当onStart方法被调用后activity就变得可见但是onResume方法会很快的跟着调用并保持在Resumed状态直到一些事件将它改变比如当接到电话用户转换到了别的APP上又或者设备的屏幕关闭了。
在下面的其它课程中你将会见到如何启动其它方法当activity从Paused或者Stopped状态恢复到Resumed状态时onStart方法和onResume方法在Activity的生命周期中是非常有用的。 Note: onCreate方法会包含一个名叫savedInstanceState的参数我们稍后会在有关Recreating an Activity的课程中讨论。 销毁Activity
activity的第一个生命周期函数是onCreate那么它的最后一个生命周期便是onDestory了。当系统接收到终止信号的时候将会调用这个方法然后将activity完成的从系统内存中移除。
大多数的APP不需要实现这个方法因为本地类引用会随着Activity一起总结不过Activity的清理工作应该放在onPause下或者onStop下。然而不过当你在onCreate中启动了一个后台线程或者其它长时间运行的资源这时如果不适当的清理内存的话可能会造成内存泄露你应该在onDestory中杀死或者关闭它们。
Override
public void onDestroy() {super.onDestroy(); // Always call the superclass// Stop method tracing that the activity started during onCreate()android.os.Debug.stopMethodTracing();
} Note:在所有的情况下系统调用onDestory方法之后已经调用过onPause方法与onStop方法不过有一个例外情况你在onCreate方法中调用了finish方法。在一些例子中当你的Activity临时决定要启动另一个Activity你可能要在onCreate方法内调用finish方法来销毁这个Activity在这种情况下系统会立即调用onDestory方法而不会调用其它任何生命周期方法。