• Android基础学习第二篇—Activity


    写在前面的话:

    1. 最近在自学Android,也是边看书边写一些Demo,由于知识点越来越多,脑子越来越记不清楚,所以打算写成读书笔记,供以后查看,也算是把自己学到所理解的东西写出来,献丑,如有不对的地方,希望大家给与指正。

    2. 由于类似于读书笔记,可能格式神马的会比较随(hen)意(chou),大家看着受不了,可以使劲吐槽。

    *************************************我只是分割线***************************************

    上一篇已经讲了一些关于Project目录结构的东西,这次记录一下关于Android四大组件之一的Activity的一些东西,它也是Android中最基本的模块之一。

    <一>什么是Activity?

    它叫活动(听着很别扭,这么长时间还是感觉不好接受~),几乎所有的活动都是用来与用户交互的,活动主要关注与视图窗体的创建,一个应用程序可以包含零个或者多个活动,但是包含零个活动的应用比较少。【PS:这话是参考别人的,我只是拿来装X】

    其实通俗来说,我们可以把手机当做一个浏览器,而Activity就是其中的一个个网页,在Activity上面,我们可以添加不同的View(就是.NET里面所说的控件),并且可以执行一些操作逻辑。

    <二>Activity的生命周期

    如图【图片是借用别人的】,

    Activity的“整个生命周期”是发生在第一次调用onCreate(Bundle)和唯一最后调用onDestroy()方法之间。在onCreate(Bundle)方法中完成活动的初始化操作设置全局状态,比如加载布局、绑定事件等,并在onDestroy()方法释放资源。

    Activity的“显示生命周期”是发生在调用onStart()方法以及调用相对应的onStop()方法之间。在这之间,可以在手机屏幕上看到这个活动。随着Activity对用户的可见和不可见状态的改变,这两个方法能被多次调用。

    Activity的“前台生命周期”是在onResume()和onPause()方法之间所经历的,在这个周期内,活动处于运行状态,此时的活动是可以和用户进行交互的。

    我个人的方法是:创建一个app,然后在Activity的代码中把这些方法全部重写出来,为每个方法打上断点(或者日志输出),Debug进行调试,就基本上明白了什么时候会被调用。

    <三>Activity的启动和Activity之间的数据传递

    这里我们需要用到一个对象Intent,Intent是Android程序中各组件之间进行交互的一种重要方式,它一般可被用于启动活动、启动服务、以及发送广播等场景,关于它的用法后面再详细说。

    1. 简单的启动新的Activity

    使用的方法:startActivity(Intent)

    示例:

    Intent _intent = new Intent();
    _intent.setClass(MainActivity.this, ActivityB.class);
    startActivity(_intent);

    //这个调用方法也可以写成

    Intent _intent2 = new Intent(MainActivity.this,ActivityB.class);
    startActivity(_intent2);

    实例化一个Intent对象,然后指定从当前的MainActivity这个活动,跳转到ActivityB这个活动。

    2. 启动新的Activity,并有返回值

    使用方法:public void startActivityForResult(Intent intent, int requestCode),注意第二个参数:requesCode,这个参数类似于当初特工接头时的暗号,

    示例:

      1. 应用从活动MainActivity跳转到ActivityC,并请求一个字符串;

      2. 在活动Activity中操作,关闭活动ActivityC时,返回请求的字符串给MainActivty;

      3.活动MainActivity获取字符串。

        class ButtonActivitiesClickListener implements OnClickListener {
            @Override
            public void onClick(View v) {
                 if (v.getId() == R.id.btnSkipToC) {
                 Intent _intent = new Intent();
                 _intent.setClass(MainActivity.this, ActivityC.class);
                
                 startActivityForResult(_intent, 100);
                
                 }
            }
        }

    注意,这里就是启动新的活动ActivityC,暗号requestCode是100。

    在活动ActivityC中,点击关闭按钮时用void setResult (int resultCode, Intent data)传回请求的字符串,

        class ButtonActivityAListener implements OnClickListener {
    
            @Override
            public void onClick(View v) {
                if (v.getId() == R.id.btnreturn) {
                    Intent _intent = new Intent();
                    EditText editText = (EditText) findViewById(R.id.edittext_first);
                    String inputStr = editText.getText().toString();
                    _intent.putExtra("dashenzaijia", inputStr);
                    setResult(Activity.RESULT_OK, _intent);
                    finish();
                }
            }
        }

    备注:Intent.putExtra(String name, String value)类似于一个数据字典,这个Intent就是ActivityC返回字符串给MainActivity的载体,name就是键,finish()方法类似于winform中的Close();

    关闭活动ActivityC后,然后再MainActivity中,有一个虚方法,重载一下,然后从这个方法里面获取ActivityC的返回值,如下:

        @Override
        protected void onActivityResult(int arg0, int arg1, Intent arg2) {
            // TODO Auto-generated method stub
            super.onActivityResult(arg0, arg1, arg2);
            if (arg0 == 100 && arg1 == Activity.RESULT_OK) {
                String returnValue = arg2.getStringExtra("dashenzaijia");
                TextView view = (TextView) this.findViewById(R.id.textview_showresult);
                if (!returnValue.isEmpty()) {
                    view.setText("来自Activity C的值:" + returnValue);
                } else {
                    view.setText(null);
                }
            }
        }

    第一个参数就是当初定义的两个活动之间的暗号,第二个参数是跳转后页面的关闭时的结果,类似于C# 里面窗体关闭时的DialogResult,第三个参数就是返回值的载体。

     <四>活动的启动模式

    启动模式有四种,分别是:standard、singleTop、singleTask、singleInstance,可以在AndroidManifest.xml文件中通过给<Activity>标签指定android:launchMode属性来选择启动模式。

    1. standard

    standard是活动默认的启动模式,在不进行显示指定的情况下,所有活动都会自动使用这种启动模式。Android是使用返回栈来管理活动的,在standard模式下,每当启动一个新的活动,它就会在返回栈中入栈,并处理栈顶的位置。对于使用standard模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例

    例如:应用启动显示的活动是A,A中启动了B,B中启动了C,活动A、B、C的启动模式都是standard模式的,这时候你如果想退出这个应用,需要点击三次Back键才可以。

    同样的,如果我们在活动A中,点击按钮Button启动了活动A,然后再点击按钮Button,又启动了A,这时候返回栈中有三个活动A,需要点击三次Back键才能退出应用。

    2. singleTop

    使用singleTop模式时,在启动活动的时候,如果返现返回栈的栈顶已经是该活动,则认为可以直接使用,不会再创建新的该活动的实例。

    例如,系统默认启动了活动A,在活动A中,点击按钮Button启动了活动A,然后再点击按钮Button,又启动了A,这时候返回栈中其实仍旧只有一个活动A,我们只需要点击一次Back键就能退出应用,活动A是singleTop模式的。

    同样的,应用中有A、B两个活动,它们的启动模式都是singleTop,应用启动A,然后A启动了B,B又启动了A活动,这时候返回栈中其实有两个A,一个B,我们需要点击三次Back键才能退出应用。

    3. singleTask

    使用singleTask模式时,每次启动活动的时候,系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在该活动的实例,直接使用该实例,并把这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。

    例如,应用默认启动了活动A,活动A是singleTask模式的,然后A启动了B,B启动了C,C又启动了A,这时候返回栈中其实只有一个A,B、C都已经被出栈,只需要点击一次Back键就可以退出应用。

    4. singleInstance

    使用singleInstance模式的活动,会有一个单独的返回栈来管理这个活动,一般来说,这种模式是可以用来实现其他应用程序和我们的程序可以共享这个活动的实例的,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈。

    例如,应用默认启动了活动A,A启动了活动B,活动B是singleInstance模式的,然后活动B启动了C,我们点击Back键,会从C跳转到活动A,因为A和C在一个返回栈,而B是另一个返回栈,在点击Back键,A跳到了B,再点击Back键,退出程序。

    关于Activity的最基本的一些知识就说完了。

  • 相关阅读:
    反射和内置方法重写
    封装
    接口与抽象类 、多态
    面向对象--继承和组合
    python对象
    模块导入
    python序列化模块
    time random sys os 模块
    python re模块和collections
    python各种推导式
  • 原文地址:https://www.cnblogs.com/yuqf/p/5365472.html
Copyright © 2020-2023  润新知