Android 活动Activity

目录

  • 一、启停活动页面
    • 1.1 Activity的启动和结束
    • 1.2 Activity的生命周期
    • 1.3 Activity的启动模式
  • 二、在活动之间传递消息
    • 2.1 显式Intent和隐式Intent
    • 2.2 向下一个Activity发送数据
    • 2.3 向上一个Activity返回数据
  • 三、补充附加信息
    • 3.1 利用资源文件配置字符串
    • 3.2 利用元数据传递配置信息
    • 3.3 给应用页面注册快捷方式

一、启停活动页面

1.1 Activity的启动和结束

1.启动

当activity启动时就会触发onCreate()方法,里面一般执行一些初始化操作,可以通过startActivity()方法跳转页面

代码示例:
xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center"><Buttonandroid:id="@+id/btn_act_next"android:layout_width="300dp"android:layout_height="wrap_content"android:gravity="center"android:text="点击进入下一页"/>
</LinearLayout>

java代码:

public class ActStartActivity extends AppCompatActivity implements View.OnClickListener{private static final String TAG = "ning";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(TAG,"ActStartActivity onCreate");setContentView(R.layout.activity_act_start);findViewById(R.id.btn_act_next).setOnClickListener(this);}public void onClick(View v) {//设置意图:第一种方式//Intent intent = new Intent(this, ActFinishActivity.class);//第二种方式;调用意图对象的setClass方法指定Intent intent = new Intent();//intent.setClass(this,ActFinishActivity.class);//第三种方式:调用意图对象的setComponent.方法指定ComponentName component = new ComponentName(this,ActFinishActivity.class);intent.setComponent(component);//跳转页面startActivity(intent);}
}

2.结束
通过finish()结束当前页面
代码示例:

public class ActFinishActivity extends AppCompatActivity implements View.OnClickListener{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_act_finish);findViewById(R.id.tv_back).setOnClickListener(this);findViewById(R.id.btn_back).setOnClickListener(this);}@Overridepublic void onClick(View v) {if (v.getId() == R.id.tv_back || v.getId() == R.id.btn_back){finish();}}
}

1.2 Activity的生命周期

  • onCreate:创建活动。此时会把页面布局加载进内存,进入了初始状态。
  • onStart:开启活动。此时会把活动页面显示在屏幕上,进入了就绪状态。
  • onResume:恢复活动。此时活动页面进入活跃状态,能够与用户正常交互,例如允许响应用户的点击动作、允许用户输入文字等。
  • onPause:暂停活动。此时活动页面进入暂停状态(也就是退回就绪状态),无法与用户正常交
    互。
  • onStop:停止活动。此时活动页面将不在屏幕上显示。
  • onDestroy:销毁活动。此时回收活动占用的系统资源,把页面从内存中清除掉。
  • onRestart:重启活动。处于停止状态的活动,若想重新开启的话,无须经历onCreate的重复创建
    过程,而是走onRestart的重启过程。
  • onNewIntent:重用已有的活动实例。
    在这里插入图片描述
    代码示例:
public class ActStartActivity extends AppCompatActivity implements View.OnClickListener{private static final String TAG = "ning";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(TAG,"ActStartActivity onCreate");}@Overrideprotected void onStart() {super.onStart();Log.d(TAG,"ActStartActivity onStart");}@Overrideprotected void onResume() {super.onResume();Log.d(TAG,"ActStartActivity onResume");}@Overrideprotected void onPause() {super.onPause();Log.d(TAG,"ActStartActivity onPause");}@Overrideprotected void onStop() {super.onStop();Log.d(TAG,"ActStartActivity onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.d(TAG,"ActStartActivity onDestroy");}@Overrideprotected void onRestart() {super.onRestart();Log.d(TAG,"ActStartActivity onRestart");}
}

1.3 Activity的启动模式

系统给每个app分配内存栈,栈里面装着已创建并且为销毁的活动信息,栈的结构是先进后出,比如A活动跳到B活动,在按返回键就回返回到A页面,而不是返回到桌面,这是默认的启动模式。
在这里插入图片描述
可以通过两种方式改变app的启动模式:

  1. 修改AndroidManifest.xml,在指定的activity节点添加属性android:launchMode,表示本活动以哪个启动模式运行,standard为标准模式(静态设置)

            <activityandroid:name=".LoginInputActivity"android:launchMode="standard"android:exported="true"></activity>
    

    launchMode取值如下:

    模式含义
    standard默认启动模式,依照启动顺序被依次压入
    singleInstance全局唯一模式,为目标 Activity 创建一个新的 Task 栈,将目标 Activity 放入新的 Task,并让目标Activity获得焦点。
    singleInstancePerTask如果不存在包含目标Activity的栈,则创建一个新的Task,这个Task中是目标Activity所独有的,并且只会创建一次,后续如果在启动其它的Activity,这些新的Acitivty仍然当前的task栈。
    singleTask栈内复用模式,task 栈内存在目标 Activity 实例,则将 task 内的对应 Activity 实例之上的所有 Activity 弹出栈,并将对应 Activity 置于栈顶,获得焦点
    singleTop栈顶复用模式,如果栈顶 Activity 为我们要新建的 Activity(目标Activity),那么就不会重复创建新的Activity。
  2. 调用Intent的setFlags方法,表示后续启动的活动采用该启动标志 (动态设置)

            //栈中存在待跳转的活动实例时,则重新创建该活动的实例,并清除原实例上方的所有实例intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//开辟一个新的任务栈,如果原来不存在活动栈,则会创建一个新栈intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//当栈顶为待跳转的活动实例时,则会重用栈顶的实例intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);//与standard 类似,但栈中不保存新启动的活动实例intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);//跳转到新页面时,栈中的原有实例都被清除,该标志需要结合FLAG_ACTIVITY_NEW_TASK使用,即:// intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
    

二、在活动之间传递消息

2.1 显式Intent和隐式Intent

  1. 显示Intent,直接指明来源活动与目标活动,属于精准匹配

    第一种方式
    Intent intent = new Intent(this, ActNextActivity.class); // 创建一个目标确定的意图
    第二种方式
    Intent intent = new Intent(); // 创建一个新意图
    intent.setClass(this, ActNextActivity.class); // 设置意图要跳转的目标活动
    第三种方式
    Intent intent = new Intent(); // 创建一个新意图
    // 创建包含目标活动在内的组件名称对象
    ComponentName component = new ComponentName(this, ActNextActivity.class);
    intent.setComponent(component); // 设置意图携带的组件信息

  2. 隐式Intent,没用明确要跳转的目标,只给出一个动作字符串让系统自动匹配,属于模糊匹配
    在这里插入图片描述下面是一个调用系统拨号程序的代码例子,其中就用到了Uri:
    String phoneNo = "12345";
    Intent intent = new Intent(); // 创建一个新意图
    intent.setAction(Intent.ACTION_DIAL); // 设置意图动作为准备拨号
    Uri uri = Uri.parse("tel:" + phoneNo); // 声明一个拨号的Uri
    intent.setData(uri); // 设置意图前往的路径
    startActivity(intent); // 启动意图通往的活动页面
    

隐式Intent还用到了过滤器的概念,把不符合匹配条件的过滤掉,剩下符合条件的按照优先顺序调用。
例如AndroidManifest.xml里面的首页活动:

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

Intent组成元素的列表说明:

元素名称设置方法说明
ComponentsetComponent组件,它指定意图的来源与目标
ActionsetAction动作,它指定意图的动作行为
DatasetData即Uri,它指定动作要操纵的数据路径
CategoryaddCategory类别,它指定意图的操作类别
TypesetType数据类型,它指定消息的数据类型
ExtrasputExtras扩展信息,它指定装载的包裹信息
FlagssetFlags标志位,它指定活动的启动标志

2.2 向下一个Activity发送数据

在这里插入图片描述

第一步创建Bundle消息包裹,用来存放数据

Bundle bundle = new Bundle();
bundle.putString("time", DateUtil.getNowTime());
bundle.putString("text",textView.getText().toString());

第二步 把快递包裹塞给意图

intent.putExtras(bundle);
//跳转页面
startActivity(intent);

另一个页面获取消息

//获取消息
Bundle bundle = getIntent().getExtras();
String time = bundle.getString("request_time");
String text = bundle.getString("request_text");

2.3 向上一个Activity返回数据

第一步:上一个页面打包好请求数据,调用startActivityForResult方法执行跳转动作,表示需要处理下
一个页面的应答数据,该方法的第二个参数表示请求代码,它用于标识每个跳转的唯一性。

       ActivityResultLauncher<Intent> register = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {//从另一个页面返回来数据时执行public void onActivityResult(ActivityResult result) {if (result!=null){Intent intent = result.getData();if(intent != null && result.getResultCode() == Activity.RESULT_OK){//获取消息Bundle bundle = intent.getExtras();System.out.println(bundle);String time = bundle.getString("response_time");String text = bundle.getString("response_text");String s = String.format("收到返回消息,请求时间:%s,请求内容:%s",time,text);tv_response.setText(s);}}}});Intent intent = new Intent(this,ActResponseActivity.class);//创建包裹Bundle bundle = new Bundle();bundle.putString("request_time", DateUtil.getNowTime());bundle.putString("request_text",mRequest);intent.putExtras(bundle);register.launch(intent);

第二步:下一个页面接收并解析请求数据,进行相应处理。

		//获取消息Bundle bundle = getIntent().getExtras();String time = bundle.getString("request_time");String text = bundle.getString("request_text");String s = String.format("收到请求消息:请求时间:%s,请求内容:%s",time,text);tv_request.setText(s);

第三步:调用setResult方法返回数据,第一个参数代表应答代码,第二个参数为意图对象

Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("response_time", DateUtil.getNowTime());
bundle.putString("response_text",mResponse);
intent.putExtras(bundle);
//携带意图返回上一个页面
setResult(Activity.RESULT_OK,intent);
//结束当前页面
finish();

三、补充附加信息

3.1 利用资源文件配置字符串

在res/values/strings.xml文件中配置

<resources><string name="app_name">MyApplication_03_Activity</string><string name="weather">天气热死</string><string name="first_short">first</string><string name="first_long">start_activity</string><string name="second_short">second</string><string name="second_long">Jump_second</string><string name="three_short">three</string><string name="three_long">login_back</string>
</resources>

通过java代码读取

String value = getString(R.string.weather_str);

3.2 利用元数据传递配置信息

不希望其他活动也能获取该参数,就可以设置元数据。
AndroidManifest.xml,在测试活动的activity节点内部添加meta-data标签,通过属性name指定元数据
的名称,通过属性value指定元数据的值。

        <activityandroid:name=".ActStartActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><meta-data android:name="weather" android:value="晴天" /></activity>

配置好了activity节点的meta-data标签,再回到Java代码获取元数据信息,获取步骤分为下列3步:

  • 调用getPackageManager方法获得当前应用的包管理器。
  • 调用包管理器的getActivityInfo方法获得当前活动的信息对象。
  • 活动信息对象的metaData是Bundle包裹类型,调用包裹对象的getString即可获得指定名称的参数值
public class MetaDataActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_meta_data);TextView tv_meta = findViewById(R.id.tv_meta);//获取应用包管理器PackageManager pm = getPackageManager();try {//从应用包管理器中获取当前的活动信息ActivityInfo info = pm.getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);//获取活动附加的元数据信息Bundle bundle = info.metaData;String s = bundle.getString("weather");tv_meta.setText(s);} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}}
}

3.3 给应用页面注册快捷方式

元数据不单单能传递简单的字符串参数,还能传送更复杂的资源数据
第一步:在res中创建xml包,里面创建shortcuts.xml文件
第二步:配置strings.xml,一共三对,每一对有个长名称和短名称,当长名称显示不下就会显示短名称

<resources><string name="app_name">MyApplication_03_Activity</string><string name="first_short">first</string><string name="first_long">start_activity</string><string name="second_short">second</string><string name="second_long">Jump_second</string><string name="three_short">three</string><string name="three_long">login_back</string>
</resources>

第三步:配置shortcuts.xml文件

<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"><shortcutandroid:shortcutId="first"android:enabled="true"android:icon="@mipmap/ic_launcher"android:shortcutShortLabel="@string/first_short"android:shortcutLongLabel="@string/first_long"><intentandroid:action="android.intent.action.VIEW"android:targetPackage="com.example"android:targetClass="com.example.ActStartActivity"/><categories android:name="android.shortcut.conversation"/></shortcut><shortcutandroid:shortcutId="first"android:enabled="true"android:icon="@mipmap/ic_launcher"android:shortcutShortLabel="@string/second_short"android:shortcutLongLabel="@string/second_long"><intentandroid:action="android.intent.action.VIEW"android:targetPackage="com.example"android:targetClass="com.example.JumpFirstActivity"/><categories android:name="android.shortcut.conversation"/></shortcut><shortcutandroid:shortcutId="first"android:enabled="true"android:icon="@mipmap/ic_launcher"android:shortcutShortLabel="@string/three_short"android:shortcutLongLabel="@string/three_long"><intentandroid:action="android.intent.action.VIEW"android:targetPackage="com.example"android:targetClass="com.example.LoginInputActivity"/><categories android:name="android.shortcut.conversation"/></shortcut>
</shortcuts>

每个shortcut节点都代表了一个菜单项,该节点的各属性说明如下:

  • shortcutId:快捷方式的编号。
  • enabled:是否启用快捷方式。true表示启用,false表示禁用。
  • icon:快捷菜单左侧的图标。
  • shortcutShortLabel:快捷菜单的短标签。
  • shortcutLongLabel:快捷菜单的长标签。优先展示长标签的文本,长标签放不下时才展示短标签
    的文本。

第四步:配置AndroidManifest.xml

<activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><!-- 指定快捷方式。在桌面上长按应用图标,就会弹出@xml/shortcuts所描述的快捷菜单 --><meta-dataandroid:name="android.app.shortcuts"android:resource="@xml/shortcuts" />
</activity>

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

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

相关文章

国庆加速度!新增功能点锁定功能,敏捷开发新增估算功能,助力项目快速突破!

大家好&#xff0c;CoCode开发云旗下Co-Project V3.6智能项目管理平台正式发布&#xff0c;平台新增功能点锁定功能、敏捷开发模式新增估算板块和两种估算方式。 功能点锁定功能进一步提高了项目估算的灵活性和准确性&#xff0c;有利于提高项目估算效率&#xff1b;而敏捷开发…

数据分析:人工智能篇

文章目录 第三章 数据可视化库matplotlib3.1 matplotlib基本绘图操作3.2 plot的线条和颜色3.3 条形图分析3.4 箱型图分析3.5 直方图分析3.6 散点图分析3.7 图表的美化 第四章 数据预测库Sklearn4.1 sklearn预测未来4.2 回归数据的预测4.2.1 回归数据的切分4.2.2 线性回归数据模…

【小尘送书-第六期】《巧用ChatGPT轻松玩转新媒体运营》AI赋能运营全流程,帮你弯道超车、轻松攀登运营之巅

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…

云原生数据库TDSQL-C

数据库系统核心模块 云原生数据库要解决什么问题&#xff1f; HTAP 云数据库VS云原生数据库

《C++ primer plus》精炼(OOP部分)——对象和类(8)

学习是一项持续的投资&#xff0c;永远不会白费——本杰明富兰克林 文章目录 第13章&#xff1a;类继承一个基类和派生类公有继承的逻辑关系&#xff1a;is-a多态公有继承 第13章&#xff1a;类继承 一个基类和派生类 从一个类派生出另一个类时&#xff0c;原始类称为基类&am…

怎么通过portainer部署一个vue项目

这篇文章分享一下今天通过docker打包vue项目&#xff0c;并使用打包的镜像在portainer上部署运行&#xff0c;参考了vue-cli和docker的官方文档。 首先&#xff0c;阅读vue-cli关于docker部署的说明 vue-cli关于docker部署的说明https://cli.vuejs.org/guide/deployment.html#…

信创办公–基于WPS的EXCEL最佳实践系列 (数据整理复制粘贴)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;数据整理复制粘贴&#xff09; 目录 应用背景操作步骤1、数据查找与替换2、复制或粘贴数据3、使用自动填充工具4、将数据拆分到多列5、应用数字格式 应用背景 数据的整理复制粘贴等在日常的工作中经常使用。本章内容主要学习…

Codeforces Round 665 (Div. 2) (A-F)

A.Problem - A - Codeforces &#xff08;1&#xff09;题意 给你个X轴&#xff0c;初始A点在n这个位置&#xff0c;O在源点0&#xff0c;问你要把B放在哪才能让|AB-BO| k&#xff0c;最小化A需要移动多少次。 &#xff08;2&#xff09;思路 直接分情况套路即可。 &#xff0…

MySQL约束

文章目录 简单介绍主键约束添加单列主键多列主键删除主键 自增长约束(auto_increment)语法&#xff1a;指定自增字段初始值 非空约束唯一约束(unique)默认约束(default)零填充约束(zerofill) 简单介绍 概念&#xff1a;表中数据的约束条件 作用&#xff1a;表在设计的时候加入…

用AI原生向量数据库Milvus Cloud 搭建一个 AI 聊天机器人

搭建聊天机器人 一切准备就绪后,就可以搭建聊天机器人了。 文档存储 机器人需要存储文档块以及使用 Towhee 提取出的文档块向量。在这个步骤中,我们需要用到 Milvus。 安装轻量版 Milvus Lite,使用以下命令运行 Milvus 服务器: (chatbot_venv) [egoebelbecker@ares milvus_…

Python与Scrapy:构建强大的网络爬虫

网络爬虫是一种用于自动化获取互联网信息的工具&#xff0c;在数据采集和处理方面具有重要的作用。Python语言和Scrapy框架是构建强大网络爬虫的理想选择。本文将分享使用Python和Scrapy构建强大的网络爬虫的方法和技巧&#xff0c;帮助您快速入门并实现实际操作价值。 一、Pyt…

QSS之QComboBox

QComboBox在Qt开发过程中经常使用&#xff0c;默认的下载列表风格达不到设计师的要求&#xff0c;本篇介绍基本的QComboBox的qss设置。 属性意思QComboBoxQComboBox基本样式QComboBox:editable右边可选择按钮QComboBox:!editable, QComboBox::drop-down:editable不可编辑或下拉…

从“概念”到“应用”,字节跳动基于 DataLeap 的 DataOps 实践

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 近日&#xff0c;火山引擎数智平台 VeDI Meetup「超话数据」在深圳举办&#xff0c;来自火山引擎的产品专家分享了字节跳动基于 DataLeap 的 DataOps 实践&#xff…

Audacity 使用教程:轻松录制、编辑音频

Audacity 使用教程&#xff1a;轻松录制、编辑音频 1. 简介 Audacity 是一款免费、开源且功能强大的音频录制和编辑软件。它适用于 Windows、Mac 和 Linux 等多种操作系统&#xff0c;适合音乐制作、广播后期制作以及普通用户进行音频处理。本教程将带领大家熟悉 Audacity 的…

管道-匿名管道

一、管道介绍 管道&#xff08;Pipe&#xff09;是一种在UNIX和类UNIX系统中用于进程间通信的机制。它允许一个进程的输出直接成为另一个进程的输入&#xff0c;从而实现数据的流动。管道是一种轻量级的通信方式&#xff0c;用于协调不同进程的工作。 1. 创建和使用管道&#…

机器人中的数值优化|【七】线性搜索牛顿共轭梯度法、可信域牛顿共轭梯度法

机器人中的数值优化|【七】线性搜索牛顿共轭梯度法、可信域牛顿共轭梯度法 Line Search Newton-CG, Trust Region Newton-CG 往期回顾 机器人中的数值优化|【一】数值优化基础 机器人中的数值优化|【二】最速下降法&#xff0c;可行牛顿法的python实现&#xff0c;以Rosenbro…

解决Invalid bound statement (not found)错误~

报错如下所示&#xff1a; 找了好久&#xff0c;刚开始以为是名称哪里写的有问题&#xff0c;但仔细检查了好多遍都不是 最后发现了问题如下所示&#xff1a; UserMapper里面的内容被我修改了&#xff0c;但classes中的内容还是原来的内容&#xff0c;所以才导致了编译器报错n…

【计算机网络】HTTP协议详解(举例解释,超级详细)

文章目录 一、HTTP协议简单介绍 1、1 什么是HTTP协议 1、2 再次理解“协议” 二、HTTP请求 2、1 HTTP的工作过程 2、1、1 demo代码 2、2 URL 介绍 2、2、1 urlencode 和 urldecode 2、3 HTTP 请求格式 三、HTTP响应 3、1 响应demo 3、2 HTTP 响应格式 四、HTTP 请求和响应中的…

【改进哈里鹰算法(NCHHO)】使用混沌和非线性控制参数来提高哈里鹰算法的优化性能,解决车联网相关的路由问题(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

ENVI报错:SaveRasterFile failed:IDLnaMetadata Error

ENVI报错&#xff1a;SaveRasterFile failed:IDLnaMetadata Error 问题描述 ENVI在另存为为TIFF文件时&#xff0c;报了下面这个错误信息 原因 输出路径或者是存放影像的路径里面包含中文&#xff0c;不能包含中文 解决方案 把所有相关路径中的中文改成英文