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