当前位置: 首页 > news >正文

【Android】Activity创建、显式和隐式跳转、清单文件声明

在这里插入图片描述

三三要成为安卓糕手

一:Activity的创建与声明

1:继承关系

默认重写onCreate,继承关系,最后的父类是Activity

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2:清单文件

manifest [ˈmænɪfest] 清单

包含MainActivity对应的xml布局文件和清单文件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

activity要被识别的话,需要先在清单文件中进行声明

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • .MainActivity是类名,“点”是相对路径

  • exported为true:允许.SecondActivty这个页面可以被其他页面所调用

  • 配置了 android.intent.action.MAIN android.intent.category.LAUNCHER Activity 才会作为应用的主入口 ,也就是点击应用图标最先启动的页面。

  • 如果有两个主入口,以当前清单写在上面的为准;一个工程中不建议写两个启动页

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3:创建文件注意点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4:java文件声明成activity文件

其实很简单,创建.java类,继承AppCompatActivity类重写onCreate方法,定义一个xml布局,并关联;在清单文件中声明这个类就ok了

二:Activity间的跳转

1:按钮点击事情两种写法

定义一个按钮作为媒介

    <Buttonandroid:id="@+id/btn_second"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="跳转到Second页面"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"/>

(1)接口重写onClick

之前监听器的写法用的多一点,这次解锁新技能;实现View.OnClickListener接口,重写onClick方法,找到按钮控件传入this参数即可,这样写的好处,代码更简洁

public class MainActivity extends AppCompatActivity implements View.OnClickListener {}
Button btnStartSecond = findViewById(R.id.btn_second);

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以这么勇的本质原因点击监听器是一个接口

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2:重写OnClick的好处

有多个按钮,代码的复用率就上去了

 <Buttonandroid:id="@+id/btn_second2"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="跳转到Second2页面"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@id/btn_second"/>

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3:跳转到新的页面

		Button btnStartSecond = findViewById(R.id.btn_second);btnStartSecond.setOnClickListener(this);Button btnStartSecond2 = findViewById(R.id.btn_second2);btnStartSecond2.setOnClickListener(this);Log.i(TAG, "onCreate: btnStartSecond id = " + btnStartSecond.getId());Log.i(TAG, "onCreate: btnStartSecond2 id = " + btnStartSecond2.getId());
@Overridepublic void onClick(View v) {int id = v.getId();Log.i(TAG, "onClick: v id = " + id);if (id == R.id.btn_second) {Intent intent = new Intent(this, SecondActivity.class);startActivity(intent);} else if (id == R.id.btn_second2) {Intent intent = new Intent();intent.setAction("com.is.acbjp.SecondActivity");
//                intent.addCategory("android.intent.category.DEFAULT");intent.addCategory(Intent.CATEGORY_DEFAULT);startActivity(intent);}

注:OnClick方法中不建议使用switch语句,跟底层声明有关,建议我们使用if

(1)显示跳转

intent可以用来启动activity,翻译成意图

intent这玩意有点nb,是用来相互通信,相互传递一些信息的中介

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

(2)隐式跳转

			Intent intent = new Intent();intent.setAction("com.is.acbjp.SecondActivity");
//                intent.addCategory("android.intent.category.DEFAULT");intent.addCategory(Intent.CATEGORY_DEFAULT);//没有这句代码也无所谓,系统会自动添加的startActivity(intent);

需要再清单中进行声明;安卓中提供了一些隐式启动的类型,android.intent.category.DEFAULT表示默认,90%以上的需求用DEFAULT就可以了;EMAIL和MAPS也有在用

        <activityandroid:name="com.xlong.androidcomponentbyjavaproject.SecondActivity"android:exported="true"><intent-filter><action android:name="com.is.acbjp.SecondActivity"/><category android:name="android.intent.category.DEFAULT"/></intent-filter></activity>

intent-filter 意图过滤启动器

  • action中的name属性:一个自定义的字符串

  • category 英 [ˈkætəɡəri] 类别 中的name属性:默认即可

    • 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
  • 			//这两句代码等价intent.addCategory("android.intent.category.DEFAULT");intent.addCategory(Intent.CATEGORY_DEFAULT
    
    • 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(3)流程分析

**btn_second2**按钮的点击事件

通过setAction("com.is.acbjp.SecondActivity")指定动作

配合addCategory(Intent.CATEGORY_DEFAULT)

系统会根据这两个条件去匹配AndroidManifest.xml中对应intent-filter的组件

这样就完成了使用了隐式跳转

(4)显示和隐式对比

对比项显式意图(Explicit Intent)隐式意图(Implicit Intent)
目标明确性明确指定组件类名(如SecondActivity.class不指定类名,通过动作 / 数据等描述需求
适用范围主要用于应用内部组件主要用于跨应用组件调用,或内部解耦
依赖配置不需要在AndroidManifest.xml中配置intent-filter必须在AndroidManifest.xml中配置intent-filter,否则无法被匹配
灵活性耦合度高(直接依赖类名)耦合度低(通过 “动作” 通信,不依赖具体类名)
http://www.lryc.cn/news/623621.html

相关文章:

  • Android 对话框 - 基础对话框补充(不同的上下文创建 AlertDialog、AlertDialog 的三个按钮)
  • 飞算JavaAI结合Redis实现高性能存储:从数据瓶颈到极速读写的实战之旅
  • 关于虾的智能养殖系统的开发与实现(LW+源码+讲解+部署)
  • 数据结构(排序篇)——七大排序算法奇幻之旅:从扑克牌到百亿数据的魔法整理术
  • 三维重建-动手学计算机视觉19(完结)
  • SHAP分析!NRBO-Transformer-BiLSTM回归预测SHAP分析,深度学习可解释分析!
  • ReID/OSNet 算法模型量化转换实践
  • 牛客周赛 Round 105
  • Redis-plus-plus API使用指南:通用操作与数据类型接口介绍
  • EDMA(增强型直接内存访问)技术
  • [每周一更]-(第155期):Go 1.25 发布:新特性、技术思考与 Go vs Rust 竞争格局分析
  • 多线程—飞机大战(加入排行榜功能版本)
  • 亚马逊拉美市场爆发:跨境卖家的本土化增长方程式
  • UE5多人MOBA+GAS 48、制作闪现技能
  • 第四章:大模型(LLM)】06.langchain原理-(7)LangChain 输出解析器(Output Parser)
  • CSS中linear-gradient 的用法
  • 【Python】Python 面向对象编程详解​
  • 多线程—飞机大战(加入播放音乐功能版本)
  • macos 安装nodepad++ (教程+安装包+报错后的解决方法)
  • Sentinel和12.5米高程的QGIS 3D效果
  • scikit-learn/sklearn学习|套索回归Lasso解读
  • scikit-learn RandomizedSearchCV 使用方法详解
  • scikit-learn 中的均方误差 (MSE) 和 R² 评分指标
  • .NET 中的延迟初始化:Lazy<T> 与LazyInitializer
  • 『搞笑名称生成器』c++小游戏
  • Spring Cloud整合Eureka、ZooKeeper、原理分析
  • 云计算-k8s实战指南:从 ServiceMesh 服务网格、流量管理、limitrange管理、亲和性、环境变量到RBAC管理全流程
  • 【Kubernetes系列】Kubernetes中的resources
  • 脉冲计数实现
  • vue3 ref和reactive的区别和使用场景