GVKun编程网logo

Android Widget生命周期(statefulwidget生命周期)

11

在这里,我们将给大家分享关于AndroidWidget生命周期的知识,让您更了解statefulwidget生命周期的本质,同时也会涉及到如何更有效地android-生命周期和GC、android@a

在这里,我们将给大家分享关于Android Widget生命周期的知识,让您更了解statefulwidget生命周期的本质,同时也会涉及到如何更有效地android - 生命周期和 GC、android @android:Theme.Dialog 和 @android:Widget.Button找不到、Android Fragment生命周期——多屏幕支持、Android Fragment生命周期图以及Activity与Fragment生命周期对照图的内容。

本文目录一览:

Android Widget生命周期(statefulwidget生命周期)

Android Widget生命周期(statefulwidget生命周期)

在扩展appwidgetprovider的我的widget类中,我有一些包含数据的静态最终ArrayLists.我的Widget中有一些按钮,当按下时会导致在类中调用onReceive.我注意到有时ArrayLists在运行onReceive时会丢失它们的值(为空),但大多数时候它们都有预期的数据.

ArrayList在此上下文中是否可以安全使用?是否有任何窗口小部件生命周期事件会导致列表重新实例化.我发现很难找到有关Widget Lifecycle事件的任何文档.

解决方法

Is the ArrayList safe to use in this context?

否.如果您的应用程序没有其他任何内容正在运行,则您的进程可能会在onUpdate()调用之间终止.

Is there any widget lifecycle events that would cause the list to be re instantiated.

您的流程已终止.

I am finding it very hard to find any documentation on Widget Lifecycle events.

那是因为你的思维方式没有生命周期.

appwidgetprovider是一个清单注册的broadcastReceiver.清单注册的broadcastReceiver仅在其onReceive()调用时生存.生活在该范围之外的任何东西,例如静态数据成员,都是可靠的.

请将您的信息存储在文件或数据库中.

android - 生命周期和 GC

android - 生命周期和 GC

* 在屏幕的前台(Activity 栈顶),叫做活动状态或者运行状态(active or running)

* 如果一个 Activity 失去焦点,但是依然可见(一个新的非全屏的 Activity 或者一个透明的 Activity 被放置在栈顶),叫做暂停状态(Paused)。一个暂停状态的 Activity 依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被杀掉。

* 如果一个 Activity 被另外的 Activity 完全覆盖掉,叫做停止状态(Stopped)。它依然保持所有状态和成员信息,但是它不再可见,所以它的窗口被隐藏,当系统内存需要被用在其他地方的时候,Stopped 的 Activity 将被杀掉。

* 如果一个 Activity 是 Paused 或者 Stopped 状态,系统可以将该 Activity 从内存中删除,Android 系统采用两种方式进行删除,要么要求该 Activity 结束,要么直接杀掉它的进程。当该 Activity 再次显示给用户时,它必须重新开始和重置前面的状态


    onCreate

    onStart

    onRestart

    onResume

    onFreeze

    onPause

    onStop

    onDestroy

    

在 Android 操作系统中,每个 Dalvik VM 的每个 Instance 都对应于 Linux 内核中的一个进程    

* 当 Android 应用程序退出时,并不清理其所占用的内存,Linux 内核进程也相应的继续存在,所谓 “退出但不关闭”。从而使得用户调用程序时能够在第一时间得到响应。

* 当系统内存不足时,系统将激活内存回收过程。


为了不因内存回收影响用户体验(如杀死当前的活动进程),Android 基于进程中运行的组件及其状态规定了默认的五个回收优先级:


    MPORTANCE_FOREGROUND:

    IMPORTANCE_VISIBLE:

    IMPORTANCE_SERVICE:

    IMPORTANCE_BACKGROUND:

    IMPORTANCE_EMPTY:


当 Android 系统处于不同的内存状况时,会启用不同级别的内存 GC 机制,参看 http://www.ibm.com/developerworks/cn/opensource/os-cn-android-mmry-rcycl/




android @android:Theme.Dialog 和 @android:Widget.Button找不到

android @android:Theme.Dialog 和 @android:Widget.Button找不到

android @android :Theme.Dialog 和 @android :Widget.Button找不到是什么回事?

Android Fragment生命周期——多屏幕支持

Android Fragment生命周期——多屏幕支持

在使用Fragment之前,Fragment的生命周期是一个需要关心的问题。目前,要想在Android上开发出一款APP必须得考虑到“碎片化”的问题,或者说必须考虑多屏幕适配,这是每一个开发者都必须面对的问题。

现在市场上手机的屏幕分辨率、尺寸五花八门,更糟糕的是,除了手机外还有平板!我们都清楚,就单单屏幕尺寸来说手机和平板差异很大。所以,当我们开发应用程序的时候,要谨记我们的APP应该能适用于不同的设备上而且必须达到最优效果,这样才能确保获得更佳用户体验。于是问题就产生了,我们需要调整应用在手机和平板上显示相同的效果,也就是现在所说的多屏幕适配。在之前的一篇帖子里,我已经讲了怎么用Android的一些特性做多屏幕支持,比如创建不同的布局文件等等。这个方式现在也还可以这么做,但是已经不能满足我们的要求了。

一个经典的例子是,应用中有一个列表,用户点击列表条目就可以显示详细信息。这种情况下,我们可以使应用在手机和平板上有不同的体验效果。在手机上需要两个Activity来完成这个功能,如图:

当用户点击后,出现的界面是这样的:

而在平板上,我们我们需要好好利用屏幕,把列表和详情显示在一起,如图:

从上面的例子我们清楚地看到,我们需要一个方法去“合并Activity”,让其中一个Activity调用另一个时,两个Activity都能同时或者先后显示。我们需要在不重写代码的情况下重新组织界面布局,而仅仅使用多布局来做是不行的,我们需要别的技术。

Fragment

在Android3.0上引入了一个新概念叫Fragment。它有自己的布局文件,可以作为组件排布,也可以相互组合去实现不同的布局显示。使用Fragment可以重复利用代码,并且可以满足不同设备尺寸的需求。Fragment不能单独存在,只能存在于Activity中,而一个Activity可以拥有多个Fragment。很重要的一点是,Fragment可以和Activity中的其它组件一起使用,无需重写所有Activity的接口。所以使用Fragment就可以这样来完成上例中“主界面—详细界面”的APP需求。

在手机上是这样显示的:

而在平板上是这样的:

Fragment生命周期

既然我们已经知道了Fragment很好用,那么我们也需要知道它的工作原理。Fragment只能存在于(作为容器的)Activity中,每一个Fragment都有自己的视图结构,可以像我们之前那样载入布局。Fragment的生命周期更加复杂,因为它有更多的状态,如图:

我们来看一下Fragment完整的生命周期。

  • 在Fragment生命周期开始,onInflate方法被调用。要注意的是,这个方法只在我们直接用标签在布局文件中定义的时候才会被调用。我们可以在这个方法中保存一些在xml布局文件中定义的配置参数和一些属性。
  • 这一步过后就轮到onAttach被调用了。这个方法在Fragment绑定到它的父Activity中的时候被调用,我们可以在这里保存它和Activity之间的引用。
  • 之后onCreate会被调用。这是最重要的步骤之一。Fragment就是在这一步中产生的,可以用这个方法来启动其它线程来检索数据,比如从远程服务器中启动。
  • onCreateView这个方法是在Fragment创建自己的视图结构的时候被调用,在这个方法中我们会载入Fragment的布局文件,就像我们在ListView控件中载入布局一样。在这个过程中,我们不能保证父Activity是否已经创建,所以有一些操作我们不能在这里完成。
  • 可以看到,在onActivityCreated后Activity才算是建立完成。到这一步,我们的Activity就创建成功并激活了。我们可以随时使用它了。
  • 下一步就是onStart了,在这里我们做的事和Activity中的onStart一样,在这个方法中Fragment虽然可以显示,但是还不能和用户进行交互,只有在onResume后Fragment才能开始和用户进行交互操作。在这个过程后,Fragment就已经启动并运行起来了。
  • 也许会暂停Activity。Activity的OnPause方法会被调用。这时候Fragment的onPause方法也会被调用。
  • 系统也可能会销毁Fragment的视图显示,发生这种情况时onDestroyView方法就被调用了。
  • 之后,如果系统需要完全销毁整个Fragment的话,onDestroy方法就会被调用了。这时候我们就需要释放掉所有可用的连接了,因为这个时候Fragment马上就要被杀掉了。虽然是在准备销毁的过程中,但是Fragment仍然绑定在父Activity中。
  • 最后一步就是把Fragment从Activity中解绑,即调用onDetach方法。

怎么创建一个Fragment

现在我们了解了Fragment的生命周期了,接着我们就需要知道怎么创建一个Fragment并绑定到Activity中,第一件要做的事就是继承android.app.Fragment来写一个Fragment,假设我们的Fragment叫做Fragment1,创建和定义如下:

.html-script: .false}
    public class Fragment1 extends Fragment {
    ...
    }

就像我们上面说的,Fragment只能存在于Activity中,所以我们必须要在某处定义它,有两种方式:

  • 直接在xml布局文件中定义;
  • 在xml布局文件中定义一个占位符,然后动态地在Activity中操作Fragment;

我们定义Fragment的方式会影响它的生命周期,因为在上述第一种情况下onInflate方法会被调用,而第二种情况下它的生命周期是从onAttach方法开始的。

如果我们在XML文件中定义Fragment的话,我们需要:

.html-script: .false}
    <fragment android:id="@+id/f1"android:layout_width="match_parent"
                  android:layout_height="20dp"/>

然而如果我们在XML中用占位符的话,需要再做一些工作。

布局框架和Fragment

如果我们在XML布局文件中定义Fragment的话,就不能自由、动态修改Fragment了,还有别的方法可以让我们可以更灵活地操作:使用时需要在XML文件中定义:

.html-script: .false}
    <FrameLayout android:id="@+id/fl1"
                 android:layout_width="match_parent"
                 android:layout_height="200dp"/>

在Activity里面还需要做一点工作,因为我们必须手动初始化Fragment,然后把它“插入”到FrameLayout中。

.html-script: .false}
    public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Fragment2 f2 = new Fragment2();
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.replace(R.id.fl1, f2);
        ft.commit();
    }

关于FragmentTransaction等内容的讨论我们留到下一篇文章再说吧,本文就到这里了。


原文 Android Fragment Lifecycle – multiple screen support
翻译 伯乐在线 - chris

Android Fragment生命周期图以及Activity与Fragment生命周期对照图

Android Fragment生命周期图以及Activity与Fragment生命周期对照图

Android Fragment生命周期图以及Activity与Fragment生命周期对照图


Android Fragment生命周期图:


在Fragment的生命周期中,需要重点关注onCreate、onCreateView、onViewCreated。



Android Activity与Fragment生命周期对比图:



Activity与Fragment生命周期在设计模式上大体一致。

(图片来源自Android开发文档。)

我们今天的关于Android Widget生命周期statefulwidget生命周期的分享已经告一段落,感谢您的关注,如果您想了解更多关于android - 生命周期和 GC、android @android:Theme.Dialog 和 @android:Widget.Button找不到、Android Fragment生命周期——多屏幕支持、Android Fragment生命周期图以及Activity与Fragment生命周期对照图的相关信息,请在本站查询。

本文标签: