Android studio四大组件之Activity

什么是四大组件

包括: 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。

Android Activity生命周期方法

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

Method

Description

onCreate

当Activity第一次被创建时运行

onStart

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

onResume

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

onPause

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

onStop

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

onRestart

重新启动时运行

onDestroy

销毁时运行

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

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

Activity的启动模式 

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

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.spacesoftwares.helloworld">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:launchMode="standard">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

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

任务(Task)

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

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

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

<activity android:launchMode="standard" />

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


tv = (TextView) findViewById(R.id.textView1);

tv.setText(String.format("任务ID:%d\n当前的Activity实例:\n%s",getTaskId(), toString()));

btn = (Button) findViewById(R.id.btnStartSelf);

// 同一个任务栈里面,但是不同任务实例。返回时,弹出栈顶实例(这是Activity的跳转机制)

btn.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

        startActivity(new Intent(MainActivity.this, MainActivity.class));

    }

});

图片来源参考【2】

SingleTop

<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实例。

图片来源参考【2】

 

singleTask

<activity android:launchMode="singleTask" />

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

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

图片来源参考【2】

SingleInstance

<activity android:launchMode="singleInstance" />

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

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

图片来源参考【2】

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

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

猜你喜欢

转载自blog.csdn.net/tanmx219/article/details/81105178