android学习之旅(11)--Activity与Fragment

Activity

Activity是Android的四大组件之一,在Android应用的开发中占有举足轻重的作用。简单来说我们在屏幕上看到界面就是一个Activity,它表示一个单一屏幕的用户界面。

创建Activity

(1)新建类继承Activity或其子类
(2)在AndroidManifest中声明(注册)
(3)创建layout并在新建类的onCreate方法中设置

  • 如果是使用继承开发环境那么在创建新的Activity时,编译器会自动完成上述步骤

Activity的生命周期

在Android中Activity的运行使用了回调机制,Activity在不同的生命周期中切换时,就会触发对应的回调函数。开发者就可以通过重写方法进行相关业务的处理。
Activity大致会经过4种状态:
(1)运行转态:当前Acticity位于前台,用户可见,可以获得焦点。
(2)暂停状态:其他Actictiy位于前台,该Actictiy依然可见,只是不能获得焦点。
(3)停止状态:该Acticity失去焦点。
(4)销毁状态:该Acticity结束,或者Acticity所在的进程被结束。

Acticity的生命周期

方法调用时机
onCreate()创建Acticity时被回调,该方法只会被调用一次
onStart()启动Acticty时被回调
onRestart()重新启动Acticity时被回调
onResume()恢复Acticty时被回调。在onStart()方法之后一定会回调onRestart()方法
onPause()暂停Acticity时被回调
onStop()停止Acticity时被回调
onDestroy()销毁Acticity时被回调。该方法只会被调用一次。

通过代码观看Acticity的生命周期

package com.kong.viewtext;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class LifeCycleActivity extends AppCompatActivity {

    private Button m_ChangeActicity;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_life_cycle);
        m_ChangeActicity=findViewById(R.id.changeActicity);
        m_ChangeActicity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.setClass(LifeCycleActivity.this,MainActivity.class);
                startActivity(intent);
                Log.v("ActivityLifeCycle","切换Acticty");
            }
        });
        Log.v("ActivityLifeCycle","--onCreate--");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.v("ActivityLifeCycle","--onDestroy--");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.v("ActivityLifeCycle","--onRestart--");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.v("ActivityLifeCycle","--onResume--");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.v("ActivityLifeCycle","--onStart--");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.v("ActivityLifeCycle","--onPause--");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.v("ActivityLifeCycle","--onStop--");
    }
}

Acticty回调函数的调用时机

Acticity的4种加载模式

android的四大组件在使用时都需要在清单文件中注册,配置Acticity是可以指定android:launchMode属性,该属性用于配置该Acticity的加载模式。该属性支持如下4个属性值。

standard: 标准模式,默认加载模式

singleTop: Task栈顶单例模式

singleTask: Task栈内单例模式

singleInstance: 全局单例模式

在Android中采用Task来管理多个Acticity,当我们启动一个任务栈时Android就会创建一个任务栈(该栈的名称默认为包名),用来管理Acticity,按启动的顺序依次进栈。而加载模式(负责管理实例化)就决定了Actictiy按何种方式加载在前台。

  • standard模式:
    在该模式下,Acticity每次都会被实例化,并且将该Acticity添加到当前的任务栈中,这种模式不会启动新的任务栈,新的Acticity将被添加到原来的任务栈中。

  • singleTop模式:
    在该模式下,当要启动的Acticity位于任务栈的栈顶时,系统不会重新创建目标Acticity的示例,而是直接复用已有的Acticity的实例。如果将要启动的Acticity没有位于任务栈的栈顶,该模式和标准模式相同。

  • singleTask模式:
    在该模式下,当要启动的Acticity在任务栈中已经存在(无论是不是在栈顶)系统就会直接复用栈中已存在的实例。需要注意的是:如果将要启动的Acticity不在任务栈的栈顶时,系统会将栈中位于当前Acticity之上的所有Acticity全部移除,从而使得当前Acticity位于栈顶。

  • singleInstance模式:
    在该模式下,系统保证无论从那个任务栈中启动目标Acticty,只会创建一个目标Acticity实例,并会使用一个全新的任务栈来加载该Acticity实例。
    当系统采用singleInstance模式启动目标Acticity时,可以分为以下两种情况:
    (1)如果将要启动的目标Acticity不存在,系统会先创建一个全新的任务栈,在创建目标Acticty的实例,并将它加入新的任务栈栈顶。
    (2)如果将要启动的目标Acticity已经存在,无论它位于那个应用程序中,位于那个任务栈中,系统都会将该Acticity转到前台,从而使该Acticity显示出来。

Fragment

Fragment是在Android3.0之后引入的新API,它的意思是“碎片”,Fragment拥有自己的生命周期,也可以接受它自己的输入事件。其目的是为了适应不同屏幕分辨率、支持更加动态和灵活的UI设计。Fragment实际可以看成一个子模块,它必须在Acticity中使用,不能单独脱离Acticity,它和Acticity的关系是“多对多”的,而且拥有自己的布局文件,这样就可以将多个Acticity中相同的部分,“抽取”出来作成一个Fragment,这样就可以实现界面的复用。此外,Fragment也拥有自己的生命周期,不过其生命周期受它所在的Acticity的影响。

Fragment的特征

Fragment简化了大屏幕UI的设计,它不需要开发者管理组件包含关系的复杂变化,开发者使用Fragment对UI组件进行分组、模块化管理,就可以更方便地在运行过程中动态更新Acticity的用户界面。Fragment拥有以下特征:

  • Fragment总是作为Acticity界面的组成部分。Fragment可调用getActicity()方法获取它所在的Acticity,Acticity可以调用FragmentManager的findFragmentById()或findFragmentByTag()方法来获取Fragment。

  • 在Acticity运行过程中,可调用FragmentManager的add()、remove()、replace()方法进行动态的添加、删除或替换Fragmrnt。

  • 一个Acticity可以同时组合多个Fragment;反过来一个Fragment也可以多个Acticity复用。

  • Fragment可以响应自己的输入事件,并拥有自己的生命周期,但它们的生命周期直接被其所属的Acticity的生命周期控制。

Fragment的优点

1、Fragment可以Acticity分离多个可重用的组件。
2、Fragment可以轻松的创建动态灵活的UI设计,可以适应的不同的分辨率。
3、Fragment是一个独立的模块,仅仅地与Acticity绑定在一起,可以动态的进行移除、加入、交换等操作。
4、Fragment提供一个新的方式在不同的安卓设备上统一UI。
5、Fragment切换流畅、轻量切换。
6、Fragment替换TabActicity做导航,性能更好。

Fragment的生命周期

与Acticity类似,Fragment也存在如下状态:

运行状态: 当前Fragment位于前台,用户可见,可以获得焦点。

暂停状态: 其他Acticity位于前台,该Fragment依然可见,只是不能获得焦点。

停止状态: 该Fragment不可见,失去焦点。

销毁状态: 该Fragment被完全删除,或改Fragment所在的Acticity被结束

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PIAek2tq-1578290900099)(./ImageResources/Fragment的生命周期.jpg)]

Fragment生命生命周期中调用的函数
方法调用时机
onCreate(Bundle savedStatus)创建Fragment时被回调。该方法只会被回调一次。
onCreateView()每次创建、绘制该Fragment的View组件时回调该方法,Fragment将会显示该方法返回的组件。
onActicityCreated()当Fragment所在的Acticity被启动完成后调该方法。
onStart()启动Fragment时被回调。
onResume()恢复Fragment时被回调,在onStart方法之后一定会调用onResume()方法。
onPause()暂停Fragment时被回调。
onStop()停止Fragment时被回调。
onDestroyView()销毁该Fragment所包含的View组件时调用。
onDestroy()将该Fragment时被回调,该方法只会被调用一次。
onDetach()将该Fragment从Acticity中删除、替换完成时回调该方法,在onDestroy()方法后一定会回调onDetach()方法。该方法只会被调用一次。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值