• Android四大组件——Activity


    Activity作为Android四大组件之一,也是其中最重要的一个组件。作为一个与用户交互的组件,我们可以把Activity比较成为windows系统上的一个文件夹窗口,是一个与用户交互的界面。再进一步说,当我们拿起Android打开拨号功能,显示出拨号盘的界面其实就是一个Activity;当然,可以更大范围的说,手机屏幕上显示的任何界面都是一个个Activity。

    官方对Activity的描述

    Activity是一个应用程序的组件,他在屏幕上提供了一个区域,允许用户在上面做一些交互性的操作, 比如打电话,照相,发送邮件,或者显示一个地图!Activity可以理解成一个绘制用户界面的窗口, 而这个窗口可以填满整个屏幕,也可能比屏幕小或者浮动在其他窗口的上方!

    从上面这段话,我们可以得到以下信息:

    1. Activity用于显示用户界面,用户通过Activity交互完成相关操作 
    2. 一个App允许有多个Activity

     相关链接:

     

    1.Activity的概念与Activity的生命周期图:

    注意事项:

    1. onPause()和onStop()被调用的前提是: 打开了一个新的Activity!而前者是旧Activity还可见的状态;后者是旧Activity已经不可见!
    2. 另外,亲测:AlertDialog和PopWindow是不会触发上述两个回调方法的~

    Activity的生命周期方法总共有七个。所谓生命周期,就是Activity在各个状态转变之间,系统会对其各个生命周期函数进行回调,也就让我们可以根据业务需求,重写各个生命周期方法来实现软件在各个状态的业务逻辑。

    启动Activity到运行状态: 

    onCreate() -> onStart() -> onResume() -> 界面完全显示

    运行状态到暂停状态:

      界面完全显示 -> onPause() -> 界面被部分遮盖

    暂停状态到运行状态:

      界面被部分遮盖 -> onResume() -> 界面完全显示

    运行状态到停止状态:

      界面完全显示 -> onPause() -> onStop() -> 界面完全遮盖

    停止状态到运行状态:

      界面完全遮盖 -> onRestart() -> onStart() -> onResume() -> 界面完全显示

    退出Activity:

      界面完全显示 -> onPause() -> onStop() -> 界面完全遮盖 -> onDestroy() -> Activity结束生命周期

    PS:当系统内存紧张时,系统可以将Activity释放掉以获取资源,优先释放停止状态的Activity,次之则是暂时状态的Activity,而运行状态的Acitivity一般不可能被强行释放,除非极端缺乏资源(这时候直接死机得了。。。),当Activity被释放时,直接转入消亡,需要注意一点的是onDestroy()并不会被执行,所以把数据保存放在onDestroy处理是不适当的,可以在onSaveInstanceState()中对重要数据进行相应的处理。

    Activity三种的状态:

    • 运行状态:当Activity处于屏幕最前端,此时Actiivity完全显示在用户的界面中,并能获取焦点时,可以响应用户的的触摸屏幕等事件,此时为运行状态。用户可见,可交互
    • 暂停状态:当Activity被其他Activity遮挡,但是仍然有部分可见,此时为暂停状态;当处于暂停状态时,Activity仍然会更新UI,但是此时不能获取焦点,即不会响应用户触摸、后退等事件。用户可见,不可交互
    • 停止状态:当Activity被另外一个Activity完全遮挡,此时为停止状态,停止状态并不意味着Activity停止运行,而可以理解为转入后台运行。但是如果系统需要内存,会优先结束停止状态的Activity释放资源,所以在Activity转入停止状态时要对重要数据进行保存。用户不可见,也不可交互

    另外关于横竖屏切割调用的生命周期如下:

    横屏->竖屏(调用一次生命周期)

      onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onResume()

    竖屏 -> 横屏 (调用两次生命周期)

    如果不希望切换屏幕时调用生命周期方法,可以有如下方法:

    1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

    2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

    3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法 

    2.Activity/ActionBarActivity/AppCompatActivity的区别:

    在开始讲解创建Activity之前要说下这三个的一个区别: Activity就不用说啦,后面这两个都是为了低版本兼容而提出的提出来的,他们都在v7包下, ActionBarActivity已被废弃,从名字就知道,ActionBar~,而在5.0后,被Google弃用了,现在用 ToolBar...而我们现在在Android Studio创建一个Activity默认继承的会是:AppCompatActivity! 当然你也可以只写Activity,不过AppCompatActivity给我们提供了一些新的东西而已! 两个选一个,Just you like~ 

    3.Activity的创建流程

    Android中的四大组件,只要你定义了,无论你用没用,都要在AndroidManifest.xml对 这个组件进行声明,不然运行时程序会直接退出,报ClassNotFindException... 

    4.启动一个Activity的几种方式

     在Android中我们可以通过下面两种方式来启动一个新的Activity,注意这里是怎么启动,而非启动模式!!分为显示启动和隐式启动!

     1. 显式启动:通过包名来启动,写法如下:

    ①最常见的:

    startActivity(new Intent(当前Act.this,要启动的Act.class));
    ②通过Intent的ComponentName:
    ComponentName cn = new ComponentName("当前Act的全限定类名","启动Act的全限定类名") ;
    Intent intent = new Intent() ;
    intent.setComponent(cn) ;
    startActivity(intent) ;
    初始化Intent时指定包名:
    Intent intent = new Intent("android.intent.action.MAIN");
    intent.setClassName("当前Act的全限定类名","启动Act的全限定类名");
    startActivity(intent);

    2.隐式启动:通过Intent-filter的Action,Category或data来实现 这个是通过Intent的 intent-filter**来实现的,这个Intent那章会详细讲解! 这里知道个大概就可以了!

    3. 另外还有一个直接通过包名启动apk的:

    Intent intent = getPackageManager().getLaunchIntentForPackage
    ("apk第一个启动的Activity的全限定类名") ;
    if(intent != null) startActivity(intent) ;

    5、Activity间的数据传递:

     

      对于应用来说,单纯从一个Activity启动另外一个Activity远远是不够的,有时候需要比较的数据信息交流。android系统提供了很多种数据通信的方法,自然也为Activity之间的通信提供了简便的数据传递方法,参见下面代码:

    FirstActivity向OtherActivity传送数据<data,"传递的数据">

    1     Intent intent = new Intent(this, OtherActivity.class);
    2         
    3        intent.putExtra("data", "传递的数据");//data为key
    4 //        另外一种方法,载入数据
    5 //     Bundle bundle = new Bundle();
    6 //     bundle.putString("data", "传递的数据");
    7 //     intent.putExtras(bundle);
    8         
    9        startActivity(intent);

    有两种表示的方法,一般第一种方法运用的场景是传输少量而且简单的数据;后一种方法则是传输较多而比较复杂的数据所用。但是从底层上说,其实第一种方法是后一种方法的封装,它仍然会在intent内部创建一个bundle并把数据(如例子中的“传递的数据”)放入其中。

    OtherActivity获取传送的数据<data,"传递的数据">

    1         Intent intent = getIntent();
    2 //        获取方法
    3         String data = intent.getStringExtra("data");//data的值为“传递的数据”,由上个Activity传入
    4 //      另外一种方法
    5 //      Bundle bundle = intent.getExtras();
    6 //      String data = bundle.getString("data");

    获取的方法一般是先取得intent携带的bundle,然后通过get方法获取存储在其中的数据;而前面的方法并没有明确获取bundle的代码,因为intent.getStringExtra(key)在函数内部已经是先获取好bundle并把相应key的数据解析出来了,所以两种方法本质上来说是相同的,但是如果大量数据建议用后一种方法,因为从bundle中获取数据比从intent中获取数据效率有所提高,比较移动时代,效率是一个非常需要重视的东东。。

     FristActivity启动OtherActivity并在其结束时获取OtherActivity返回的数据

    如果业务需要启动另一个Activity后返回数据给原来的Activity,在启动Activity是不是调用startActivity(intent),而是应该调用startActivityForResult(intent, requestCode),requestCode是一个给启动的Activity的标识码,是一个正整数的值,在有多个启动的Activity时可以通过不同的标识码来表示Activity返回的数据并进行不同的处理。在FristActivity中处理返回数据是在 onActivityResult(requestCode, resultCode, data)中处理,而第一个参数requestCode则是启动时输入的标识码。参见代码

    1  Intent intent = new Intent(this, OtherActivity.class);
    2  startActivityForResult(intent, 0);//设置标识码为0

    这是启动Activity的代码,但是我们要对于返回的数据,还需要在FristActivity中重写onActivityResult(requestCode, resultCode, data)

    1 @Override
    2 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    3   super.onActivityResult(requestCode, resultCode, data);
    4   if(requestCode == 0){//根据requestCode的数值确实是哪个Activity返回的bundle
    5     Bundle bundle = data.getExtras();
    6     String getdata = bundle.getString("name");
    7   }
    8 } 
    复制代码

    然后在启动的OtherActivity中重写返回数据的方法

        Intent intent = new Intent();
        intent.putExtra("name", "返回的数据");
        setResult(1, intent);//设置需要返回数据的intent
        finish();//结束当前的activity    

    一般setResult后需要调用finish()结束当前的Activity,此时才会将数据返回到FristActivity,数据返回也就是onActivityResult调用的时间在finish之前调用。

    下面是实现具体代码:

    MainActivity 

    package cn.com.qiang.buttondemo;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            Button button1 = (Button) findViewById(R.id.button1);
            
            button1.setOnClickListener(new MyListon());
        }
        
        class MyListon implements OnClickListener{
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
            Intent intent = new Intent();
            intent.setClass(MainActivity.this,SecondActivity.class);
            intent.putExtra("key", "给你发个美女图片");
            startActivity(intent);
            }
        }   
    }

    SecondActivity

    package cn.com.qiang.buttondemo;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.widget.TextView;
    
    public class SecondActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState){
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
        
            Intent intent = getIntent();
            String s = intent.getStringExtra("key");
            TextView tv = (TextView) findViewById(R.id.tv);
            tv.setText(s);
        }
    }
  • 相关阅读:
    大型项目生产环境日志查询
    泛型接口和泛型方法
    使用360浏览器登录B站的时候,不显示搜索框
    构建之法第二周学习体验
    构建之法首周阅读体会
    C语言实例解析精粹学习笔记——26
    C语言实例解析精粹学习笔记——29
    C语言实例解析精粹学习笔记——28
    C语言实例解析精粹学习笔记——18
    C语言实例解析精粹学习笔记——30
  • 原文地址:https://www.cnblogs.com/chen-farsight/p/6191775.html
Copyright © 2020-2023  润新知