最近在学习Android开发方面的知识,整理了一下关于Android中Activity方面的知识,也算是对自己学的知识进行了总结。Activity 在 Android开发中有着极其重要的位置,Activity是Android中四大组件之一,而我们的Android应用是由一个或多个Activity组成的。本篇文章将从以下几个方面给大家分享Activity的知识:
文章目录
- 1. Activity 的概念
- 1.1 Activity 的概念
- 1.2 创建 Activity
- 2. Activity 的启动方法
- 2.1 显示启动
- 2.2 隐式启动
- 2.2.1 启动系统的 Activity
- 3. Activity 的生命周期
- 3.1 单个Activity 生命周期
- 3.2 多个Activity 生命周期
- 4. Activity 的启动模式
1. Activity 的概念
1.1 Activity 的概念
活动(Activity)是一个可视化的用户界面,负责创建一个屏幕窗口,放置 UI 组件,供用户交互。假如我们打开一个应用,看到的整个界面就是一个Activity,当点击一个超链接,跳转到另一个界面,则又是一个新的Activity。
1.2 创建 Activity
第一种方式
右击包名——New——Activity——Empty Activity,会看到类似于下面的界面,输入Activity和布局的名字,☑️Generate a Layout 后,Android系统会自动为我们创建布局,且在AndroidManifest.xml文件中自动注册当前Activity。
第二种方式
第一步:右击包名——New——JavaClass——输入Activity Name,例如Create Activity,
第二步:在AndroidManifest文件中注册Activity
在 application 标签中写入如下代码:
<activity android:name=".CreateActivity"
android:label="创建">
</activity>
第三步:新建一个布局
右击layout——New—— Layout Resource File——输入布局名称
第四步:在 Create Activity.java 文件中写入下面的代码
所有的Activity都要继承Activity,所有的活动都需要重写onCreate()方法,并在onCreate()方法中引用布局,才可使用
package com.xiaozeng.shareapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class FourthActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create);
}
}
2. Activity 的启动方法
Activity的启动方法也可以叫做Activity间的跳转,从一个Activity 跳转到另一个Activity。在Android中,Activity的启动是通过Intent来表达的,Intent是组件之间通信的媒介,专门提供组件互相调用的相关信息,Intent的启动方式,大的方向上可以分为两种: 显示启动和隐式启动。
2.1 显示启动
明确指定要启动的Activity的class或者包名.activity类名。显示启动提供了三种方式:
第一种方式:class 跳转
Intent intent = new Intent(Activity.this,Activity2.class);
startActivity(intent);
第二种方式:包名.类名跳转
Intent intent = new Intent();
intent.setClassName(FirstActivity.this,"com.xiaozeng.launchapplication.SecondActivity");
startActivity(intent);
第三种方式:ComponentName跳转
Intent intent = new Intent()
ComponentName componentName = new ComponentName(FirstActivity.this,SecondActivity.class);
intent.setComponent(componentName);
startActivity(intent);
例如
2.2 隐式启动
隐式启动并不明确指出想要启动的哪一个活动,而是指定了一系列的action和category等信息,然后由系统去分析这个Intent,并帮我们找出合适的活动去启动。
第一步:在AndroidManifest.xml文件中 定义action和category属性
action的名字可以随便定义,而category默认的配置为DEFAULT
第二步:在java 文件中写入逻辑代码
有两种隐式启动方式,其中最简单的就是直接输入action name
Intent intent = new Intent("zeng.SecondActivity");
startActivity(intent)
注意: 如果自己定义的某个Action要通过隐式启动,在AndroidManifast.xml中必须加上 android.intent.category.DEFAULT,否则不起作用。
2.2.1 启动系统的 Activity
拨打电话
intent.setAction(Intent.ACTION_CALL);
发送短信
intent.setAction(Intent.ACTION_SENDTO);
打开相机
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
使用方法如下:
第一步:在AndroidManifest.xml 文件中给予访问短信,手机等权限
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
第二步:写入启动代码
package com.xiaozeng.syatemapplication;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//开启拨号界面
Button button = findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL);
startActivity(intent);
}
});
//开启短信界面
Button button2 = findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
Uri sms = Uri.parse("smsto:"+"10086");
intent.setAction(Intent.ACTION_SENDTO);
intent.setData(sms);
intent.putExtra("sms body","服务满分yyyyyyyyy");
startActivity(intent);
}
});
//开启相机界面
Button button3 = findViewById(R.id.button3);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
startActivity(intent);
}
});
}
}
3. Activity 的生命周期
Activity生命周期:在Activity生命周期中,系统调用App生命周期中设置的回调方法,总共有7个,分别如下:
- onCreate():创建activity时调用
- onStart():当activity界面变为用户可见时调用
- onResume():当activity界面获取到焦点时调用(界面按钮可点击,文本框可输入)
- onPause():当activity失去焦点调用(按钮不可点击,文本框不能输入)
- onStop():当activity变为不可见时调用
- onDestory():当activity被销毁时调用
- onRestart():当activity再次启动时调用
详解:当开启一个activity时,Android系统首先会回调on Create方法,紧接着回调onstart方法,第三个回调onResume方法,当这三个方法回调完成之后,此时activity处于用户可见且可操作状态;当用户点击了返回键 ,这个activity就会被关闭,从关闭到被销毁的过程中,Android系统首先会回调onpause方法,紧接着会调用activity的on stop方法,此时这个activity就已经被关闭了,而on destroy方法当内存比较紧张的时候,才会执行被执行。
3.1 单个Activity 生命周期
模拟单个Activity从启动到销毁的过程,代码如下:
package com.xiaozeng.lelfapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("MainActivity","MainActicity_onCreate");
//在onCreate方法中执行一些方法的初始化,设置一些监听事件
Button button = findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onStart() {
super.onStart();
Log.e("MainActivity","MainActicity_onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.e("MainActivity","MainActicity_onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.e("MainActivity","MainActicity_onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.e("MainActivity","MainActicity_onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e("MainActivity","MainActicity_onDestory");
}
}
运行代码,操作APP 可以观察日志中打印的信息。
3.2 多个Activity 生命周期
以两个Activity为例
第一个Activity的代码和上述代码一致,第二个Activity代码,如下所示:
package com.xiaozeng.lelfapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Log.e("SecondActivity","SecondActivity_onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.e("SecondActivity","SecondActivity_onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.e("SecondActivity","SecondActivity_onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.e("SecondActivity","SecondActivity_onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.e("SecondActivity","SecondActivity_onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e("SecondActivity","SecondActivity_onDestroy");
}
}
运行代码,操作App,从第一个Activity跳转到第二个Activity,然后再操作返回键,可以看看打印的日志信息
4. Activity 的启动模式
Activity的启动模式是决定生成新的activity实例是否重用已存在的Activity实例,是否和其他Activity实例公用一个task。总共提供了四种启动模式:
- standard:默认启动模式,每次激活activity时,都创建activity实例,并放入任务栈。
- singleTop: 如果某个Activity自己激活自己,即任务栈栈顶是该Activity,则不需要创建,其余情况都要创建Activity。
- singleTask:如果要激活的activity在任务栈中,则不需要创建,只需要把这个Activity放入栈顶,并把该Activity以上的Activity实例都出栈。
- singleInstance:只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。
实现步骤如下:
第一步:在AndroidManifest文件中Activity节点里增加属性android:launchMode=”standard” 或者singleTop、singleTask、singleInstance
第二步在Activity.java文件中写入逻辑代码
package com.xiaozeng.launchapplication2;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Log.e("SecondActivity","SecondActivity"+getTaskId());
//standard 启动模式
Button button1 = findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(SecondActivity.this,SecondActivity.class);
startActivity(intent);
}
});
//singleTop 启动模式(栈顶情况)
Button button2 = findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(SecondActivity.this,SecondActivity.class);
startActivity(intent);
}
});
//singleTop 启动模式(非栈顶情况)
Button button3 = findViewById(R.id.button3);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(SecondActivity.this,MainActivity.class);
startActivity(intent);
}
});
//singleTask 启动模式
Button button4 = findViewById(R.id.button4);
button4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);
startActivity(intent);
}
});
}
}
大家可以运行上述代码操作一下,四种启动模式的区别。