2-Android客户端基础知识必备 | 青训营笔记

205 阅读6分钟

这是我参与「第四届青训营 」笔记创作活动的第2天。

》》「第二篇笔记」《《

一、Android基础组件

Android四大组件及扩展:

  • 界面组件(Activity & Fragment)
  • 服务组件(Service)
  • 广播组件(Broadcast)
  • 数据组件(ContentProvider & ContentResolver)

Android四大组件及扩展详解

1、界面组件(Activity & Fragment)

Activity:概念

Activity:什么是Activity?
Activity是一种界面容器,一种可视化、可交互的容器,容纳各种可视的组件。
Activity:为什么要有它?
为了使用现在互联科技基础功能服务广大用户,作为用户使用互联的入口,交互点以及可视信息获取。

主要拥有功能:前台交互 & 程序入口 & 布局容器。

Activity:基本用法
1、前置知识

在Android Studio内创建No Activity项目后,App目录结构如下:

1-安卓项目目录结构.png

AndroidManifest.xml:程序清单
MainActivity:入口Java程序

2、创建Activity:
  1. 在res资源目录内创建资源文件夹(资源目录),目录类型layout。
  2. 在右键layout创建>Activity>Empty Activity>在New Android Activity窗口种填入信息。
  3. 在New Android Activity窗口中选中:Generate a Layout File(创建layout布局文件)和Launcher Activity(设置为入口),点击确定后。
  4. 此时Android Studio会在创建Activity的Java文件(默认MainActivity(创建的Activity名))并在AndroidManifest.xml中注册新建Activity并创建xml布局文件,将布局文件绑定至该Activity的Java文件。

AndroidManifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    package="com.example.myapplication1">  
  
    <application        android:allowBackup="true"  
        android:dataExtractionRules="@xml/data_extraction_rules"  
        android:fullBackupContent="@xml/backup_rules"  
        android:icon="@mipmap/ic_launcher"  
        android:label="@string/app_name"  
        android:roundIcon="@mipmap/ic_launcher_round"  
        android:supportsRtl="true"  
        android:theme="@style/Theme.MyApplication1"  
        tools:targetApi="31">  
        
		<!--Activity创建后自动写入内容-->  
		<activity  
	    android:name=".MainActivity"  
	    android:exported="true">  
	    <intent-filter>        
		    <action android:name="android.intent.action.MAIN" />  
	        <category android:name="android.intent.category.LAUNCHER" />  
	    </intent-filter></activity>  
		<!--Activity创建后自动写入内容-->
		
    </application>  
</manifest>
<!--
android:label:设置app默认标题
android:name:声明的Activity名称(应该是Java文件名,再由Java文件指向绑定对应Xml布局文件)

<intent-filter> 及其内部的两行代码表示为该Activity为程序的入口Activity。

-->

MainActivity文件:

package com.example.myapplication1;  
  
import androidx.appcompat.app.AppCompatActivity;  
  
import android.os.Bundle;  
  
public class MainActivity extends AppCompatActivity {  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  //绑定activity_main.xml布局文件
    }  
}

基本流程:注册>布局>绑定

注: 1、上述方法为自动创建Activity方法,如选择layout Resource file手动创建layout-xml文件,则需要手动进行注册>布局>绑定
2、Activity文件为Java文件,该Java文件会在AndroidManifest.xml文件中进行注册,且会绑定对应的xml布局文件。

Activity:生命周期

前言情景介绍:

小明在用真机调试运行自建Android程序时,接了一个电话,通话完后回来发现之前运行中且还在调试的的程序直接结束了,这很无奈。 此方情景,就事关“Activity生命周期”了。

Activity生命周期就是Activity在系统上启动、运行、暂停、终止的一系列状态。

Activity生命周期存在以下状态(方法):
  • onCreate():
    • 一般在创建Activity时调用onCreate()。
  • onStart():
    • Activity已启动,可视但不可交互。
  • onResume():
    • Activity已进入应用前台,位于Activity栈顶,可视可交互。
  • onPause():
    • Activity失去焦点或已暂停(例如应用突然弹出授权框,此时Activity栈顶应时授权框所在的Activity),下一个生命周期状态是onResume或onStop。
  • onStop():
    • Activity不可视,不可交互,下一个生命周期是onRestart或onDestroy
  • onRestart():
    • 重启经过了onStop的Activity,下一个生命周期是onStart
  • onDestory():
    • 销毁Activity,释放该Activity所有使用的资源。(有时程序不会进入此步骤!!)
  • onSavelnstanceState():
    • 在非正常关闭时回调,用于保存数据,不支持持久化数据
  • onRestorelnstanceState():
    • 用于恢复数据

1-Activity生命周期.png

注:上图除正常起始到结束流程外,两侧图示流程很重要!

配置改变场景

当系统发生改变时:语言改变、字体大小、旋转屏幕、键盘显示隐藏等 Activity默认流程:

1-Activity在系统配置改变时的生命周期.png

如若不需要重建则需要按照以下内容进行配置:

1-Activity系统配置改变不重建方法.png

小结:一个Activity启动到结束有多种状态,而状态的转换如上图。掌握其各状态间的转换与转换条件,有利于更加良好的优化我们的Activity与应用。

1-Activity小结.png

Activity:启动模式

情景背景:从一个App中的首个Activity打开多层Activity后,通过某个按钮回到第一个Activity时:

  1. 如果Activity启动模式此时用的standard,则为在建一个同样的Activity移动到前台栈顶(先进后出),此时之前的打开的Activity依旧存在。
  2. 如果Activity启动模式此时用的singleTask,则销毁打开的所有层Activity,只剩第一层Activity(注:栈-先进后出,如按钮返回的不是第一个Activity,则返回层下面的Activity依旧存在-==存疑==)
  • Activity启动模式-standard:
    • 默认模式,允许重复。
  • Activity启动模式-singleTop:
    • 不允许连续重复。
  • Activity启动模式-singleTask:
    • 不允许同个栈内重复。
  • Activity启动模式-singleInstance:
    • 整个系统不允许重复。

1-Activity启动模式小结.png

Fragment:概念

轻量级的容器,相对Activity速度块。 与Activity类似主从概念。

2-Fragment概念图.png

Fragment:基本用法
  1. 创建Fragment布局文件。
  2. 创建Fragment子类,加载布局文件。
  3. Activity加载Fragment
  4. Fragment加载
    1. 静态加载:Activity布局中绑定
    2. 动态加载:FragmentManager加载

使用Fragment时注意:
import androidx.fragment.app.Fragment;
import android.app.Fragment;
import android.support.v4.app.Fragment; 三种方式好像略有区别。待解决。

Fragment:生命周期

与Activity相差不多,额外多出以下内容:

  • onAttach():Fragment和Activity建立关联时调用
  • onCreateView():当Fragment创建视图时调用
  • onActivityCreated():Activity的onCreate()方法已返回时调用 (一般静态绑定时常用)
  • onDestroyView():当Fragmentr中的视图被移除时调用
  • onDetach():Fragment和Activity取消关联时调用

常用: onAttach():在Activity建立前Fragment获取可能只能获取到空。 onDestroyView():

2-Fragment生命周期图.png

Fragment常用生命周期流程:

2-Fragment常用生命周期流程与干预方式.png

Fragment:与Activity交互

组件获取:
Fragment获取Activity中的组件:
getActivity().findViewById(R.id.xxx)
Activity获取Fragment中的组件:
getFragmentManager.findFragmentById(R.id.fragment_xxx)
注:在Fragment与Activity绑定之前(onAttach())获取到的组件为空,注意判空。

数据传递:
1 Activity传数据给Fragment:setArguments(Bundle bundle)
2 Fragment传数据给Activity:
a. 通过对象直接传递(方法调用/接口调用)
b. 通过viewmodel/handler/broadcast/eventbus等通信

Fragment:小结

2-Fragment小结.png

2、服务组件(Service)

Service:概念

后台,无界面运行。

Service:基本用法
  1. 注册:
    1. AndroidManifest中使用<service ... />标签
  2. 创建:
    1. 建立相应的Service实现类(Java)
  3. 加载:
    1. startService():无需与界面有数据交互:如启动一个更新或是下载。
    2. bindService():界面需要与Service有交互:如同步某些数据,类似音乐播放、视频播放后转后台
Service:生命周期

常用生命周期状态:

  • onStart():服务启动
  • onBind():与界面容器绑定
  • onCreate():初始化创建
  • onDestory():销毁

完整周期图:

2-Service生命周期.png

Service:与Activity通信

1、定义Binder子类,并实现getService()方法,返回Service对象
2、实现Service类onBind()方法,返回上述Binderj对象
3、实例化ServiceConnection对象,实现onServiceConnected()方法,从中获取到Service实例
4、Activity中调用bindService()方法,并传递步骤3的ServiceConnection对象,将流程跑起来
5、Activity既可以通过调用Service实例中的方法进行直接通信

3、广播组件(Broadcast)

Broadcast:概念

实现1vN的通信。类似网络广播的概念。

Broadcast:基本用法

静态广播
1注册:AndroidManifesti中使用<receiver../> <intent-filter../>
2创建:建立相应的BroadcastReceiver实现类
3接收:在步骤2类onReceive()中接收广播
4发送:Context.sendBroadcast()

动态广播
注册:Context..registerReceiver()

Broadcast:常用系统广播

Intent.ACTION_CONNECTIVITY_CHANGE:(网路发生变化)
Intent.ACTION_BATTERY_CHANGED:(电量发生变化)
Intent.ACTION_SCREEN_ON:(开屏)
Intent.ACTION_SCREEN_OFF:(关屏)
Intent.ACTION_PACKAGE_INSTALL:(安装应用程序)
Intent.ACTION_BOOT_COMPLETED:(系统启动完成)
Intent.ACTION_PACKAGE_ADDED:(安装程序)
Intent.ACTION_PACKAGE_REPLACED:(程序更新)
Intent.ACTION_PACKAGE_REMOVED:(程序卸载)\

总结:

本节课程:
1、学习Android四大组件与两个扩展和Android通信组件
2、熟悉了Activity & Fragment & Service 3、了解了Broadcast & ContentProvider & ContentResolver

「本篇笔记,多数图片均为引用」
「本篇笔记,部分内容仅个人观点」