Android studio四大组件之Activity

蔚落 2022-05-19 01:44 542阅读 0赞

什么是四大组件

包括: Activity、Service、BroadcastReceiver、Content Provider

简单介绍:

  • Activity:Activity是Android构造块中最基本的组件,相当于界面管理,也是Android程序与用户交互的窗口;主要功能为保持各界面的状态和参数,妥善管理生命周期以及实现界面跳转逻辑;
  • service:service本身是指在后台长期运行并且没有用户界面的程序。Android的service服务于Activity,接受activity指令,并完成相关指令的实质操作,比如完成文件下载,音乐播放,或视频解码编码等等;
    service 分为由startService指令启动的service和bindService指令捆绑的service;
  • BroadCast Receiver:处理Intent触发事件并对消息做一些简单处理,转换成一条Notification,统一了Android的事件广播模型;
  • Content Provider:是Android提供的第三方应用数据的访问方案,可以派生Content Provider类,对外提供数据,可以像数据库一样进行选择排序,屏蔽内部数据的存储细节,向外提供统一的借口模型,大大简化上层应用,对数据的整合提供了更方便的途径

Activity

Android Activity的生命周期(Lifecycle)

在android.app.Activity类里面,定义了7个方法来控制android Activity的生命周期. 注意,这是一个ContextThemeWrapper的子类。

Android的生命周期有点类似windows的视窗,或者Java的window or frame,你可以通过他来处理UI组件及widgets。

70

Android Activity生命周期方法

我们看一下7个生命周期的方法(图片来源参考【1】),




































Method

Description

onCreate

当Activity第一次被创建时运行

onStart

当Activity显示在视图中的时候运行

onResume

当Activity和用户交互(比如获得焦点)的时候运行

onPause

当Activity变得不可交互(失去焦点)时运行(如果要恢复可见,resume即可)

onStop

当Activity对用户来说变得不再可见时运行(如果要恢复可见,必须restart重启)

onRestart

重新启动时运行

onDestroy

销毁时运行

70 1

这4种状态的详细情况如下

- 活动状态(Active/Running):Activity处于界面最顶端,获取焦点;
- 暂停状态(Paused):Activity失去焦点,但对用户可见;
- 停止状态(Stopped):Activity被完全遮挡,但保留所有状态和成员信息;
- 非活动状态(Killed):Activity被停止

Activity的启动模式

Anroid有4种启动模式,可以在AndroidManifest.xml中配置,

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.spacesoftwares.helloworld">
  4. <application
  5. android:allowBackup="true"
  6. android:icon="@mipmap/ic_launcher"
  7. android:label="@string/app_name"
  8. android:roundIcon="@mipmap/ic_launcher_round"
  9. android:supportsRtl="true"
  10. android:theme="@style/AppTheme">
  11. <activity
  12. android:name=".MainActivity"
  13. android:launchMode="standard">
  14. <intent-filter>
  15. <action android:name="android.intent.action.MAIN" />
  16. <category android:name="android.intent.category.LAUNCHER" />
  17. </intent-filter>
  18. </activity>
  19. </application>
  20. </manifest>

默认使用standard,如上面的源码所示。

任务(Task)

在了解这些模式之前,我们必须了解Android 的任务(Task)。

Task就是一个后进先出的栈内一个或多个Activity实例的集合。通常程序运行的第一个activity的实例叫做根任务(root Task),一个android系统会有很多的任务,但某一时刻在前台运行的任务只有一个。

Standard:标准的启动模式(默认启动模式)

  1. <activity android:launchMode="standard" />

Activity跳转机制:同一个Activity会在同一个任务栈里(即TaskID相同),但是每次启动时就会创建一次不同的Activity实例,依次进栈。每次返回时,栈顶的任务实例就回弹出任务栈。一个activity可对应的多个实例,每个实例可能都属于不同的任务。

  1. tv = (TextView) findViewById(R.id.textView1);
  2. tv.setText(String.format("任务ID:%d\n当前的Activity实例:\n%s",getTaskId(), toString()));
  3. btn = (Button) findViewById(R.id.btnStartSelf);
  4. // 同一个任务栈里面,但是不同任务实例。返回时,弹出栈顶实例(这是Activity的跳转机制)
  5. btn.setOnClickListener(new View.OnClickListener() {
  6. @Override
  7. public void onClick(View v) {
  8. startActivity(new Intent(MainActivity.this, MainActivity.class));
  9. }
  10. });

70 2

图片来源参考【2】

SingleTop

  1. <activity android:launchMode="singleTop" />

(2). SingleTop

SingleTop模式和standard模式非常相似,主要区别就是当一个singleTop模式的Activity已经位于任务栈的栈顶,再去启动它时,不会再创建新的实例此时,系统不会调用onCreat,但会调用onNewIntent;如果不位于栈顶,就会onCreate创建新的实例。

例子如下:

假设目标task的activity栈为: A->B->C->D(栈底->栈顶)

在程序中调用startActivity(D)

如果D是standard模式,则activity栈变为: A->B->C->D->D, 也就是会重新创建一个D实例

如果D是singleTop模式,则activity栈变为: A->B->C->D,不会创建D实例。

即如果D在目标task 的activity栈的栈顶,就不会创建新的实例,而是调用D的onNewIntent()方法,反之如果D不在目标task 的activity栈的栈顶,则会重新创建一个D实例。

70 3

图片来源参考【2】

singleTask

  1. <activity android:launchMode="singleTask" />

SingleTask模式的Activity在同一个Task内只有一个实例,如果Activity已经位于栈顶,系统不会创建新的Activity实例,和singleTop模式一样。但Activity已经存在但不位于栈顶时,系统就会把它上面的activity出栈,直到该Activity移到栈顶。

例如,如果A调用startActivity(B)启动B实例,则A和B位于同一个task中,且都只有一个实例存在于task栈中。

70 4

图片来源参考【2】

SingleInstance

  1. <activity android:launchMode="singleInstance" />

该模式的Activity会启动一个新的任务栈来管理Activity实例,且该实例在整个系统中只有一个。无论从那个任务栈中启动该Activity,都会是该Activity所在的任务栈转移到前台,从而使Activity显示。这种模式主要用于在不同程序中共享一个Activity实例。

例如,如果A调用startActivity(B)启动B实例,则系统会自动给intent添加一个属性LAG_ACTIVITY_NEW_TASK,将B实例放入到一个新的task中,也就是说A实例所在的task中有且只有一个A实例,不能存在其他实例。

70 5

图片来源参考【2】

【1】https://www.javatpoint.com/android-life-cycle-of-activity

【2】https://www.programering.com/a/MjNxIjNwATg.html

发表评论

表情:
评论列表 (有 0 条评论,542人围观)

还没有评论,来说两句吧...

相关阅读