系列文章目录


HarmonyOS应用开发01-ArkTS基础知识

HarmonyOS应用开发02-程序框架UIAbility、启动模式与路由跳转


文章目录

  • 系列文章目录
  • 标题又是一周美好的开始,要努力哦~~~
  • 前言
  • 一、UIAbility的生命周期
      • 为了实现夺舍别形态上的裁剪和多窗口的可扩展性,系统对组件管理和窗口管理进行了解耦。
      • UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态;
        • WindowStageCreate和WindowStageDestroy为窗口管理器(WindowStage)在UIAbility中管理UI界面功能的两个生命周期回调,从而实现UIAbility与窗口之间的弱耦合。
    • 1、UIAbility的生命周期
      • (1)、Create状态
      • (2)、Forground状态
      • (3)、Background状态
      • (4)、Destroy状态
    • 2、WindowStage窗口管理器
      • (1)、onWindowStageCreate()
      • (2)、onWindowStageDestroy()
  • 二、UIAbility的启动模式
      • UIAbility当前支持 `singleton`(单实例模式)、`multiton`(多实例模式)和 `specified`(指定实例模式) `3种`启动模式.
    • 1、singleton(单实例模式)
    • 2、multiton(多实例模式)
    • 3、specified(指定实例模式)
  • 三、UIAbility内页面的跳转和数据传递
    • 1、FirstPage
      • (1)、页面跳转和参数接收
      • (2)、配置路由
      • (3)、跳转路由并传递参数
    • 2、SecondPage
      • (1)、接收路由跳转传递进来的参数
      • (2)、页面返回传递参数、上一页面接收参数
    • 3、代码
      • (1)、路由配置
      • (2)、学生列表界面
      • (2)、学生详情界面
    • 代码仓库地址:
  • 总结

标题又是一周美好的开始,要努力哦~~~

前言

UIAbility简单来说就是一种包含用户界面的应用组件,用于和用户进行交互。每一个UIAbility实例,对应于一个最近任务列表中的任务。

一个应用可以有一个UIAbility,也可以有多个UIAbility。一个UIAbility可以对应于多个页面,建议将一个独立的模块放到一个UIAbility中,以页面的形式呈现。

先看下通过应用程序框架UIAbility、启动模式和路由参数跳转,我们实现的简单Demo效果图:


一、UIAbility的生命周期

为了实现夺舍别形态上的裁剪和多窗口的可扩展性,系统对组件管理和窗口管理进行了解耦。

1、UIAbility的生命周期


在新建空工程后,会发现在entry/src/main/ets/entryability/目录下有一个EntryAbility.ts文件,它对应于entry/src/main/ets/pages目录下的Index.ets:

import UIAbility from '@ohos.app.ability.UIAbility';
import hilog from '@ohos.hilog';
import window from '@ohos.window';export default class EntryAbility extends UIAbility {onCreate(want, launchParam) {// 应用初始化}onDestroy() {// onDestroy()在UIAbility实例销毁时触发// 可以用于资源的释放,数据的保存等}onWindowStageCreate(windowStage: window.WindowStage) {// 设置UI页面加载// 设置WindowState的事件订阅(获焦/失焦、可见/不可见)// Main window is created, set main page for this ability// 使用 windowStage.loadContent设置要加载的页面,并根据需要订阅WindowState的事件// windowStage.loadContent('pages/Index', (err, data) => {windowStage.loadContent('pages/StudentListPage', (err, data) => {if (err.code) {return;}});}onWindowStageDestroy() {// 释放UI界面资源}onForeground() {// 申请系统需要的资源,或者重新申请在onBackground中释放的资源}onBackground() {// 释放UI页面不可见时无用的资源,或者在此回调中执行较为耗时的操作(例如状态保存等)}
}

(1)、Create状态

在UIAbility实例创建时触发,系统会调用onCreate()回调,可以在onCreate()回调中进行相关初始化操作。

import UIAbility from '@ohos.app.ability.UIAbility';
import window from '@ohos.window';export default class EntryAbility extends UIAbility {onCreate(want, launchParam) {// 应用初始化...}...
}

(2)、Forground状态

Forground状态在UIAbility切换至前台时触发,对应onForground()回调,它会在UIAbility的UI页面可见之前触发(即UIAbility切换至前台的时候触发)。在onForground()回调中,可以申请系统需要的资源,或者重新申请在onBackground()中释放的资源。

import UIAbility from '@ohos.app.ability.UIAbility';
import window from '@ohos.window';export default class EntryAbility extends UIAbility {...onForeground() {// 申请系统需要的资源,或者重新申请在onBackground中释放的资源...}
}

(3)、Background状态

Background状态在UIAbility切换至后台时触发,对应onBackground()回调,它会在UIAbility完全不可见之后触发(即UIAbility切换至后台的时候触发)。在onBackground()回调中可以释放UI页面不可见时无用的资源,或者在此回调中执行较为好使的操作,例如庄涛保存等。

import UIAbility from '@ohos.app.ability.UIAbility';
import window from '@ohos.window';export default class EntryAbility extends UIAbility {...onBackground() {// 释放UI页面不可见时无用的资源,或者在此回调中执行较为耗时的操作// 例如状态保存等...}
}

(4)、Destroy状态

Destroy状态,在UIAbility销毁时触发,对应onDestroy()回调,可以在其中进行系统资源的释放、数据的保存等操作。

import UIAbility from '@ohos.app.ability.UIAbility';
import window from '@ohos.window';export default class EntryAbility extends UIAbility {...onDestroy() {// 系统资源的释放、数据的保存等...}
}

2、WindowStage窗口管理器

为了实现多设备形态上的裁剪和多窗口的可扩展性,系统对组件管理和窗口管理进行了解耦。UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态,WindowStageCreate和WindowStageDestroy为窗口管理器(WindowStage)在UIAbility中管理UI界面功能的两个生命周期回调,从而实现UIAbility与窗口之间的弱耦合。

(1)、onWindowStageCreate()

在UIAbility实例创建完成之后,在进入Forground状态之前,系统会创建一个WindowState。每一个UIAbility实例都对应持有一个WindowState实例。

WindowState为本地窗口管理器,用于管理窗口相关的内容,例如与界面相关的获焦/失焦、可见/不可见。

可以在onWindowsTATECreate()回调中设置UI页面加载、设置WindowState的事件订阅。在onWindowStageCreate(windowStage)中通过loadContent接口设置应用要加载的页面。

import UIAbility from '@ohos.app.ability.UIAbility';
import window from '@ohos.window';export default class EntryAbility extends UIAbility {...onWindowStageCreate(windowStage: window.WindowStage) {// 设置UI页面加载// 设置WindowStage的事件订阅(获焦/失焦、可见/不可见)...windowStage.loadContent('pages/Index', (err, data) => {...});}...
}

(2)、onWindowStageDestroy()

对应于onWindowStageCreate()回调,在UIAbility实例销毁之前,会进入onWindowStageDestroy()回调,可以在其中释放UI页面资源。

import UIAbility from '@ohos.app.ability.UIAbility';
import window from '@ohos.window';export default class EntryAbility extends UIAbility {...onWindowStageDestroy() {// 释放UI页面资源...}
}

二、UIAbility的启动模式

UIAbility当前支持 singleton(单实例模式)、multiton(多实例模式)和 specified(指定实例模式) 3种启动模式.

1、singleton(单实例模式)

每次调用startAbility()方法时,如果应用进程中该类型的UIAbility实例已经存在,则复用系统中的UIAbility实例,系统中只存在唯一一个该UIAbility实例。

即在最近任务列表中只存在一个该类型的UIAbility实例。

singleton启动模式,每次调用startAbility()启动UIAbility时,如果应用进程中该类型的UIAbility实例已经存在,则复用系统中的UIAbility实例,系统中只存在唯一一个该UIAbility实例。

singleton启动模式的开发使用,在module.json5文件中的“launchType”字段配置为“singleton”即可。

{"module": {..."abilities": [{"launchType": "singleton",...}]}
}

2、multiton(多实例模式)

用户在使用分屏功能时,希望使用两个不同应用(例如备忘录应用和图库应用)之间进行分屏,也希望能使用同一个应用(例如备忘录应用自身)进行分屏。

这种情况下可以将UIAbility配置为multiton(多实例模式)。每次调用startAbility()方法时,都会在应用进程中创建一个该类型的UIAbility实例。

即在最近任务列表中可以看到有多个该类型的UIAbility实例。

multiton启动模式,每次调用startAbility()方法时,都会在应用进程中创建一个该类型的UIAbility实例。

multiton启动模式的开发使用,在module.json5文件中的“launchType”字段配置为“multiton”即可。

{"module": {..."abilities": [{"launchType": "multiton",...}]}
}

3、specified(指定实例模式)

用户打开文档应用,从文档应用中打开一个文档内容,回到文档应用,继续打开同一个文档,希望打开的还是同一个文档内容;以及在文档应用中新建一个新的文档,每次新建文档,希望打开的都是一个新的空白文档内容。

这种情况下可以将UIAbility配置为specified(指定实例模式)。在UIAbility实例新创建之前,允许开发者为该实例创建一个字符串Key,新创建的UIAbility实例绑定Key之后,后续每次调用startAbility方法时,都会询问应用使用哪个Key对应的UIAbility实例来响应startAbility请求。如果匹配有该UIAbility实例的Key,则直接拉起与之绑定的UIAbility实例,否则创建一个新的UIAbility实例。运行时由UIAbility内部业务决定是否创建多实例。

specified启动模式,根据业务需要是否创建一个新的UIAbility实例。在UIAbility实例创建之前,会先进入AbilityStage的onAcceptWant回调,在onAcceptWant回调中为每一个UIAbility实例创建一个Key,后续每次调用startAbility()方法创建该类型的UIAbility实例都会询问使用哪个Key对应的UIAbility实例来响应startAbility()请求。

三、UIAbility内页面的跳转和数据传递

UIAbility的数据传递包括有 UIAbility内页面的跳转和数据传递UIAbility间的数据跳转和数据传递,本章节主要讲解UIAbility内页面的跳转和数据传递。

在一个应用包含一个UIAbility的场景下,可以通过新建多个页面来实现和丰富应用的内容。这会涉及到UIAbility内页面的新建以及UIAbility内页面的跳转和数据传递。

接下来就继续完善我们的"学生列表",实现点击Item右侧的"Next"按钮,跳转进入学生详情页面并传入当前学生name,
在学生详情页面底部有一个Button,点击跳转回学生列表页面,并且传递一个参数给上一页面学生列表页面,并显示UI。


页面间的导航可以通过页面路由router模块来实现。页面路由模块根据页面url找到目标页面,从而实现跳转。通过页面路由模块,可以使用不同的url访问不同的页面,包括跳转到UIAbility内的指定页面、用UIAbility内的某个页面替换当前页面、返回上一页面或指定的页面等。

1、FirstPage

将我们的Index.ts文件下的StudentListPage.ts设置为启动页面,在src/main/ets/entryability/EntryAbility.ts文件中的onWindowStageCreate()回调中进行修改, 使用 windowStage.loadContent设置要加载的页面
windowStage.loadContent('pages/StudentListPage', (err, data)

import UIAbility from '@ohos.app.ability.UIAbility';
import hilog from '@ohos.hilog';
import window from '@ohos.window';export default class EntryAbility extends UIAbility {onWindowStageCreate(windowStage: window.WindowStage) {// 设置UI页面加载// 设置WindowState的事件订阅(获焦/失焦、可见/不可见)// Main window is created, set main page for this ability// 使用 windowStage.loadContent设置要加载的页面,并根据需要订阅WindowState的事件// windowStage.loadContent('pages/Index', (err, data) => {windowStage.loadContent('pages/StudentListPage', (err, data) => {if (err.code) {return;}});}
}

给StudentListPage.ts加入@Entry装饰符

import DataModel from '../viewmodel/DataModel';
import StudentListItem from '../view/StudentListItem';
import router from '@ohos.router';const TAG = '[StudentListPage]';@Entry
@Component
export struct StudentListPage {...
}

(1)、页面跳转和参数接收

在使用页面路由之前,需要先导入 router 模块:

import router from '@ohos.router';

(2)、配置路由

entry/src/main/resources/base/profile/main_pages.json 文件中配置页面路由信息:

{"src": ["pages/Index","pages/StudentDetailPage","pages/StudentListPage"]
}

(3)、跳转路由并传递参数

在StudentListPage的组件StudentListItem中,设置“Next” Image的点击事件:

Image($r('app.media.ic_arrow_next')).width('30vp').height('30vp').margin('30vp').onClick(() => {console.log('Next Click' + this.name);router.pushUrl({// url: 'pages/StudentDetailPage',url: CommonConstants.STUDENT_DETAIL_URL,params: {// 自定义的参数"name"name: this.name,}}).catch((error) => {console.log('Next Click', 'IndexPage push error' + JSON.stringify(error));})})

2、SecondPage

在src/main/ets/pages目录下,右键,新建一个StudentDetailPage页面,用于实现页面间的跳转和数据传递。

(1)、接收路由跳转传递进来的参数

在StudentDetailPage.ts文件中,通过调用router.getParams()方法获取StudentListPage页面传递过来的自定义参数。

import router from '@ohos.router'const TAG = '[StudentDetailPage]';@Entry
@Component
struct StudentDetailPage {// 接收到的参数,因为UI要跟着参数进行变化,所以需要加@State装饰符@State name: string = (router.getParams() as Record<string, string>)['name'];aboutToAppear() {console.log(TAG, 'StudentDetailPage接收的参数是: ' + this.name);}build() {Column({ space: 16 }) {Text(this.name)....textAlign(TextAlign.Center)Text(this.name.repeat(100)).margin({top: '30vp',bottom: '30vp',})}
}

(2)、页面返回传递参数、上一页面接收参数

在StudentDetailPage 页面中,可以通过调用router.back()方法实现返回到上一个页面,或者在调用router.back()方法时增加可选的options参数(增加url参数)返回到指定页面。

  • 直接返回商议页面:
router.back();
  • 返回到指定页面、传参:
// 调用router.back()方法返回上一个页面或者返回指定页面时,根据需要继续增加自定义参数,例如在返回时增加一个自定义参数srcrouter.back({url: 'pages/StudentListPage',params: {backMessage: this.backMessage,}
})

在上一页面StudentListPage中接收返回传递进来的参数:
调用router.back()方法,不会新建页面,返回的是原来的页面,在原来页面中@State声明的变量不会重复声明,以及也不会触发页面的aboutToAppear()生命周期回调,因此无法直接在变量声明以及页面的aboutToAppear()生命周期回调中接收和解析router.back()传递过来的自定义参数。需要在onPageShow() 中解析传递回来的参数:

import DataModel from '../viewmodel/DataModel';
import StudentListItem from '../view/StudentListItem';
import router from '@ohos.router';const TAG = '[StudentListPage]';@Entry
@Component
export struct StudentListPage {private studentList: Array<string> = [];@State backMessage: string = '';// 调用router.back()方法,不会新建页面,返回的是原来的页面,在原来页面中@State声明的变量不会重复声明,// 以及也不会触发页面的aboutToAppear()生命周期回调,因此无法直接在变量声明以及页面的aboutToAppear()// 生命周期回调中接收和解析router.back()传递过来的自定义参数。onPageShow() {this.backMessage = router.getParams()?.['backMessage'];console.log(TAG, 'StudentDetailPage返回数据:StudentListPage => ' + this.backMessage)}build() {Column({ space: 16 }) {...if (this.backMessage != null && this.backMessage != "") {Text('返回数据:' + this.backMessage).fontSize('30fp').fontColor(Color.Red).width('100%').margin({top: '100vp',left: '30vp'})}}.width('100%').height('100%').backgroundColor($r('app.color.page_background'))}
}

至此,实现了UIAbility内页面间的跳转并传参的简单实例。

3、代码

以下给出本实例【UIAbility内页面间的跳转并传参】的全部代码:

(1)、路由配置

在entry/src/main/resources/base/profile/main_pages.json中配置路由页面信息:

{"src": ["pages/Index","pages/StudentDetailPage","pages/StudentListPage"]
}

(2)、学生列表界面

Item组件StudentListItem:

import router from '@ohos.router';
import CommonConstants from '../common/constants/CommonConstants';@Component
export default struct StudentListItem {@State isChecked: boolean = false;private name?: string;@Builder checkIcon(icon: Resource) {Image(icon).objectFit(ImageFit.Contain).width($r('app.float.checkbox_width')).height($r('app.float.checkbox_height')).margin($r('app.float.checkbox_margin'))}build() {Row() {if (this.isChecked) {this.checkIcon($r('app.media.ic_checked'))} else {this.checkIcon($r('app.media.ic_unchecked'))}Text(this.name).fontColor(this.isChecked ? Color.Red : Color.Black).fontSize(this.isChecked ? $r('app.float.item_checked_font_size') : $r('app.float.item_font_size')).fontWeight(500).opacity(this.isChecked ? 0.5 : 1.0).decoration({ type: this.isChecked ? TextDecorationType.LineThrough : TextDecorationType.None })Blank()Image($r('app.media.ic_arrow_next')).width('30vp').height('30vp').margin('30vp').onClick(() => {console.log('Next Click' + this.name);router.pushUrl({// url: 'pages/StudentDetailPage',url: CommonConstants.STUDENT_DETAIL_URL,params: {name: this.name,}}).catch((error) => {console.log('Next Click', 'IndexPage push error' + JSON.stringify(error));})})}.borderRadius(22).backgroundColor($r('app.color.start_window_background')).width('100%').width('100%').height($r('app.float.list_item_height')).onClick(() => {this.isChecked = !this.isChecked;})}
}

学生列表页面StudentListPage:

import DataModel from '../viewmodel/DataModel';
import StudentListItem from '../view/StudentListItem';
import router from '@ohos.router';const TAG = '[StudentListPage]';@Entry
@Component
export struct StudentListPage {private studentList: Array<string> = [];@State backMessage: string = '';// 调用router.back()方法,不会新建页面,返回的是原来的页面,在原来页面中@State声明的变量不会重复声明,// 以及也不会触发页面的aboutToAppear()生命周期回调,因此无法直接在变量声明以及页面的aboutToAppear()// 生命周期回调中接收和解析router.back()传递过来的自定义参数。onPageShow() {this.backMessage = router.getParams()?.['backMessage'];console.log(TAG, 'StudentDetailPage返回数据:StudentListPage => ' + this.backMessage)}aboutToAppear() {this.studentList = DataModel.getStudentList();// this.backMessage = router.getParams()?.['backMessage'];}build() {Column({ space: 16 }) {Text($r("app.string.Student_List_Title")).fontSize('28fp').fontWeight(FontWeight.Bold).lineHeight('33vp').width('100%').margin({top: '24vp',bottom: '12vp',}).textAlign(TextAlign.Center)ForEach(this.studentList, (item: string) => {StudentListItem({ name: item })}, (item: string) => JSON.stringify(item))if (this.backMessage != null && this.backMessage != "") {Text('返回数据:' + this.backMessage).fontSize('30fp').fontColor(Color.Red).width('100%').margin({top: '100vp',left: '30vp'})}}.width('100%').height('100%').backgroundColor($r('app.color.page_background'))}
}

(2)、学生详情界面

import router from '@ohos.router'const TAG = '[StudentDetailPage]';@Entry
@Component
struct StudentDetailPage {// 接收到的参数,因为UI要跟着参数进行变化,所以需要加@State装饰符@State name: string = (router.getParams() as Record<string, string>)['name'];// 点击Button-Back返回给上个页面一个参数@State backMessage: string = this.name + "最帅!!!"aboutToAppear() {console.log(TAG, 'StudentDetailPage接收的参数是: ' + this.name);}build() {Column({ space: 16 }) {Text(this.name).fontSize('28fp').fontColor(Color.Blue).fontWeight(FontWeight.Bold).lineHeight('33vp').width('100%').margin({top: '24vp',bottom: '12vp',}).textAlign(TextAlign.Center)Text(this.name.repeat(100)).margin({top: '30vp',bottom: '30vp',})// 可以通过调用router.back()方法实现返回到上一个页面,// 或者在调用router.back()方法时增加可选的options参数(增加url参数)返回到指定页面Blank()Button('返回').fontSize('16fp').width('300vp').height('35vp').backgroundColor($r('app.color.page_background2')).onClick(() => {// 返回上一个页面// router.back();// 返回到指定页面// router.back({ url: 'pages/StudentListPage' });// 调用router.back()方法返回上一个页面或者返回指定页面时,根据需要继续增加自定义参数,例如在返回时增加一个自定义参数srcrouter.back({url: 'pages/StudentListPage',params: {backMessage: this.backMessage,}})})}.width('100%').height('100%').padding('16vp').backgroundColor($r('app.color.page_background'))}
}

代码仓库地址:

Gitee

Github


总结

本节实现了学生页面详情界面的UI,使用了页面路由进行跳转、传参、返回、传参等,并学习了UIAbility的生命周期状态与UIAbility的启动模式。接下来会继续按照官网的课程学习基本的UI组件。

HarmonyOS应用开发02-程序框架UIAbility、启动模式与路由跳转相关推荐

  1. android+rom+bootloader+flash,Android ROM开发(4) bootloader 三种启动模式

    Andrew Huang 转载请注明作者及网址 HTC手机中用的bootloader称为HBoot,不知道是不是HTC Bootloader 之意,从官网的源码看这个bootloader不象是u-bo ...

  2. android rom 工作,Android ROM开发(4) bootloader 三种启动模式

    Andrew Huang 转载请注明作者及网址 HTC手机中用的bootloader称为HBoot,不知道是不是HTC Bootloader 之意,从官网的源码看这个bootloader不象是u-bo ...

  3. SingleTask启动模式,Intent跳转获取不到Bundle携带的值

    本文转自:https://www.jianshu.com/p/fe98ae8e3fb4 作者:Android平头哥 1.问题描述 今天碰到了一个问题,当一个Activity的启动模式为SingleTa ...

  4. 小程序服务器搭建前后端交互,微信小程序:request前后端交互 路由跳转 存储数据到本地和获取 小程序登入 授权...

    一 request前后端交互 基本样式 wx.request({ url:'test.php', //仅为示例,并非真实的接口地址 data: { x:'', y:''}, header: {'con ...

  5. 微信小程序开发---小程序框架---小程序的逻辑层---3

     小程序的逻辑层 小程序注册逻辑 页面注册逻辑 小程序注册逻辑 App函数 注册全局唯一的小程序 只能调用一次 接受一个对象作为函数参数,这个对象指定了两个东西(第一个东西是小程序的全局数据,第二个东 ...

  6. UG/NX 二次开发(C#) 程序自动切换制图模式

    作为C#语言的铁粉,在做二次开发的时候,发现西门子在C#语言下的支持还是不够完善. 就拿自动切换制图模式来说,C++可以直接调用内部函数 UI_APP_change_application,还在网上找 ...

  7. 用PhoneGap开发移动程序

    1.     什么是PhoneGap PhoneGap是一个自由开放源码的开发工具和框架,允许利用HTML + JavaScript + CSS的强大功能在多个手机平台上开发程序,开发出来的程序经过在 ...

  8. 【游戏程序设计】程序框架

    本分类文章基本都是学习自浅墨大神的博客,具体的算法思想与实现过程就不赘述了. 传送门:浅墨 再此仅仅贴上我的代码,记录一下学习之旅. 编译环境:vs2010 首先看下运行结果吧. 源代码: //--- ...

  9. 嵌入式linux启动过程分析,嵌入式Linux裸机开发(二)——S5PV210启动过程分析

    嵌入式Linux裸机开发(二)--S5PV210启动过程分析 一.iROM启动方式简介 友善之臂Smart210开发板的SoC为三星S5PV210,S5PV210采用iROM启动方式进行启动,通过查阅 ...

  10. 【Android 应用开发】Android 返回堆栈管理 ( 默认启动模式 | 栈顶复用启动模式 | 栈内复用启动模式 | 单实例启动模式 | CLEAR_TOP 标识 )

    文章目录 I . 默认启动模式 ( standard ) II . 栈顶复用启动模式 ( singleTop ) III . 栈内复用启动模式 ( singleTask ) IV . 单实例启动模式 ...

最新文章

  1. apache httpd服务器403 forbidden的问题
  2. linux c不占用cpu的延时,linux下写个C语言程序,要求有0.5微秒以下的延时,要怎样写...
  3. C语言指定编译对齐方式
  4. java和c++的区别大吗_大空间消防水炮ZDMS0.8/30S坐装和吊装有区别吗?
  5. 【FLink】Flink SQL代码生成与UDF重复调用的优化
  6. 微服务升级_SpringCloud Alibaba工作笔记0015---Nacos安装
  7. 《Linux内核设计与实现》读书笔记 - 目录 (完结)【转】
  8. 正则表达式:re.match、re.search、re.sub、re.compile、findall、re.finditer、re.split
  9. ESP实验02-读取DS1307eerom34c32
  10. 使用BeautifulSoup爬取“0daydown”网站的信息(2)——字符编码问题解决
  11. 京东自动化签到脚本-京东休闲游戏自动化签到助手
  12. 2021牛客暑假多校第二场 I题—Penguins
  13. 2021牛客多校6 I Intervals on the Ring
  14. 心理正常与异常的区分_判断心理正常异常三原则
  15. 情侣间常犯的7个沟通问题
  16. 虚拟机安装centos7上网设置总结
  17. via动态时间html代码,高考倒计时html代码
  18. apache common base64编码
  19. 安装过程中弹出错误信息,Xshell4提示nslicense.dll无法安装成功
  20. MAC OS部署 TOMCATJ2EE项目

热门文章

  1. python自动化测试selenium浏览器驱动webdriver常见方法
  2. 英语每日听写练习 Day 8
  3. 中国立体地图(超高清)
  4. 计算机自带游戏怎么调,今天才知道,原来电脑上自带游戏模式,开启后瞬间提升流畅度...
  5. 关于JAVA,JS,mysql中的String类方法的对比
  6. 杂记——基于深度学习的图像边缘和轮廓提取方法简介
  7. 关于深度学习理论和架构的最新综述(参考文献)
  8. win7访问服务器共享文件夹提示没有权限,win7设置共享后访问提示无权限的解决方法...
  9. Android 获取本地音乐生成对象,获取对应audio文件中的专辑图片
  10. C++ 模板与泛型编程 《C++Primer》第16章(上)———— 读书笔记