精华内容
下载资源
问答
  • Activity作为安卓四大组件之一,平常我们接触得最多得也是activity,所以很有必要详细了解一下他的详细生命周期。这篇文章定位是有一点安卓基础的,所以还完全不了解的可以先去学习一下activity。这篇文章主要是讲...

    前言

    Activity作为安卓四大组件之一,平常我们接触得最多得也是activity,所以很有必要详细了解一下他的详细生命周期。这篇文章定位是有一点安卓基础的,所以还完全不了解的可以先去学习一下activity。这篇文章主要是讲活动的生命周期。
    活动的生命周期,人有胎儿期,青春期,老年期一样,活动同样有他的各种生命状态。我们出生会哭,进入成年期会有成人礼。活动也一样,每进入一个状态都会回调相应的方法。对于我们来说,活动周期就是活动会在活动具体哪个时候会回调哪一些方法,然后我们可以重写这一些方法,来实现我们的功能。所以我们得具体了解究竟什么时候调用什么方法。例如在onCreate方法中初始化,在destroy中释放内存等等。
    那接下来就看看他的具体生命周期。

    活动的状态

    首先得了解一下活动的状态。我个人的理解把活动分为四个状态:后台状态,暂停状态,运行状态和销毁状态。

    1. 停止状态:这个状态表示活动未进入前台,我们看不到也无法交汇。切换界面活动都会在后台。如果内存紧张的话有可能被回收。就像我们有时候打游戏切换到微信回了一下信息,回来的时候卧槽怎么把我游戏退了,就是这样。
    2. 运行状态:这个不用多讲,当你在交汇的这个活动就是运行状态。
    3. 暂停状态:当弹出一个提示框,我们回发现无法与原来的界面交汇了,就是只能点那个提示框。当一个活动位于栈顶,也就是你看的见他,但是你没办法操作他,这个时候就是属于暂停状态。
    4. 销毁状态:就是被移出栈顶的活动,马上就会被回收了。例如你退出一个应用他马上就会被杀了。

    常规情况下的生命周期

    典型情况下的生命周期

    每个活动正常启动的话都会经历的生命周期如下图

    活动启动
    onCreate
    onStart
    onResume
    Activity运行
    onPause
    onStop
    onDestroy
    活动销毁
    onRestart

    每到一个时间点都会调用相关的方法,接下来一个一个来分析一下这些方法。

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

    这是我们每个活动都会用到的一个方法。他在活动被创建的时候被调用,且只会调用一次。除非被destroy重新创 建。我们一般在这个方法中做一下初始化的事情。例如加载布局资源等等。细心的读者可能会注意到他有一个Bundle参数,这个参数主要是用于保存被异常销毁事的数据的,这个在后面会讲到

    1. onStart:顾名思义这个方法表示活动正在启动,这个时候活动界面已经看的见了,但是还不能与用户交汇,简单点说就是你看得到点不了。但是一般速度很快不会让你感受到这个现象,不然就会好像卡死一样了。所以不能在这个方法中做重量级的操作,初始化什么的都放在onCreate。

    2. onResume:这个方法表示活动显示在前台了而且也可以用了。onStart和onResume主要配合onPause和onStop方法来使用,下面会讲到。

    3. onPause:活动被暂停的时候会调用到。例如一些弹出提示框,看得到界面但是无法进行交汇。一般执行完这个方法后紧接着就会执行onStop方法了。这个方法可以做一些动画的暂停工作等等轻量级的工作,不然弹个提示框都要卡一下用户体验也很差对吧。
      如果没有进入onStop这个环节的话,回到原Activity的话,那么就会调用onResume这个方法了

    4. onStop:这个方法在活动即将停止的时候调用,同样不能做重量级的工作。一般切换界面,如果内存足够没有被杀死的话,这个活动就会进入停止状态。

    5. onRestart:当活动从停止状态回来的时候就会调用这个方法。状态和onStart其实是差不多的,只是为了区分是正常打开的还是从停止状态回来的,可以分别写不同的方法。

    6. onDestroy:活动被销毁的时候会调用这个方法。可以做一些资源的释放什么的。但这里要特别强调的一点就是并不是所有情况下活动被销毁都会调用这个方法。例如当你按下返回键回到上个界面,这个当然是会执行这个方法。但是如果你切换到了别的应用或者回到了桌面,这个应用被后台杀死了,那么只有处于栈顶也就是这个应用最后打开的活动会执行destroy方法,其他都不会,需要特别注意一下。
      在这里插入图片描述

    一些例外情况的生命周期

    有一句话叫做用户永远不会按照你的设想去使用软件,活动也一样,总是会出现一些比较不一样的情况。这些情况活动是怎么跑的也来看看:

    1. 返回桌面的时候:返回桌面其实就像切换到别的活动是一样的道理,这个时候执行的方法是:onPause --> onStop。
    2. 当活动被系统回收再被打开,流程和打开一个新的活动是一样的。
    3. 打开新的活动时先执行onPause方法再启动新的活动,onStop会慢一点点执行。

    异常情况下的生命周期

    这里的异常情况主要有两种:一种是放在后台被杀死了,不是我们主动去终结他的生命的,第二种是设备的配置发生了改变,例如屏幕翻转。对于这两种情况我们具体来看一下

    情况1 :资源相关的系统配置发生改变

    这个资源相关的系统配置怎么说呢。我们的项目目录下不是有drawable-hdpi ,drawable-mdpi,这一类的文件夹,在不同的屏幕尺寸下会获取不同的图片,就像我们手机和平板也是一样有两个不同的配置。平常中我们翻转屏幕时,屏幕尺寸就发生了变化,准确来说时屏幕的长宽比例发生了变化,那么这个时候Activity就会被重建(当然你也可以设置他不重建)。
    细心的读者会发现,即使我的屏幕翻转了,活动重建了,可是还是保留着刚刚我操作的内容啊!例如我在输入框输入了Hello World翻转后还是Hello World,不是说活动被重建了吗,为什么这些还存在?
    不知道还记不记得onCreate方法中有一个Bundle参数吗?没错,这个参数就是记录之前的数据的。重建的过程和平常的杀死启动活动有一些不一样,看一下:

    屏幕翻转
    重新创建
    Activity运行
    onPause,onSaveInstanceState
    onStop
    onDestroy
    onCreate
    onRestoreInstanceState
    onStart,onResume
    Activity重新启动

    可以看到最主要的不同就是多了onSaveInstanceState和onRestoreInstanceState这两个方法。
    活动在这种异常的情况下被终结生命后,就会调用onSaveInstanceState方法来保存目前的数据,这个方法在onStop方法前调用,但是和onPause方法的前后关系没有必然的关系。然后作为一个Bundle参数传递给重新创建的活动。这个Bundle对象会在onCreate方法中和onRestoreInstanceState中被使用。onRestoreInstanceState这个方法主要就是把刚才的数据还原,执行的次序是在onStart之后。
    要注意的一点是,onSaveInstanceState方法只有在活动还会被重建的时候才会被调用。例如你手动把他后台杀了,是不会调用这个方法的。

    情况2:资源内存不足导致活动被杀死

    当系统内存不足的时候,系统就会按照优先级的大小去杀死一些活动,并在后续通过上面onSaveInstanceState和onRestoreInstanceState方法来恢复数据。优先级按照状态依次是:运行状态,暂停状态,停止状态。一般最有可能是停止状态的活动被杀了。所以一些后台工作就尽量放在service中防止被杀死

    总结

    讲了这么多的生命周期,其实我也是简单讲了我们在使用中一般会遇到的生命周期。有一些读者可能会有这个疑问:为什么我主动调用了onDestroy方法但是活动却没有被杀死?举个例子,你给一个婴儿举办成人礼,他会马上成人吗?要注意的一点就是,我们所说的这些生命周期的回调方法,本质上他们都是一样的,只是被调用的时间不用。他们只是在活动的不同时间被调用,并不是调用这个方法去推进活动的生命进行。主动销毁活动我们用到的是finish(),而不是onDestroy,要特别注意。

    生命周期是活动很重要的一部分,只要了解了他的生命周期我们才可以在准确的时间给他做一些正确的事情。例如你的孩子进入了青春期,你就得跟他说好好学习不要老是想着谈恋爱对吧。我之前自己出过一个低级错误就是在onCreate方法之前使用findViewById,活动都还没创建,怎么找得到布局呢。充分了解这些生命周期后就不会犯这些低级错误了。

    我也是一个安卓新手,有哪些地方写的不好还请大佬们指教

    ·
    ·
    ·

    参考资料

    《Android开发艺术探索》–任玉刚
    《第一行代码》–郭霖

    展开全文
  • [java] view plain copy  package com.scott.lifecycle;    import android.app.Activity;  import android.content.Context;  import android.content.Intent;  import androi
    [java] view plain copy

        package com.scott.lifecycle;  
          
        import android.app.Activity;  
        import android.content.Context;  
        import android.content.Intent;  
        import android.os.Bundle;  
        import android.util.Log;  
        import android.view.View;  
        import android.widget.Button;  
          
        public class LifeCycleActivity extends Activity {  
              
            private static final String TAG = "LifeCycleActivity";  
            private Context context = this;  
            private int param = 1;  
              
            //Activity创建时被调用  
            @Override  
            public void onCreate(Bundle savedInstanceState) {  
                super.onCreate(savedInstanceState);  
                Log.i(TAG, "onCreate called.");  
                  
                setContentView(R.layout.lifecycle);  
                  
                Button btn = (Button) findViewById(R.id.btn);  
                btn.setOnClickListener(new View.OnClickListener() {  
                    @Override  
                    public void onClick(View v) {  
                        Intent intent = new Intent(context, TargetActivity.class);  
                        startActivity(intent);  
                    }  
                });  
            }  
              
            //Activity创建或者从后台重新回到前台时被调用  
            @Override  
            protected void onStart() {  
                super.onStart();  
                Log.i(TAG, "onStart called.");  
            }  
              
            //Activity从后台重新回到前台时被调用  
            @Override  
            protected void onRestart() {  
                super.onRestart();  
                Log.i(TAG, "onRestart called.");  
            }  
              
            //Activity创建或者从被覆盖、后台重新回到前台时被调用  
            @Override  
            protected void onResume() {  
                super.onResume();  
                Log.i(TAG, "onResume called.");  
            }  
              
            //Activity窗口获得或失去焦点时被调用,在onResume之后或onPause之后  
            /*@Override
            public void onWindowFocusChanged(boolean hasFocus) {
                super.onWindowFocusChanged(hasFocus);
                Log.i(TAG, "onWindowFocusChanged called.");
            }*/  
              
            //Activity被覆盖到下面或者锁屏时被调用  
            @Override  
            protected void onPause() {  
                super.onPause();  
                Log.i(TAG, "onPause called.");  
                //有可能在执行完onPause或onStop后,系统资源紧张将Activity杀死,所以有必要在此保存持久数据  
            }  
              
            //退出当前Activity或者跳转到新Activity时被调用  
            @Override  
            protected void onStop() {  
                super.onStop();  
                Log.i(TAG, "onStop called.");     
            }  
              
            //退出当前Activity时被调用,调用之后Activity就结束了  
            @Override  
            protected void onDestroy() {  
                super.onDestroy();  
                Log.i(TAG, "onDestory called.");  
            }  
              
            /**
             * Activity被系统杀死时被调用.
             * 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死.
             * 另外,当跳转到其他Activity或者按Home键回到主屏时该方法也会被调用,系统是为了保存当前View组件的状态.
             * 在onPause之前被调用.
             */  
            @Override  
            protected void onSaveInstanceState(Bundle outState) {  
                outState.putInt("param", param);  
                Log.i(TAG, "onSaveInstanceState called. put param: " + param);  
                super.onSaveInstanceState(outState);  
            }  
              
            /**
             * Activity被系统杀死后再重建时被调用.
             * 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死,用户又启动该Activity.
             * 这两种情况下onRestoreInstanceState都会被调用,在onStart之后.
             */  
            @Override  
            protected void onRestoreInstanceState(Bundle savedInstanceState) {  
                param = savedInstanceState.getInt("param");  
                Log.i(TAG, "onRestoreInstanceState called. get param: " + param);  
                super.onRestoreInstanceState(savedInstanceState);  
            }  
        }
    展开全文
  • activity与另一个activity的fragment之间相互传值 谁能详细说明一下吗 最后给一个例子 谢谢大家
  • Activity之间的跳转,或者说加载一个新的Activity,一般对于开发者来说,都不是一个太难的问题。直到后来随着不断的深入,才发现原来Activity的加载还分为四种不同加载模式。灵活的使用合适的加载模式,可以避免产生...
    Activity之间的跳转,或者说加载一个新的Activity,一般对于开发者来说,都不是一个太难的问题。直到后来随着不断的深入,才发现原来Activity的加载还分为四种不同加载模式。灵活的使用合适的加载模式,可以避免产生大量的重复的Activity,从而优化性能,减少系统资源消耗。

      四种加载模式具体为:

      standard: 标准模式,一调用startActivity()方法就会产生一个新的实例。
      singleTop: 检查是否已经存在了一个实例位于Activity Stack的顶部,如果存在就不产生新的实例,反之则调用Activity的newInstance()方法产生一个新实例。
      singleTask: 在一个新的Task中产生这个实例,以后每次调用都会使用此实例,而避免产生新的实例。
      singleInstance: 这个基本上跟singleTask一样,只是有一点不同,那就是在这个模式下的Activity实例所处的Task中,只能有这一个Activity实例,而不能有其他的实例。

      这些启动模式可以Android清单文件AndroidManifest.xml中,通过<activity>中的launchMode属性进行设置,如:

      AndroidManifest.xml

       <activity android:name="MainActivity" android:launchMode="singleTop">
       <intent-filter>
       <category android:name="android.intent.category.DEFAULT" />
       </intent-filter>
      </activity>

      Java Code

       Intent intent = new Intent(SrcActivity.this, TargetActivity.class);
       intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
       startActivity(intent);

      四种加载模式的区别如下:

      1.所属Task的区别:
      一般情况下,,“standard”和”singleTop”两种加载模式源Activity(即new Intent(arg0,arg1)中的第一个参数)和目标Activity(即new Intent(arg0,arg1)中的第二个参数)在同一个Task内,除非Intent包括了参数FLAG_ACTIVITY_NEW_TASK,如包含了此参数,目标Activity会起动到新的Task里;
      “singleTask”和“singleInstance” 总是把目标Activity作为一个Task的根元素,他们不会被启动到一个其他Task里。

      2.是否允许多个实例的区别:
      standard”和”singleTop”可以允许有多个实例,并且可以位于不同的Task中;
      singleTop要求如果Activity Stack顶部已经有目标Activity实例,则直接讲Intent发送给该实例,而不创建新实例。如Activity Stack没有该实例,则创建新实例;
       “singleTask”和”singleInstance”则只产生一个实例,并且是Task的根元素。“standard”和”singleTop”可以被实例化多次,并且是可以存在于不同的task中;这种实例化时一个task可以包括一个activity的多个实例;“singleTask”和”singleInstance”则限制只生成一个实例,并且是task的根元素。

      3.是否允许其他Activity存在于本Task内的区别:
      “singleInstance”独占一个Task,其他Activity均不能存在于此Task中,如果它启动一个新的Activity,不管新的Activity的launch mode如何,新的Activity都将运行于其他Task里;      
      另外三种模式则可以和其他Activity共存。

      4.是否每次都生成新实例的区别:
      “standar”模式每次都生成一个新的Activity实例;
      “singleTop”的Activity如果在Task的Activity Stack顶部则不生成新实例,直接使用此实例,否则生成一个新实例。
      “singleeInstance”是其所在Task的Activity Stack里的唯一Activity实例,它每次都会被重用
      “singleTask”如果在Task的Activity Stack的顶部,则接收intent,否则该intent会被丢弃,但仍然会该Task返回前台。
    展开全文
  • 首先你要知道Activity的四种状态: Active/Runing 一个新 Activity 启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户...Paused 当 Activity 被另一个透明或者 Dialog 样式的 Activity 覆盖

    转自:http://www.cnblogs.com/ifaithu/articles/2762025.html

    首先你要知道Activity的四种状态:
    Active/Runing 一个新 Activity 启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。 
    Paused 当 Activity 被另一个透明或者 Dialog 样式的 Activity 覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互。 
    Stoped 当 Activity 被另外一个 Activity 覆盖、失去焦点并不可见时处于 Stoped 状态。 
    Killed Activity 被系统杀死回收或者没有被启动时处于 Killed 状态。
    
    protected void onStart() 该方法在 onCreate() 方法之后被调用,或者在 Activity 从 Stop 状态转换为 Active 状态时被调用,一般执行了onStart()后就执行onResume()。 
    protected void onResume() 在 Activity 从 Pause 状态转换到 Active 状态时被调用。

    onResume是activity获得用户焦点,在与用户交互
    onStart是activity用户可见,包括有一个activity在他上面,但没有将它完全覆盖,用户可以看到部分activity但不能与它交互

    展开全文
  • Andoroid中不在同一布局下的Fragment与Activity或者两个Fragment如何传值
  • 在我们项目中经常碰到activity与fragment互相跳转的问题,其中解决方法大约也就那么几种,我以其中一个案例说一下,我要从自定义view跳转到fragment,当然不能之间跳转了我跳转到fragment所在的mainactivity里面 ...
  • 有时候我们在安卓开发下,从A 界面(Activity) 跳转到B界面(Activity),再从B界面(activity)时,希望将B界面销毁,大多的选择是在B界面startActivity时,调用finish();方法; 这样固然会让b界面的生命周期走向...
  • 在一个activity中获取另一个activity中的EditText的值,两个activity之间没有跳转,有什么方法能做到吗?各位前辈帮帮忙,谢谢。
  • 安卓中,创建一个 包含十个Activity的Intent的列表,其中一个Activity是Intent的目标组件。该怎么做?
  • 安卓中Intent

    千次阅读 2015-12-23 13:01:17
    Intent学习 Intent属性的详解  在android操作系统中,Intent(意图)主要用于激活系统组件、在...Intent可以理解为组件之间的“连接器”,可以用于激活Activity、Service、BroadcastReceiver,但不用于激活Content Pr
  • 安卓中setTheme失效

    千次阅读 2018-01-31 18:22:27
    setContentView(R.layout.activity_main); 的前面, 但是之后又想修改主题怎么办呢? 比如想在一个按键中执行setTheme(); 这个时候只需要执行完 setTheme(R.style.theme); 之后再执行一便 recreate(); 就...
  • 安卓中AlarmManager结合广播的使用

    千次阅读 2016-06-01 11:21:01
    安卓中AlarmManager可以做到提醒的作用,在特定的时刻为我们广播一个特定的Intent。可以通过设置,然后传递给广播接收器,响应一些事件。 首先我们写好一个静态广播,这里为什么不适用动态注册广播的方式,是因为,...
  • 安卓中WebKit的使用

    2019-10-07 01:46:50
    1.在安卓开发中,使用webkit显示网页 步骤:  ①初始化一个webkit控件;  ②获取webkit的WebSettings对象;  ③设置javascript为enable ... ⑤注意activity销毁时不要忘记webkit.clearCache(true);否...
  • 安卓中fragment的使用全解

    千次阅读 2017-10-21 10:09:10
    全栈工程师开发手册 (作者:栾鹏...在Fragment基础上,系统派生处理另外几种fragment1、DialogFragment:一个fragment可以在fragment的父activity上显示一个浮动的对话框,而且可以自定义对话框的UI2、ListFragment:
  • 1.创建一个主布局文件,里面只有FrameLayout,用于放置所要托管的活动:activity_main.xml: &lt;?xml version="1.0" encoding="ut
  • 安卓中dialog的两种用法,一种是嵌套布局的的dialog,一种是直接在代码中间写布局的用法。 首先是加载布局文件xml的用法: private void showDialog() { final AlertDialog dialog = new AlertDialog.Builder...
  • 安卓中Fragment的认识

    2016-07-12 15:29:40
    Fragment:Activity片段  a)Fragment的特点:  (1)Fragment作为Activity界面的一部分组成出现  (2)可以在一个Activity中同时出现多个Fragment,一个Fragment亦可在多个Activity中使用。  (3)在Activity...
  • 安卓中ProgressDialog用法

    千次阅读 2013-03-06 15:30:24
    .新建Android项目 ProgressDialog 在包andorid.huada下建文件ProgressDialogActivity.java 2.ProgressDialogActivity.java代码如下 ...import android.app.Activity; import android.app.ProgressD
  • 通过触发一个按钮,显示对话框与人进行交互,可以获取对话框中的信息。...import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bu

空空如也

空空如也

1 2 3 4
收藏数 72
精华内容 28
关键字:

安卓中activity