栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android 之 Activity 详解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android 之 Activity 详解

最近在学习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 标签中写入如下代码:


第三步:新建一个布局
右击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 文件中给予访问短信,手机等权限




第二步:写入启动代码

package com.xiaozeng.syatemapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
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);
        //开启拨号界面
        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);
            }
        });
    }
}

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/777841.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号