Android梳理 Activity

来源:互联网 发布:淘宝网休闲运动套装 编辑:程序博客网 时间:2024/04/28 17:47

要了解Activity,首先要要了解其生命周期,官网又出新图了,这张图更形象,有时间可以多看看官网,是最权威的

看起来形象吧,启动过程像爬梯子一样,当到Resumed的时候代表用户可以看见界面并进行操作了,其他生命周期用户都不能直接和Activiy交互。

这的有个列子:泥煤,我怎么没找到附件上传,又百度盘吧

链接: http://pan.baidu.com/s/1i5HFAW9 密码: rx2d

可以看看大神是怎么写代码的。

官网都总结的得很好,我也就无耻的copy了

根据Activity的复杂程度,您可能不需要实现所有生命周期方法。 但是,了解每个方法并实现确保您的应用按照用户期望的方式运行的方法非常重要。 正确实现您的Activity生命周期方法可确保您的应用按照以下几种方式良好运行,包括:

如果用户在使用您的应用时接听来电或切换到另一个应用,它不会崩溃。

在用户未主动使用它时不会消耗宝贵的系统资源。

如果用户离开您的应用并稍后返回,不会丢失用户的进度。

当屏幕在横向和纵向之间旋转时,不会崩溃或丢失用户的进度。


有Activity会在图 中所示不同状态之间过渡的几种情况。 但是,这些状态中只有三种可以是静态。 也就是说,Activity只能在三种状态之一下存在很长时间。

继续

在这种状态下,Activity处于前台,且用户可以与其交互。(有时也称为“运行”状态。)

暂停

在这种状态下,Activity被在前台中处于半透明状态或者未覆盖整个屏幕的另一个Activity—部分阻挡。 暂停的Activity不会接收用户输入并且无法执行任何代码。

停止

在这种状态下,Activity被完全隐藏并且对用户不可见;它被视为处于后台。 停止时,Activity实例及其诸如成员变量等所有状态信息将保留,但它无法执行任何代码。

其他状态(“创建”和“开始”)是瞬态,系统会通过调用下一个生命周期回调方法从这些状态快速移到下一个状态。 也就是说,在系统调用 onCreate() 之后,它会快速调用 onStart(),紧接着快速调用 onResume()。


每个程序都会有一个入口,就是按下启动图标启动的activity,一般我们设置的欢迎界面

<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>
改变程序的APP的启动图标和名字,在application修改。label代表显示名称,icon代表显示的图标

  <application android:label="@string/app_name"        android:icon="@drawable/ic_launcher">

有点童鞋可能遇到程序启动的时候会出现一段黑屏,在显示界面,这是由于Activity在onCreated会消耗一段时间,所以尽量少在那处理一些耗时操作,实在要处理就开一个线程。当然还是会出现,那怎么办呢,我一般处理的方法是,给当前Activity设置主题(也可以直接设置到application上),额,下面的就是些主题:

activity设置对话框:

<activity android:theme="@android:style/Theme.Dialog">

activity设置一个透明背景:

<activity android:theme="@android:style/Theme.Translucent">
主题是可以继承的,这里就不谈了。一般白色主题和透明主题都可以了,这样给用户看起来就觉得只是启动慢点点而已,不会出现黑屏一下在启动界面。

在正常使用app时,前端的activity有时会被其他可见的组件阻塞(obstructed),从而导致当前的activity进入Pause状态。例如,当打开一个半透明的activity时(例如以对话框的形式),之前的activity会被暂停。 只要之前的activity仍然被部分可见,这个activity就会一直处于Paused状态。

然而,一旦之前的activity被完全阻塞并不可见时,则其会进入Stop状态。

activity一旦进入paused状态,系统就会调用activity中的onPause()方法, 该方法中可以停止不应该在暂停过程中执行的操作,如暂停视频播放;或者保存那些有可能需要长期保存的信息。如果用户从暂停状态回到当前activity,系统应该恢复那些数据并执行onResume()方法。

onPuse方法我们一般做这些事情:

停止动画或者是其他正在运行的操作,那些都会导致CPU的浪费.
提交在用户离开时期待保存的内容(例如邮件草稿).
释放系统资源,例如broadcast receivers, sensors (比如GPS), 或者是其他任何会影响到电量的资源。

如果是把用户信息保持到数据库上,那不要再onPuse中做,在onStop中做这些事情,因为onPuse执行完后才会去启动下一个activity,那用户用户就会觉得,咦,我点了下一个界面,怎么没跳呢。

当用户从Paused状态恢复activity时,系统会调用onResume()方法。系统每次调用这个方法时,activity都处于前台,包括第一次创建的时候。所以,应该实现onResume()来初始化那些在onPause方法里面释放掉的组件,并执行那些activity每次进入Resumed state都需要的初始化动作 (例如开始动画与初始化那些只有在获取用户焦点时才需要的组件)

当用户切换会之前的的Activity是按这个顺序

Activity销毁时调用onDestory方法,但是当Activity是被系统直接杀死的不会调用onDestory,所以我们要调用onStop()来释放资源,从而避免内存泄漏,这点注意了,我以前也没注意,好多写内存泄露总结也没提及到这点。

如果Activity被意外停止,而我们又需要恢复到以前的状态。我们可以调用onSaveinstanceState方法,这个方法会传递一个bundle对象,我们可以把需要保存的信息,保存到bundle中,

在Activity被重建的时候,因为是意外停止的,系统中会有记录,这个时候重建Activity,系统调用onCreate和onRestoreInstanceState会传递之前保存的bundle对象。

我们可以取出bundle中存储的数据恢复界面,两个方法恢复都可以,在onCreate方法中要判断bundle是否为空,不为空时代表是需要恢复的,在onRestoreInstanceState中去恢复

就不用判断了,只有bundle有数据才会调用此方法,此方法在onstart后调用。

注意只有系统任务可能被重建的Acctivity系统才会调用onSaveInstanceState方法,如果只是退栈操作,就比如按了个back键,主动退出的就不操心了。







0 0
原创粉丝点击