浅谈Activity

浅谈四大组件之Activity


一.什么是Activity

以下都是我学习之后对activity的理解和笔记,以及自己的看法和总结:
Activity在应用中的表现为一个用户界面,他会加载各种ui来与用户进行交互,在我看来,activity译为活动,可以理解为一个网页,activity之间可以相互跳转,就像用户浏览一个个的网页,将不同的页面连在一起,完成一系列操作流程。
如果一个activity在AndroidManifes.xml中被设置为如下的intent-filter:

    <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>

那么这个Activity就会作为这个应用的入口,所以一般读一个应用时,优先找到这个入口的activity,然后再找到这个activity的布局进行分析就会简单多了。

二.Activity的生命周期

每个activity都有生命周期,官方给出了生命周期的流程图,以下是我对activity生命周期的理解:

  • onCreated:每次创建Activity的类是默认生成这个方法,Activity创建时调用,通常在此方法中完成Activity的初始化操作,例如setContentView()设置布局,绑定事件等等。
  • onStart():表示activity正在启动,即将开始,注意即将俩字,广义上可以理解为activity显示了,但还没出现在前台。
  • onResume:Activity拿到了焦点,可以理解为显示到了前台
  • onPause:Activity被遮挡,失去焦点时调用,可以在此时做一些数据存储,停止动画的,但不能太耗时。为什么下面会解释。
  • onStop:Activity隐藏时调用,注意隐藏表示activity在前台看不见了,但还没被销毁,此时可以做些重量级回收,但也不能太耗时
  • onDestroy:activity被销毁,这是Activity生命周期的最后回调。在这可以释放资源
  • onRestart:activity重新启动,意为当前activity从隐藏变为可见是调用

那么Activity的切换或者开启有各种具体情况,我们只需要根据上述结合焦点的理解就能分析出典型activity情况下的生命周期,比如:
假设由Activity跳转到一个新的Activity,那么是当前activity的onPaues先执行,还是新activity的onResume先执行?
那么针对这个问题,在表面上我们只需用焦点来理解,当前activity消失,意味着失去焦点,随后新activity才能拿到焦点,所以onPause必须执行完,新activity的onResume才会执行,所以这就解释了为什么不能再onPause里做太耗时的操作,因为这会影响新activity的显示。

三.Activity的启动模式

当我们创建一个Activity的时候,系统会创建一个Activity的实例并且把它放入任务栈中,任务栈是一种“先进后出”的栈结构。Activity有4种启动模式,可以在Manifext或代码中设置。

1.standard

标准启动模式:Activity的默认启动模式,每次启动一个Activity都会为它创建一个实例,不管这个实例是否存在。后面这句话很重要,也就是多次打开这种Activity的话,就会重复创建这个Activity,非常耗资源。

2.singleTop

栈顶复用:顾名思义,在这种模式下,如果要创建的Activity已经在栈顶,那么此Activity不会再创建,而是重用位于栈顶的那个Activity实例,并且会调用onNewIntent方法,但是要创建的Activity不在栈顶,那么还是会创建一个新的实例。

3.singleTask

栈内复用:一个任务栈中只能有一个Activity的实例,要注意的是,如果已经存在Activity,系统会把处在该Activity上的所有Activity退栈。

4.singleInstance

单例模式:Activity会在一个独立的任务栈中开启,并且这个新的任务栈有且只有这一个实例。而且能够保证这种Activity在系统中只有一个实例,不管有多少应用要启动该Activity,这个Activity有且只有一个。

三.IntentFilter的匹配规则

提到启动Activity就不得不提Intent和IntentFilter,我们知道,启动Activity分为显示启动和隐式启动,显示调用需要明确指出被启动的组件的信息,包括包名和类名,而隐式则不需要。intent就不需多提了,一般翻译为意图,是组件之间的桥梁,我理解为条件。打开Activity都需要某种条件,IntentFilter就是我开出的条件,而满足我开出条件的组件就会被打开。如果匹配不成功就无法启动目标Activity。

一个Activity可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter即可启动对应的Activity,那么下面介绍最常用的action,category和data属性的过滤规则:

1.action

一个过滤规则中可以有多个action,只要intent中的action能够和过滤规则中的任何一个action相同就算匹配成功。

2.category

intent可以没有category,如果有,不管有几个, 每一个都要与过滤规则的任何一个相同。category意为类别,我们可以理解这是对action的具体描述,action理解为一个大致的条件,category越多这个描述越具体,当然条件越苛刻,所能与之匹配的组件越少。

3.data

data规则类似action,匹配规则中定义了data的话,那么Intent中必须也要定义可匹配的data。data由两部分组成,mimeType和Uri。前者指媒体类型,比如jpeg,MP4之类的,可以表示图片文本视频的媒体格式,而Uri很熟悉就不多做介绍。

总结下:隐式调用过程很像相亲,相亲会开出很多大体框架的条件,比如是否漂亮,身材,性格。。。这就是action那么,category就是对这个action的具体描述,比如action是漂亮,那么category就像问你哪里漂亮,是眼睛鼻子等等(不知道比喻恰当不(-__-))。

<think>好的,我现在需要帮助用户了解如何使用Android DataBinding。根据用户提供的引用内容,我需要整理一个结构清晰的教程。首先,我要确定DataBinding的基本配置步骤,因为这是开始使用的前提。然后,布局文件的修改是关键,需要解释如何将传统布局转换为DataBinding支持的格式。接下来,数据绑定的部分,用户可能需要知道如何创建数据模型并将其与UI绑定,引用中的User类示例和BindingAdapter的使用都是重点。此外,用户可能对在Activity和Fragment中的不同用法感兴趣,比如在Activity中使用DataBindingUtil.setContentView,而在Fragment中使用inflate方法。我还需要提到数据绑定的优势,比如减少样板代码,以及处理复杂数据的方法,比如使用@BindingAdapter自定义属性。最后,生成相关问题可以帮助用户深入理解,比如性能优化或与LiveData的结合。需要确保所有步骤都符合引用内容,并且语法正确,使用中文回答,行内公式用$...$,独立公式用$$...$$,不过在这个问题中可能公式较少,但要注意LaTeX的正确使用。检查是否有遗漏的步骤,例如启用DataBinding的Gradle配置,绑定变量的设置,以及事件处理的方法。确保每个部分都有对应的引用标注,比如在Activity和Fragment中的用法分别引用[^2]和[^1]。最后,生成的相关问题要覆盖用户可能感兴趣的扩展方向,如性能、优化、应用场景等。</think>### Android DataBinding 使用教程 #### 1. **启用DataBinding** 在模块的$build.gradle$文件中添加配置: ```groovy android { ... dataBinding { enabled = true } } ``` 同步项目后,系统会自动生成与布局文件对应的绑定类。 #### 2. **修改布局文件** 将传统XML转换为DataBinding格式: ```xml <!-- activity_main.xml --> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.example.User" /> </data> <LinearLayout...> <TextView android:text="@{user.name}" // 直接绑定变量 .../> <ImageView app:imageUrl="@{user.avatarUrl}" // 自定义属性绑定 .../> </LinearLayout> </layout> ``` 布局根标签需改为$<layout>$,并通过$<data>$定义变量[^3]。 #### 3. **数据绑定实现** - **数据模型类**(例如$User$)需使用可观察机制(如$BaseObservable$或$LiveData$): ```java public class User extends BaseObservable { private String name; @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(BR.name); // 触发UI更新 } } ``` - **在Activity中绑定数据**: ```java ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); User user = new User(); user.setName("John Doe"); binding.setUser(user); // 关键绑定语句 ``` - **在Fragment/Adapter中使用**: ```java ListItemBinding binding = DataBindingUtil.inflate( LayoutInflater.from(context), R.layout.list_item, parent, false ); binding.setVariable(BR.item, dataItem); // BR.item对应布局中定义的变量名[^1] ``` #### 4. **处理复杂绑定** - **自定义属性**:通过$@BindingAdapter$实现网络图片加载等逻辑: ```java @BindingAdapter("imageUrl") public static void bindImageUrl(ImageView view, String url) { Glide.with(view).load(url).into(view); // 使用第三方库加载图片[^4] } ``` - **事件绑定**:在布局中直接绑定点击事件: ```xml <Button android:onClick="@{() -> viewModel.onButtonClick()}" .../> ``` #### 5. **优势与注意事项** - **优势**:减少$findViewById$调用,UI更新自动化,代码可读性提升[^3] - **注意**:避免在布局中编写复杂逻辑,建议与ViewModel或Presenter模式结合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值