最近在学习Android开发方面的知识,整理了一下关于Android中Activity方面的知识,也算是对自己学的知识进行了总结。Activity 在 Android开发中有着极其重要的位置,Activity是Android中四大组件之一,而我们的Android应用是由一个或多个Activity组成的。本篇文章将从以下几个方面给大家分享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。总共提供了四种启动模式:

  1. standard:默认启动模式,每次激活activity时,都创建activity实例,并放入任务栈。
  2. singleTop: 如果某个Activity自己激活自己,即任务栈栈顶是该Activity,则不需要创建,其余情况都要创建Activity。
  3. singleTask:如果要激活的activity在任务栈中,则不需要创建,只需要把这个Activity放入栈顶,并把该Activity以上的Activity实例都出栈。
  4. 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);
            }
        });
    }
}

大家可以运行上述代码操作一下,四种启动模式的区别。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐