Activity 总结

avtivity继承关系。


概述:

活动是一个单一的、集中,用户可以做的事情。几乎所有的活动与用户交互,所以活动类负责创建一个窗口,你可以将你的UI setContentView(视图)。虽然活动往往是向用户提供全屏窗口,也可以用在其他方面:浮动窗口(通过一组主题与windowIsFloating)或嵌入到另一个活动(使用ActivityGroup)。有两个方法,几乎所有的子类活动将实现:

onCreate(包)就是你初始化活动。这里最重要的是,你通常会叫setContentView(int)布局资源定义UI,并使用findViewById(int)来检索该UI小部件,您需要以编程的方式进行交互。

onPause()你就是处理用户离开你的活动。最重要的是,用户所做的任何更改在这一点上应该承诺(通常ContentProvider控股数据)。

与Context.startActivity使用(),所有活动的类必须有一个相应的包的AndroidManifest.xml <活动>声明。

开发人员指南:

活动类是应用程序的一个重要组成部分的整体生命周期,和活动的启动方式,整合是一项基本平台的应用程序模型的一部分。详细的角度在Android应用程序的结构和活动的行为方式,请阅读应用基础和任务并返回堆栈开发者指南。

你还可以找到一个详细讨论如何创建活动活动开发人员指南。

片段

从蜂窝、活动片段类的实现可以使用更好的模块化代码,构建更复杂的用户界面大屏幕,并帮助规模应用小和大屏幕之间。

活动的生命周期

活动管理系统中的一个活动堆栈。当开始一个新的活动时,放在堆栈的顶部,成为下面的运行活动——前面的活动总是在堆栈,并且不会再次来前台,直到新活动退出。

一个活动本质上是四个州:

如果一个活动的前景屏幕(在堆栈的顶部),或运行具有积极的意义。

如果一个活动失去了焦点,但仍可见(即新non-full-sized或透明活动关注你的活动),这是停了下来。暂停活动完全活着(它维护所有州和成员信息和仍然附着在窗口管理器),但可以被系统在极端低内存的情况。

如果一个活动是完全被另一个活动,它停止。它仍然保留所有州和成员信息,然而,它不再是用户可见的,所以它的窗口隐藏时,它经常会被系统记忆是必要的。

如果一个活动暂停或停止,系统可以把活动与记忆,要求它完成,或者仅仅是杀死它的过程。当它再次显示给用户,它必须完全重新启动,还原到以前的状态。

下面的图显示了一个活动的重要状态路径。广场的矩形表示可以实现的回调方法执行操作时,活动状态之间的移动。彩色的椭圆是主要的国家可以在活动。

State diagram for an Android Activity Lifecycle.




有三个关键的循环监测在你的活动:你可能会感兴趣


一个活动的整个生命周期发生在第一次调用onCreate(包)到一个最终调用onDestroy()。“全球”的活动将完成所有设置在onCreate(),并释放所有剩余资源onDestroy()。例如,如果它有一个线程在后台运行从网络下载数据,它可能在onCreate()创建的线程,然后停止线程onDestroy()。
可见的一生活动的发生之间的调用onStart()到相应的调用来onStop()。在此期间,用户可以看到屏幕上的活动,虽然它可能不是在前景和与用户进行交互。这两种方法之间你可以保持资源需要向用户显示的活动。例如,您可以注册一个BroadcastReceiver onStart()监测的变化,影响你的UI,并注销onStop()当用户不再看到你显示。要()和onStop()方法可以调用多次,随着活动变得可以隐藏或显示给用户。
前台调用onResume之间一生的活动发生的(),直到一个相应的调用onPause()。在这段时间里前面的活动是所有其他活动和与用户进行交互。之间的一个活动经常可以恢复和暂停状态——例如当设备进入睡眠状态,当一个活动的结果是,当一个新的目的是交付,所以这些方法中的代码应该是轻量级的。
整个生命周期的活动被定义为以下活动的方法。所有这些都是钩子,可以覆盖活动改变状态时做适当的工作。所有活动将实现onCreate(包)做他们的初始设置;许多也将实现onPause()提交更改数据,否则准备停止与用户进行交互。你应该打电话给你的超类在实现这些方法。


 public class Activity extends ApplicationContext {
<p class="tgt" style="margin-top: 0px; margin-bottom: 0.4em; padding-top: 0px; padding-bottom: 0px; border: 0px; font-size: 14px; line-height: 21px; color: rgb(43, 43, 43); font-family: arial, sans-serif; background-color: rgb(250, 250, 250);">第一次被创建时调用活动。这就是你应该做你所有的正常的静态设置:创建视图,将数据绑定到列表,等。这种方法还为您提供了一个包,其中包含的活动之前冻结状态,如果有一个。总是跟着onStart()。</p>     protected void onCreate(Bundle savedInstanceState);
<span style="color: rgb(43, 43, 43); font-family: arial, sans-serif; font-size: 14px; line-height: 21px; background-color: rgb(250, 250, 250);"></span><p class="tgt" style="margin-top: 0px; margin-bottom: 0.4em; padding-top: 0px; padding-bottom: 0px; border: 0px; font-size: 14px; line-height: 21px; color: rgb(43, 43, 43); font-family: arial, sans-serif; background-color: rgb(250, 250, 250);">称为活动停止后,再次开始之前对其进行。总是跟着onStart()</p>     protected void onStart(); <span style="font-family: arial, sans-serif; background-color: rgb(250, 250, 250);"></span><p class="tgt" style="margin-top: 0px; margin-bottom: 0.4em; padding-top: 0px; padding-bottom: 0px; border: 0px; font-size: 14px; line-height: 21px; color: rgb(43, 43, 43); font-family: arial, sans-serif; background-color: rgb(250, 250, 250);">时调用活动正变得对用户可见。随后onResume()如果活动涉及到前台,或onStop()如果隐藏。</p>     protected void onRestart();
<span style="color: rgb(43, 43, 43); font-family: arial, sans-serif; font-size: 14px; line-height: 21px; white-space: pre; background-color: rgb(250, 250, 250);">时调用活动将开始与用户进行交互。在这一点上你的活动堆栈顶部的活动,用户输入要。总是跟着onPause()。</span>
     protected void onResume();
<p class="tgt" style="margin-top: 0px; margin-bottom: 0.4em; padding-top: 0px; padding-bottom: 0px; border: 0px; font-size: 14px; line-height: 21px; color: rgb(43, 43, 43); font-family: arial, sans-serif; background-color: rgb(250, 250, 250);">系统即将开始时调用恢复以前的活动。这通常用于提交未保存的更改持久化数据,停止动画和其他事情可能消耗的CPU,等。该方法的实现必须很快,因为下一个活动将不会恢复,直到该方法返回。</p><p class="tgt" style="margin-top: 0px; margin-bottom: 0.4em; padding-top: 0px; padding-bottom: 0px; border: 0px; font-size: 14px; line-height: 21px; color: rgb(43, 43, 43); font-family: arial, sans-serif; background-color: rgb(250, 250, 250);">其次是要么onResume()如果活动返回回到前面,或onStop()如果它变成无形的给用户。</p>     protected void onPause();<p class="tgt" style="margin-top: 0px; margin-bottom: 0.4em; padding-top: 0px; padding-bottom: 0px; border: 0px; font-size: 14px; line-height: 21px; color: rgb(43, 43, 43); font-family: arial, sans-serif; background-color: rgb(250, 250, 250);"></p><p class="tgt" style="margin-top: 0px; margin-bottom: 0.4em; padding-top: 0px; padding-bottom: 0px; border: 0px; font-size: 14px; line-height: 21px; color: rgb(43, 43, 43); font-family: arial, sans-serif; background-color: rgb(250, 250, 250);">时调用活动不再是用户可见的,因为另一个活动已经恢复,包括这一个。这可能发生因为正在开始一个新的活动,现有一个被面前这一个,或被摧毁。</p><p class="tgt" style="margin-top: 0px; margin-bottom: 0.4em; padding-top: 0px; padding-bottom: 0px; border: 0px; font-size: 14px; line-height: 21px; color: rgb(43, 43, 43); font-family: arial, sans-serif; background-color: rgb(250, 250, 250);">其次是要么onRestart()如果回到这个活动与用户交互,或者onDestroy()如果这个活动。</p>

protected void onStop(); 最后叫你接收前活动被摧毁。这可以发生,因为活动完成(有人称为完成(),或因为系统暂时破坏这个实例的活动来节省空间。你可以区分这两个场景isFinishing()方法。 protected void onDestroy(); }
</pre><pre name="code" class="html"><span style="font-size: 14px;">注意“Killable”列在上面的表——那些被标记为Killable的方法,该方法返回后流程主办活动可能在任何时间被系统未经另一行代码被执行。由于这个原因,您应该使用onPause()方法编写任何持久数据存储(如用户编辑)。此外,仅有的方法(包)将活动在这样一个背景状态之前,允许你保存了任何动态实例状态活动到给定的包,后来收到在onCreate(包),如果活动需要重建。有关更多信息,请参见流程生命周期部分流程的生命周期是如何与活动举办。注意,重要的是要持久数据保存在onPause()而不是仅有(包),因为后者不属于生命周期回调,所以不会被称为在任何情况下所描述的文档。


注意,这些语义将改变应用程序之间稍微目标平台从蜂巢平台之前与这些目标。从蜂巢,应用程序不在killable状态直到onStop()返回。这影响当onSaveInstanceState(包)可能被称为(可能后安全叫onPause()和允许和应用程序安全等到onStop()来保存持久状态。


对于那些没有标记的方法killable,活动的过程中不会被系统从方法被调用时,它返回后继续。因此killable状态的活动,例如,在之后onPause onResume开始()()。


</span><span style="font-size:24px;">配置更改</span><span style="font-size: 14px;">


如果设备的配置(定义的资源。配置类)的变化,然后任何显示用户界面需要更新以匹配配置。因为活动是与用户交互的主要机制,它包括特殊支持处理配置更改。


除非特别指定,否则配置更改(如屏幕方向改变,语言,输入设备,等等)将导致您的当前活动被摧毁,经历的正常活动生命周期过程onPause(),onStop(),和onDestroy()。如果活动已经在前台或可见的用户,一旦onDestroy()在该实例的一个新实例将创建活动,无论savedInstanceState前面的实例从onSaveInstanceState生成(包)。


这样做是由于任何应用程序资源,包括布局文件,可以根据任何配置更改的值。因此处理配置更改的唯一安全的方法是re-retrieve所有资源,包括布局,画板,和字符串。因为活动必须已经知道如何拯救国家和重建自己的国家,这是一个方便的方式有一个活动重新开始自己新的配置。


在一些特殊的情况下,您可能想要绕过重启你的活动基于一个或多个类型的配置更改。这是完成了android:configChanges属性清单。对于任何类型的配置更改你说你处理,你将收到一个调用当前活动的onConfigurationChanged(配置)方法,而不是重新启动。如果配置更改涉及到任何你不处理,然而,活动仍将重新启动和onConfigurationChanged(配置)将不会被调用。


</span><span style="font-size:24px;">开始活动并得到结果</span><span style="font-size: 14px;">


startActivity(意图)方法用于启动一个新活动,它将被放置在顶部的活动堆栈。这需要一个参数,一个意图,描述要执行的活动。


有时你想要从一个活动结束时的结果。例如,您可能会开始一个活动,让用户选择一个人在一个联系人列表;当它结束时,它将返回被选中的人。要做到这一点,您调用startActivityForResult(意图,int)版本与第二个整数参数识别。结果会回来通过onActivityResult(int,int,意图)方法。


当一个活动退出时,它可以调用setResult(int)返回数据回其母。它必须提供一个结果代码,可RESULT_CANCELED标准的结果,从RESULT_FIRST_USER RESULT_OK,或任何自定义值。此外,它可以返回一个包含任何额外的数据的目的。所有这些信息似乎回到了父母的Activity.onActivityResult(),连同它最初提供的整数标识符。


如果一个孩子活动由于某种原因失败(比如崩溃),父RESULT_CANCELED活动将获得的结果代码。
</span>
<span style="font-size: 14px;">
</span>
<span style="font-size: 14px;"></span><pre class="prettyprint" style="font-size: 13px; margin-top: 0px; margin-bottom: 1em; color: rgb(0, 102, 0); font-stretch: normal; line-height: 1.5; padding: 1em; overflow: auto; border: 1px solid rgb(221, 221, 221); background: rgb(247, 247, 247);"><span class="kwd" style="color: rgb(0, 0, 136);">public</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="kwd" style="color: rgb(0, 0, 136);">class</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="typ" style="color: rgb(102, 0, 102);">MyActivity</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="kwd" style="color: rgb(0, 0, 136);">extends</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="typ" style="color: rgb(102, 0, 102);">Activity</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="pun" style="color: rgb(102, 102, 0);">{</span><span class="pln" style="color: rgb(0, 0, 0);">
     </span><span class="pun" style="color: rgb(102, 102, 0);">...</span><span class="pln" style="color: rgb(0, 0, 0);">

     </span><span class="kwd" style="color: rgb(0, 0, 136);">static</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="kwd" style="color: rgb(0, 0, 136);">final</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="kwd" style="color: rgb(0, 0, 136);">int</span><span class="pln" style="color: rgb(0, 0, 0);"> PICK_CONTACT_REQUEST </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="lit" style="color: rgb(0, 102, 102);">0</span><span class="pun" style="color: rgb(102, 102, 0);">;</span><span class="pln" style="color: rgb(0, 0, 0);">

     </span><span class="kwd" style="color: rgb(0, 0, 136);">protected</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="kwd" style="color: rgb(0, 0, 136);">boolean</span><span class="pln" style="color: rgb(0, 0, 0);"> onKeyDown</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="kwd" style="color: rgb(0, 0, 136);">int</span><span class="pln" style="color: rgb(0, 0, 0);"> keyCode</span><span class="pun" style="color: rgb(102, 102, 0);">,</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="typ" style="color: rgb(102, 0, 102);">KeyEvent</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="kwd" style="color: rgb(0, 0, 136);">event</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="pun" style="color: rgb(102, 102, 0);">{</span><span class="pln" style="color: rgb(0, 0, 0);">
         </span><span class="kwd" style="color: rgb(0, 0, 136);">if</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="pln" style="color: rgb(0, 0, 0);">keyCode </span><span class="pun" style="color: rgb(102, 102, 0);">==</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="typ" style="color: rgb(102, 0, 102);">KeyEvent</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln" style="color: rgb(0, 0, 0);">KEYCODE_DPAD_CENTER</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="pun" style="color: rgb(102, 102, 0);">{</span><span class="pln" style="color: rgb(0, 0, 0);">
             </span><span class="com">// When the user center presses, let them pick a contact.</span><span class="pln" style="color: rgb(0, 0, 0);">
             startActivityForResult</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="pln" style="color: rgb(0, 0, 0);">
                 </span><span class="kwd" style="color: rgb(0, 0, 136);">new</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="typ" style="color: rgb(102, 0, 102);">Intent</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="typ" style="color: rgb(102, 0, 102);">Intent</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln" style="color: rgb(0, 0, 0);">ACTION_PICK</span><span class="pun" style="color: rgb(102, 102, 0);">,</span><span class="pln" style="color: rgb(0, 0, 0);">
                 </span><span class="kwd" style="color: rgb(0, 0, 136);">new</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="typ" style="color: rgb(102, 0, 102);">Uri</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="str" style="color: rgb(136, 0, 0);">"content://contacts"</span><span class="pun" style="color: rgb(102, 102, 0);">)),</span><span class="pln" style="color: rgb(0, 0, 0);">
                 PICK_CONTACT_REQUEST</span><span class="pun" style="color: rgb(102, 102, 0);">);</span><span class="pln" style="color: rgb(0, 0, 0);">
            </span><span class="kwd" style="color: rgb(0, 0, 136);">return</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="kwd" style="color: rgb(0, 0, 136);">true</span><span class="pun" style="color: rgb(102, 102, 0);">;</span><span class="pln" style="color: rgb(0, 0, 0);">
         </span><span class="pun" style="color: rgb(102, 102, 0);">}</span><span class="pln" style="color: rgb(0, 0, 0);">
         </span><span class="kwd" style="color: rgb(0, 0, 136);">return</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="kwd" style="color: rgb(0, 0, 136);">false</span><span class="pun" style="color: rgb(102, 102, 0);">;</span><span class="pln" style="color: rgb(0, 0, 0);">
     </span><span class="pun" style="color: rgb(102, 102, 0);">}</span><span class="pln" style="color: rgb(0, 0, 0);">

     </span><span class="kwd" style="color: rgb(0, 0, 136);">protected</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="kwd" style="color: rgb(0, 0, 136);">void</span><span class="pln" style="color: rgb(0, 0, 0);"> onActivityResult</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="kwd" style="color: rgb(0, 0, 136);">int</span><span class="pln" style="color: rgb(0, 0, 0);"> requestCode</span><span class="pun" style="color: rgb(102, 102, 0);">,</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="kwd" style="color: rgb(0, 0, 136);">int</span><span class="pln" style="color: rgb(0, 0, 0);"> resultCode</span><span class="pun" style="color: rgb(102, 102, 0);">,</span><span class="pln" style="color: rgb(0, 0, 0);">
             </span><span class="typ" style="color: rgb(102, 0, 102);">Intent</span><span class="pln" style="color: rgb(0, 0, 0);"> data</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="pun" style="color: rgb(102, 102, 0);">{</span><span class="pln" style="color: rgb(0, 0, 0);">
         </span><span class="kwd" style="color: rgb(0, 0, 136);">if</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="pln" style="color: rgb(0, 0, 0);">requestCode </span><span class="pun" style="color: rgb(102, 102, 0);">==</span><span class="pln" style="color: rgb(0, 0, 0);"> PICK_CONTACT_REQUEST</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="pun" style="color: rgb(102, 102, 0);">{</span><span class="pln" style="color: rgb(0, 0, 0);">
             </span><span class="kwd" style="color: rgb(0, 0, 136);">if</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="pln" style="color: rgb(0, 0, 0);">resultCode </span><span class="pun" style="color: rgb(102, 102, 0);">==</span><span class="pln" style="color: rgb(0, 0, 0);"> RESULT_OK</span><span class="pun" style="color: rgb(102, 102, 0);">)</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="pun" style="color: rgb(102, 102, 0);">{</span><span class="pln" style="color: rgb(0, 0, 0);">
                 </span><span class="com">// A contact was picked.  Here we will just display it</span><span class="pln" style="color: rgb(0, 0, 0);">
                 </span><span class="com">// to the user.</span><span class="pln" style="color: rgb(0, 0, 0);">
                 startActivity</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="kwd" style="color: rgb(0, 0, 136);">new</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="typ" style="color: rgb(102, 0, 102);">Intent</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="typ" style="color: rgb(102, 0, 102);">Intent</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln" style="color: rgb(0, 0, 0);">ACTION_VIEW</span><span class="pun" style="color: rgb(102, 102, 0);">,</span><span class="pln" style="color: rgb(0, 0, 0);"> data</span><span class="pun" style="color: rgb(102, 102, 0);">));</span><span class="pln" style="color: rgb(0, 0, 0);">
             </span><span class="pun" style="color: rgb(102, 102, 0);">}</span><span class="pln" style="color: rgb(0, 0, 0);">
         </span><span class="pun" style="color: rgb(102, 102, 0);">}</span><span class="pln" style="color: rgb(0, 0, 0);">
     </span><span class="pun" style="color: rgb(102, 102, 0);">}</span><span class="pln" style="color: rgb(0, 0, 0);">
 </span><span class="pun" style="color: rgb(102, 102, 0);">}</span>

保存持久状态

通常有两种类型的持久状态不是一个活动将处理:共享太像数据(通常存储在一个SQLite数据库使用内容提供者)和内部状态,如用户首选项。

对于内容提供者数据,我们建议使用“编辑”活动用户模型。即任何编辑用户实际上是立即无需额外的确认步骤。支持这个模型通常是一个简单的两条规则:

在创建一个新文档时,支持立即或文件创建数据库条目。例如,如果用户选择编写一个新的电子邮件,一个新的条目,创建电子邮件就开始输入数据,这样,如果他们去任何其他活动后,点这个草案的电子邮件将出现在列表中。

当某个活动的onPause()方法被调用时,它应该致力于支持内容提供程序或文件的任何更改用户了。这将确保这些变化会被即将运行的任何其他活动。你可能会想提交您的数据更积极在关键时刻在你活动的生命周期:例如在开始一个新的活动,完成你自己的活动之前,当用户输入字段之间的切换等。

这个模型的目的是防止数据丢失当用户导航活动之间,并允许系统安全地杀死一个活动(因为系统资源需要别的地方)在任何时间后停了下来。请注意这意味着用户迫切的从你的活动并不意味着“取消”——这意味着离开当前的活动内容的保存。取消编辑在一个活动必须提供通过其他机制,如一个显式的“恢复”或“取消”选项。

看到更多信息内容提供商的内容包。这是怎样的一个关键方面不同的活动之间的调用和传播数据本身。

活动类还提供了一个API来管理内部持久状态与活动有关。这可以被使用,例如,要记住用户的首选初始显示在日历(天视图或星期视图)或用户的默认主页在web浏览器中。

活动持久状态管理方法getPreferences(int),允许您检索和修改一套与活动相关联的名称/值对。使用偏好跨多个应用程序共享的组件(活动、接收器、服务提供者),您可以使用底层Context.getSharedPreferences()方法检索首选项对象存储在一个特定的名字。(注意,是不可能共享设置数据在应用程序包,你需要一个内容提供者)。

以下是摘自一个日历活动,将用户的首选视图模式存储在其持续的设置:

public class CalendarActivity extends Activity {
     ...

     static final int DAY_VIEW_MODE = 0;
     static final int WEEK_VIEW_MODE = 1;

     private SharedPreferences mPrefs;
     private int mCurViewMode;

     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);

         SharedPreferences mPrefs = getSharedPreferences();
         mCurViewMode = mPrefs.getInt("view_mode", DAY_VIEW_MODE);
     }

     protected void onPause() {
         super.onPause();
 
         SharedPreferences.Editor ed = mPrefs.edit();
         ed.putInt("view_mode", mCurViewMode);
         ed.commit();
     }
 }
 
权限


的能力开始时可以执行一个特定活动清单的<活动>标记中声明。通过这样做,其他应用程序将需要声明一个相应的< uses-permission >元素的清单能够开始活动。


当开始一个活动你可以设置意图。FLAG_GRANT_READ_URI_PERMISSION和/或意图。FLAG_GRANT_WRITE_URI_PERMISSION意图。这将给予活动访问特定uri的意图。访问将继续,直到活动结束(它仍将在举办过程被杀和其他临时毁灭)。姜饼,如果和一个新的目的是创建的活动已经被送到onNewIntent(意图),任何新授予的URI权限将被添加到现有的。


有关更多信息,请参见安全与权限的文档权限和安全。


进程生命周期


Android系统试图保持应用程序进程尽可能长时间,但最终将需要删除旧的流程当内存低运行。活动生命周期,所述的决策过程将密切与用户的交互的状态。总的来说,有四个州可以在基于活动运行过程,这里列出的顺序的重要性。系统将杀死那么重要流程(最后一个)之前,度假村杀死进程(第一的)更重要。


前台活动(该活动的顶部屏幕用户当前交互)被认为是最重要的。其过程只会被作为最后的手段,如果它比可在设备上使用更多的内存。通常此时设备已经达到了一个内存分页状态,所以这是需要为了保持用户界面的响应性。
可见活动(活动是用户可见的,但不是在前台,如一个坐在前台对话框)被认为是极其重要的,不会被杀死,除非需要保持前台活动运行。
背景活动(活动用户不可见,已经暂停)不再是关键,所以安全系统可能杀死其过程为其他前景或可见进程回收内存。如果进程需要被杀死时,当用户导航回活动(再次使它在屏幕上可见),其onCreate(包)方法将称为savedInstanceState它先前提供的仅有(包),以便它可以重新启动在同一个州去年把它作为用户。
一个空进程是一个举办任何活动或其他应用程序组件(比如服务或BroadcastReceiver类)。这些都是很快死于系统内存就低。出于这个原因,活动以外的任何后台操作你必须执行上下文中的一个活动BroadcastReceiver或服务以确保系统知道它需要保持你的过程。
有时一个活动可能需要做一个长时间运行的操作,存在独立活动的生命周期。一个例子可能是一个相机的应用程序,允许你上传照片到网站。上传可能需要很长时间,应用程序应该允许用户离开应用程序将执行。为了实现这一点,您的活动应该开始一个服务的上传。这允许系统适当地优化您的过程”(考虑到它是更重要的比其他的时候应用程序)的时间上传,独立于原来的活动是否停了下来,停了下来,或完成。

 











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值