Android官网文档学习(一)

249 阅读8分钟

前言

近期学习完毕《第一行代码》,对安卓开发有了一定的认识,也能够写一些基础的小项目玩玩,之后失去了后面的学习方向,后来经学长的点拨,认识到了官方文档的重要性,于是打算一边学习一边总结博客,可以说是写给自己的备忘录和总结册,希望今年正式工作后能迅速地提升自己!因为应用基础知识一章涉及到的知识点太过细碎,所以仅从核心主题开始记录。

一、Avtivity

1、概念

Activity作为Android四大组件之一,是开发中不可缺少的,属于人机交互的主战场。与一般系统不同,Android系统会调用于其生命周期特定阶段相对应的回调方式来启动Activity。Activity提供窗口供应用在其绘制界面。一般,应用中会指定一个主Activity,该活动是用户启动应用后出现的第一个屏幕,然后可以从该Activity启动其他Activity,以执行其他操作,当然不止本应用,其他应用中Activity也可被启动。

2、配置

声明Activity

要使用Activity首先要在清单文件中声明。如:

 <application ... >
    <activity android:name=".MainActivity">
            ...
            ...
    </activity>
</application ... >

要声明Activity,需添加<activity> 元素作为<application>元素的子元素。该元素唯一必要的属性 android:name ,用于指定类名称。

声明intent过滤器

intent过滤器是Android平台中的重要部分,一般使用其在各个Activity活动中穿梭,后续会有专门章节记录其使用。通过该项元素的各种配置,可以指定Activity能够响应的intent类型,如:

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

该代码中,声明<intent-filter>属性,此元素包括包括 <action>元素,以及可选的 <category>元素和/或<data> 元素。这些元素组合在一起,可以指定 Activity 能够响应的 intent 类型。例子中定义action.Main以及category.LAUNCHER,指明了该Activity作为应用的主Activity。

3、Activity的生命周期

当用户执行浏览、退出、返回等操作时,应用中的Activity实例会在其生命周期的不同状态转换。

Activity共有六个生命状态,包括:onCreate()、onStart()、onResume()、onPause()、onStop() 和 onDestroy()。每当Activity进入新状态时,系统就会调用每个回调。用流程图简单表示:

onCreate()

该回调方法在系统首次创建Activity时触发,在整个周期中仅发生一次。此方法接受savedInstanceState参数,该参数是包含先前Activity状态的Bundle对象。如:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

onCreate() 方法会完成 Activity 的基本设置,例如声明界面(在 XML 布局文件中定义)、定义成员变量,以及配置某些界面。当onCreate()方法完成执行后,系统会相济调用onStart()和onResume()方法。

onStart()

onStart() 调用使 Activity 对用户可见,应用会为 Activity 进入前台并支持交互做准备,此时与 Activity 生命周期相关联的所有具有生命周期感知能力的组件都将收到 ON_START 事件。当此方法调用结束后,执行onResume()方法。

onResume()

此方法在活动准备好与用户交互时调用。此时的Activity一定在栈顶,并处于运行态,当活动从暂停态回到运行时,将会再次调用该方法,所以一般在该方法中实现其他的初始化操作,以恢复在暂停态中释放的资源。

onPause()

该方法在系统准备启动或者打开另一个Activity的时候调用。此时整个Activity处于暂停态,一般在该方法中将一些消耗CPU的资源释放。当Activity进入已暂停状态时,与Activity生命周期相关联的所有具有生命周期感知能力的组件都将收到ON_PAUSE事件。这时,生命周期组件可以停止任何无需在组件未在前台时运行的功能。

onStop()

当Activity处于用户完全不可见时,调用该方法,此Activity处于停止态。举例而言,如果新启动的 Activity 覆盖整个屏幕,就可能会发生这种情况。如果系统已结束运行并即将终止,系统还可以调用 onStop()。而在弹出框式活动时,仅仅调用onPause(),而不会调用onStop()方法。

onRestart()

当Acticity从停止态重新进入运行态之前调用,此时Activity被重新启动。

onDestroy()

当Activity被销毁前调用,当Activity进入已销毁状态时,与Activity生命周期相关联的所有具有生命周期感知能力的组件都将收到ON_DESTROY事件。此时,生命周期组件可以在Activity遭到销毁之前清理所需的任何数据。

为了更为明了的体会Activity的生命周期,创建三个Acticity,通过三个活动的切换由日志展现各个回调方法的调用,实现如下:

MainActivity:

public class MainActivity extends AppCompatActivity {
    public static final String EXTRA_MESSAGE = "com.example.myapplication.MESSAGE";
    public static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG,"onCreate");
    }
    @Override
    protected void onStart(){
        super.onStart();
        Log.d(TAG,"onStart");
    }
    @Override
    protected void onResume(){
        super.onResume();
        Log.d(TAG,"onResume");
    }
     @Override
    protected void onPause(){
        super.onPause();
        Log.d(TAG,"onPause");
    }
    @Override
    protected void onStop(){
        super.onStop();
        Log.d(TAG,"onStop");
    }
    @Override
    protected void onDestroy(){
        super.onDestroy();
        Log.d(TAG,"onDestroy");
    }

    public void sendMessage(View view){
        Intent intent = new Intent(this,DisplayMessageActivity.class);
        EditText editText = findViewById(R.id.editText);
        String message = editText.getText().toString();
        intent.putExtra(EXTRA_MESSAGE,message);
        startActivity(intent);
    }
    public void startDialog(View view){
        Intent intent = new Intent(this,DialogActivity.class);
        startActivity(intent);
    }
}

DialogActivity与DisplayMessageActivity的布局代码基本一致,仅展示一个:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".DialogActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="TextView"
        android:textSize="36sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

声明:可以发现DialogActivity使用了Dialog风格属性,属于弹窗

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

    <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=".DialogActivity"
            android:theme="@style/Theme.AppCompat.Dialog">
        </activity>
        <activity
            android:name=".DisplayMessageActivity"
            android:parentActivityName=".MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity" />
        </activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

运行效果:

应用运行:

跳转新活动:

弹窗跳出:

4、任务与返回栈

Android是使用任务来管理Activity的,任务就是用户在执行某项工作时与之互动的一系列 Activity 的集合。这些 Activity 按照每个 Activity 打开的顺序排列在一个返回堆栈中。在当前 Activity 启动另一个 Activity 时,新的Activity将被推送到堆栈顶部并获得焦点。上一个Activity仍保留在堆栈中,但会停止。当Activity停止时,系统会保留其界面的当前状态。当用户按返回按钮时,当前 Activity 会从堆栈顶部退出(该Activity销毁),上一个Activity会恢复(界面会恢复到上一个状态)。如图:

由于返回堆栈中的 Activity 不会被重新排列,如果您的应用允许用户从多个 Activity 启动特定的 Activity,系统便会创建该Activity的新实例并将其推送到堆栈中(而不是将该Activity的某个先前的实例移至堆栈顶部)。这样一来,应用中的一个Activity就可能被多次实例化(甚至是从其他任务对其进行实例化),如图所示:
所以此时我们引入一个新知识--启动模式。对于Activity共有四种启动模式,需要在清单文件中定义,使用<activity>元素的 launchMode 属性指定 Activity 应该如何与任务关联。

"standard"(默认模式)

默认值。系统在启动该 Activity的任务中创建Activity的新实例,并将intent传送给该实例。Activity 可以多次实例化,每个实例可以属于不同的任务,一个任务可以拥有多个实例。

"singleTop"

如果当前任务的顶部已存在 Activity 的实例,则系统会通过调用其onNewIntent()方法来将intent 转送给该实例,而不是创建Activity的新实例。Activity可以多次实例化,每个实例可以属于不同的任务,一个任务可以拥有多个实例(但前提是返回堆栈顶部的Activity不是该Activity的现有实例)。

"singleTask"

系统会创建新任务,并实例化新任务的根 Activity。但是,如果另外的任务中已存在该 Activity 的实例,则系统会通过调用其onNewIntent()方法将intent转送到该现有实例,而不是创建新实例。Activity 一次只能有一个实例存在。

"singleInstance"

与 "singleTask" 相似,唯一不同的是系统不会将任何其他 Activity 启动到包含该实例的任务中。该 Activity 始终是其任务唯一的成员;由该 Activity 启动的任何 Activity 都会在其他的任务中打开。