Android --- Activity

news2024/12/23 0:36:32

https://developer.android.com/guide/components/activities/intro-activities?hl=zh-cn

Activity 提供窗口,供应在其中多个界面。此窗口通常会填满屏幕,但也可能小于屏幕并浮动在其他窗口之上。

大多数应用包含多个屏幕,这意味着它们包含多个 Activity。通常,应用中的一个 Activity 会被指定主 Activity,即用户启动应用时显示的第一个屏幕。然后,每个 Activity 都可以启动另一个活动,以执行不同的操作。

Activity提供一个能让用户操作并与之交互的界面。

AppCompatActivity

AppCompatActivity 继承了 Activity 类,拥有了窗口的特性,是一个可视化界面,MainActivity是一个可视化界面正是由于它继承了 AppCompatActivity。

配置清单

声明文件 Activity

在清单文件中声明 Activity,添加<activity>元素作为<application>元素的子元素,如:

<manifest ... >
  <application ... >
      <activity android:name=".ExampleActivity" />
      ...
  </application ... >
  ...
</manifest >

 android:name,必需属性,用于指定Acitiviy的类名称。

该步骤在新建activity文件时会自动创建

IntentFilter 意图过滤器 

<action android:name="xxxxx" />        action表示动作,就是想要做的事情的名称,给当前actitvity起别名,但不能乱起
<category android:name="android.intent.category.DEFAULT" />        指定当前活动的类型
<data android:mimeType="text/plain" />        指定活动能发送的类型

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

 android.intent.action.MAIN -> 入口activity

Intent

Intent是 Activity、Serviece和 BroadcastReceiver三个应用组件之间进行通信的信使,它还可以携带数据。

Intent分类

显示意图:明确目标组件的意图

Intent(Context packageContext, Class<?> cls)

常用在操作当前应用的组件

隐式意图:没有明确目标组件的意图

Intent(String action)

常用在使用其他应用的组件时

activity 的启动(跳转)

 activity的跳转

Intent intent = new Intent(ButtonActivity.this,MainActivity.class);
startActivity(intent);

隐式启动使用隐式意图

在运行时才知道能打开哪一个界面

隐式启动的两种构造方法
* public Intent(String action, Uri uri)
* public Intent(String action)
* action:Activity的别名 ,编译阶段无论写什么的都不会报错
* uri: Uri对象,打开的路径
// 打开百度 
Intent intentS = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
startActivity(intentS);

显示启动使用显式意图

在运行前知道到底要启动哪一个界面-使用意图

Intent(Context packageContext, Class<?> cls)

带回调启动activity-startActivityForResult

 跳转到第二个页面,设置请求码为1000

Intent intent = new Intent(this,ActivityLife.class);
// 参数2:请求码
startActivityForResult(intent,1000);

第二个页面返回数据:

 // 通过startActivityForResult启动activity-返回结果
    public void backRes(View view) {
        // 设置结果
        Intent intent = new Intent();  //此时intent不作为跳转使用,而是用来传递返回的数据
        intent.putExtra("返回的数据","第二个界面返回的是10000000");
        /*参数1:请求码 参数2:返回的数据*/
        setResult(RESULT_OK,intent);
        finish(); //结束当前Acticity
    }

 在第一个页面调用 onActivityResult 处理返回的数据:

如果通过 startActivityForResult 启动了第二个activity,当第二个activity处理结束后,再回到当前activity时,一定会自动回调 onActivityResult 方法 。在 onActivityResult 方法中我们可以处理第二个activity返回的结果。(如。拍照后得到的照片,从图库中选取的图片)

  • 参数1 requestCode:请求码。当有多个 startActivityForResult 时,可以用来判断该结果来自于哪个activity,从而进行什么操作
  • 参数2 resultCode:结果码 0 = RESULT_CANCEL->取消 | -1 = RESULT_OK 正确处理后返回。判断它是为了判断新开的activity有没有处理完这些事
  • 参数3 Intent (可以为空):返回的结果存放在这里。通过 getStringExtra() 获取数据(此时已经知道结果是String类型的数据)
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // 判断新开的activity返回的结果
        /* 当返回结果都是成功时,请求码==1000则进行操作 */
        if(resultCode == -1){
            if(requestCode == 1000){
                assert data != null;
                Log.e("ActivityWithResults","自动进入onActivityResult requestCode:"+requestCode+",resultCode:"+resultCode+",返回的数据"+data.getStringExtra("返回的数据"));
            }
        }

Intent携带数据 

intent.putExtra(String name,XXX value) 保存数据

intent.getXXXExtra(String name) 获取数据

activity 之间数据传递

getIntent()获取携带数据的意图

  • 传递简单内容

A的activity(传递)

  Intent intent = new Intent(this,ActivityLife.class);
  //添加参数
  intent.putExtra("传递的String类型参数","这是上一个页面传递过来的String类型参数");
  intent.putExtra("传递的double类型参数",24.99);
  intent.putExtra("传递的int类型参数",24);
  intent.putExtra("传递的bool类型参数",false);
  startActivity(intent);

B的activity(接收)

// 获取上一个页面传递过来的数据,获取数据时有些需要给出默认值
Intent getIntent = getIntent();
String dataString = getIntent.getStringExtra("传递的String类型参数");
int dataInt = getIntent.getIntExtra("传递的int类型参数",1);
double dataDouble = getIntent.getDoubleExtra("传递的double类型参数",2.1);
boolean dataBool = getIntent.getBooleanExtra("传递的bool类型参数",true);

TextView textView = findViewById(R.id.show);
textView.setText("上一个页面传递是数据"+dataString+dataInt+dataDouble+dataBool);
  • 传递对象内容 

intent.getSerializableExtra(String name)  获取序列化对象数据

新建一个Student对象类

package com.example.androidstudiostudy.data;

import java.io.Serializable;

// 将对象序列化,序列化的作用
/* 1.想把内存中的对象保存到一个文件活数据库中时
 * 2.想利用套接字Socket在网络中传递对象*/
public class Student implements Serializable {
    private String name;
    private  int age;
    private  double money;
    private  boolean check;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    public boolean isCheck() {
        return check;
    }

    public void setCheck(boolean check) {
        this.check = check;
    }

    public Student(String name, int age, double money, boolean check) {
        this.name = name;
        this.age = age;
        this.money = money;
        this.check = check;
    }
}

A页面传递:

// 实例化一个新建的 Student 对象
Student student1 = new Student("沈成林",23,200000.999,true);
// 参数1:String name - 本次数据的名称
// 参数2:@Nullable Serializable value - 序列化数据对象
intentC.putExtra("data_object",student1);
startActivity(intentC);

B页面接收: 

Intent getIntent = getIntent();
// 获取对象数据 - 强转成 Student 对象
Student student = (Student) getIntent.getSerializableExtra("data_object");
if (student != null) {
  TextView textView2 = findViewById(R.id.show2);
  textView2.setText("上一个页面传递是数据"+student.getName()+student.getAge()+student.getMoney()+student.isCheck());
else {
 // 处理student对象为空的情况,比如给出一个默认值或者显示错误信息
   TextView textView2 = findViewById(R.id.show2);
   textView2.setText("上一个页面未传递有效的Student对象");
        }

activity 的生命周期

  • onCreate()
  • onStart() 可以理解为启动状态,此时的界面还没能完全的展示出来, 还在准备中
  • onResume() 说明activity已经完全进入到了前台准备完成,可以和用户进行交互了
  • onPause() 当activity进入到不可操作的状态时,会回调该方法。

何时会进入到不可操作的状态?

有另一个activity进入到了前台(本activity被部分挡住了)。此时虽然不可操作,但是部分可见的

  • onStop() 当activity完全看不到了,就会回调该方法
  • onDestory() 当要退出activity的时候,就会执行这个方法

当有一个活动A来到前台完全启动后,有一个活动B也来到前台,慢慢启动时,A就会进入到onPause()方法,暂停活动,当B完全准备好后,A就会彻底的停止,进入onStop()方法

activity 的四种启动模式

 Standard(系统默认)

不管栈内是否存在该实例,打开就会放入,返回时依次从后退栈

在清单文件中设置启动模式:

android:launchMode="standard"

SingleTop 顶部复用

顶部是你正想要打开的activity,直接复用,不会新建,如果没有,会放入栈中。

 在清单文件中设置启动模式:

android:launchMode="singleTop"

从MainActivity -> MainActivity->MainActivity-> MainActivity

此时顶部就是要打开的activity,直接复用,所以只返回一次就到了主页

SingleTask 栈内复用模式

想打开已经打开过的activity B,此模式会保证栈中只有一个,会弹出B之后的所有activity,保证它重回栈顶

android:launchMode="singleTask"

MainActivity ->ButtonActivity ->ConstraintActivity ->MainActivity

只返回一次就回到主页,因为此时会退出MainActivity后的所有activity

SingleInstance 全局唯一模式

想要打开新activity,会放在一个新的任务栈中且该Task有且只有一个activity实例,如果已经创建过该activity实例,则不会再创建新的任务栈,只会将之前的唤醒

android:launchMode="singleInstance"

MainActivity ->ButtonActivity ->ConstraintActivity ->MainActivity

返回到ButtonActivity后再返回就直接回到了主页,MainActivity在一个单独的任务栈中,返回的时候已经被撤销了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1601756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法课程笔记——全排列

要最小 ventor用endl 递归方式#include <cstdio>#include <iostream>#include <algorithm>#include <string>using namespace std;const int MAXN 10;bool visit[MAXN];//判断某个元素是否被访问过char sequence[MAXN];//存放找到的全排列void GetPer…

2024年苹果审核4.3相关问题综述

苹果审核中的4.3问题是开发者关注的焦点之一&#xff0c;本文对此进行了综述&#xff0c;总结了不同情况下的处理方式和优化策略。 第一种4.3 该类问题常见于代码或UI的重复率过高&#xff0c;苹果会直接拒绝应用。开发者需注意避免此类情况的发生&#xff0c;特别是在更新应…

MongoDB 使用

1 引用依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>2 配置文件配置mongodb资料 # MongoDB连接信息 spring.data.mongodb.host 192.168.23.…

03-JAVA设计模式-组合模式

组合模式 什么是组合模式 组合模式&#xff08;Composite Pattern&#xff09;允许你将对象组合成树形结构以表示“部分-整体”的层次结构&#xff0c;使得客户端以统一的方式处理单个对象和对象的组合。组合模式让你可以将对象组合成树形结构&#xff0c;并且能像单独对象一…

支持向量机模型pytorch

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个支持向量机模型pytorch程序,最后打印5个条件分别的影响力。 示例一 支持向量机&#xff08;SVM&#xff09;是一种…

企业网盘搭建——LNMP

php包链接&#xff1a;https://pan.baidu.com/s/1RElYTQx320pN6452N_7t1Q?pwdp8gs 提取码&#xff1a;p8gs 网盘源码包链接&#xff1a;https://pan.baidu.com/s/1BaYqwruka1P6h5wBBrLiBw?pwdwrzo 提取码&#xff1a;wrzo 目录 一.手动部署 二.自动部署 一.手动部署 …

Python pytest 面试题!

在Python软件开发中&#xff0c;单元测试是非常重要的一环。它可以帮助开发人员确保代码的正确性并提高代码质量。pytest是一个功能强大且易于使用的Python测试框架&#xff0c;它提供了丰富的功能和灵活的用法&#xff0c;使得编写和执行测试变得更简单和高效。 本文将介绍一…

如何把车卖出去,什么营销最靠谱!

之前我看过雷军的《小米创业思考》&#xff0c;在书中他一直在强调互联网思维&#xff0c;这是一种非常好的思考模式&#xff0c;不仅限于互联网产品&#xff0c;在这次卖车上也一样展现的淋漓尽致。 营销一样需要被设计。提到&#xff0c;不少设计师首先想到的是做运营海报&am…

pycharm连接hugging face等网站

一、设置环境变量 在代码最前面设置变量 os.environ[ALL_PROXY] http://127.0.0.1:7890 file-->setting 二、查看自己的代理ip 控制面板-网络和internet-internet选项-连接-局域网设置 1.控制面板 2. 网络和internet 3.internet选项 4.连接 5.局域网设置 6.IP

vue3大事件项目3

弹框验证 先准备变量: const formModel ref({ cate_name: , cate_alias: }) 还有规则&#xff1a; const rules { cate_name: [ { required: true, message: please input name, trigger: blur }, { pattern: /^\S{1,10}$/, message: must be 1-10, trigger: blur } ], …

windows下使用nginx设置静态资源路由

1、下载nginx http://nginx.org/en/download.html 下载稳定版本&#xff0c;以nginx/Windows-1.24.0为例&#xff0c;下载后解压&#xff0c;解压后如下&#xff1a; 2、启动nginx 打开cmd命令窗口&#xff0c;切换到nginx解压目录下&#xff1a; start nginx # 启动nginx服务…

浮点数表示的数值范围详解(一)

学生问了一个问题&#xff1a; 这个问题如果想讲明白&#xff0c;需要将基础知识复习一下。 一、定点数 1、什么是定点数&#xff1f; 定点数指小数点在数中位置固定不变的数。 详细解释&#xff1a;计算机中小数点的位置固定不变&#xff0c;小数点前、后的数字&#xff…

一种动态防御策略——移动目标防御(MTD)

文章速览&#xff1a; 1、高级规避攻击 2、用移动目标防御对抗欺骗 常见做法操作系统和应用程序才是真正的战场打破游戏规则 网络攻击的技术变得愈发难测&#xff0c;网络攻击者用多态性、混淆、加密和自我修改乔装他们的恶意软件&#xff0c;以此逃避防御性的检测&#xf…

正基塑业邀您参观2024长三角快递物流供应链与技术装备展览会

2024.7.8-10 杭州国际博览中心 科技创新&#xff0c;数字赋能 同期举办&#xff1a;数字物流技术展新能源商用车及物流车展 电商物流包装展 冷链物流展 展会介绍 2024长三角快递物流供应链与技术装备展览会&#xff08;杭州&#xff09;&#xff0c;于2024年7月8-10日在杭州…

机器学习中的激活函数

激活函数存在的意义&#xff1a; 激活函数决定了某个神经元是否被激活&#xff0c;当这个神经元接收到的信息是有用或无用的时候&#xff0c;激活函数决定了对这个神经元接收到的信息是留下还是抛弃。如果不加激活函数&#xff0c;神经元仅仅做线性变换&#xff0c;那么该神经网…

【C++】priority_queuepriority_queue模拟实现

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. priority_queue的介绍2. priority_queue的使用3. 函数模板与类模板4. 仿函数5. priority_queue模拟实现5.1 push5.2 pop5.3 empty5.4 size5.5 top5.6 仿函数实现大小堆5.7 实现自定义类型的优先级队列 6. 附模拟实…

Linux的启动过程,了解一下?

Linux 系统启动过程 linux启动时我们会看到许多启动信息。 Linux系统的启动过程并不是大家想象中的那么复杂&#xff0c;其过程可以分为5个阶段&#xff1a; 内核的引导。运行 init。系统初始化。建立终端 。用户登录系统。 init程序的类型&#xff1a; SysV: init, CentO…

Linux系统编程开发环境搭建

开发环境搭建 桥接网络&#xff08;Bridged Network&#xff09;、网络地址转换&#xff08;NAT, Network Address Translation&#xff09;和主机模式网络&#xff08;Host-only Networking&#xff09; 在虚拟化环境中&#xff0c;常见的三种网络模式是桥接网络&#xff08…

好用的Python开发工具合集

​ Python是一种功能强大且易于学习的编程语言&#xff0c;被广泛应用于数据科学、机器学习、Web开发等领域。随着Python在各个领域的应用越来越广泛&#xff0c;越来越多的Python开发工具也涌现出来。但是&#xff0c;对于新手来说&#xff0c;选择一款合适的Python开发工具可…

OpenHarmony开发实例:【鸿蒙.bin文件烧录】

使用HiBurn烧录鸿蒙.bin文件到Hi3861开发板 鸿蒙官方文档的“Hi3861开发板第一个示例程序”中描述了——如何使用DevEco Device Tool工具烧录二进制文件到Hi3861开发板&#xff1b; 本文将介绍如何使用HiBurn工具烧录鸿蒙的.bin文件到Hi3861开发板。 获取HiBurn工具 通过鸿蒙…