Android开发学习-Activity

启停活动页面

1、启动和停止

startActivity(new Intent(原页面.this,目标页面.this));

startActivity(new Intent(this,ActFinishActivity.class))

从当前页面回到上一个页面,相当于关闭当前页面,返回代码如下:

finish();

2、生命周期

第一次进入页面时:

onCreate

onStart

onResume

===========================================================

页面跳转到另外一个Activity时:

onPause

onStop 

===========================================================

另外一个Activity再返回第一个Activity时:

onRestart

onStart

onResume

===========================================================

App返回到桌面:此时桌面应用成可见的了。桌面应用可以理解为一个Activity

onPause

onStop

onDestory

=======================================================

第一个activity快速跳转到第二个Activity,接着快速返回:

onPause,还没有来得及执行onPause

onResume,接着又重新渲染了

=======================================================

每个生命周期的状态:

1、onCreate:创建活动,把页面布局加载进内存,进入了初始化的状态。

2、onStart:开始活动,把互动页面显示在屏幕上,进入了就绪状态。

3、onResume:恢复活动,活动页面进入到活跃状态,能够与用户进行交互,例如,允许响应用户点击动作,允许用户输入文字等。

4、onPause:暂停活动,页面进入暂停状态,无法与用户正常交互

5、onStop:停止活动。页面将不在屏幕上显示

6、onDestory:销毁活动。回收活动占用的系统资源,把页面从内存中清除

7、onRestart:重启活动。重新加载内存中的页面数据。

8、onNewIntent:重用已有的活动实例。【因为玩游戏,导致应用进入到后台运行,之后因为内存不足,进程被杀死,需要重新激活】

3、启动模式

App应用先后打开两个Activity,会有一个TaskStack。返回的时候出栈操作。

AndroidManifest.xml,给activity节点添加属性

启动标志取值-xml:

android:launchMode="standard" 默认值,表示开辟一个新的任务栈,已启动的activity会被依次压入到栈中。如果activity2跳转到activity2,会被压入栈顶两次。

android:launchMode="singleTop" 如果是栈顶,则重用栈顶的实例。activity2跳转到activity2,则会被压入栈顶一次。

android:launchMode="singleTask" 当栈中存在待跳转的活动实例时,则重新创建一个新实例,并清除原实例上方的所有实例。activity1->activity2->activity3,如果想要跳转到activity1,2和3会被弹出栈。

这就是相当于singleTask,如果没有这个,则会返回好多次才会返回到桌面。

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

登录成功之后,不会返回登录页面

设置启动标志,跳转到新页面时,栈中的原有实例被清空,同时开辟新任务的活动栈。

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);

对于回不去的登陆页面的情况,可以设置启动标志FLAG_ACTIVITY_CLEAR_TASK,该标志会清空当前活动栈里所有实例。不过全部清空之后,意味着当前栈没办法使用了,必须另外找个活动栈才行,也就是必须同时设置启动标志FLAG_ACTIVITY_NEW_TASK,该标志用于开辟新的任务栈。

启动标志取值-java:

 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//开辟一个新的任务栈intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);//当栈顶为待跳转的活动实例之时,则重用栈顶的实例intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//当栈中存在待跳转的活动实例时,则重新创建一个新的实例,并清楚原实例上方的所有实例intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);//栈中不保存新启动的活动实例intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);//跳转到新页面时,栈中的原有实例都被清空

在活动之间传递消息

Intent的组成部分

元素名称设置方法说明与用途
ComponentsetComponent组件,指定意图的来源和目标
ActionsetAction

动作,指定意图的动作行为

DatasetData即Uri,指定动作要操纵的数据路径
CategoryaddCategory类别,指定意图的操作类别
TypesetType数据类型,它指定消息的数据类型
ExtrasputExtras扩展信息,指定装载的包裹信息
FlagssetFlags标志位,它指定活动的启动标志

1、显示intent和隐式intent

        显示Intent:

直接指定来源活动和目标活动,属于精确匹配。

        在intent中的构造函数中指定

        调用意图对象的setClass方法指定

        调用意图对象的setComponent方法指定

Intent intent = new Intent(this,RelativeActivity.class);
Intent intent1 = new Intent();
intent1.setClass(this,RelativeActivity.class);
ComponentName componentName = new ComponentName(this, RelativeActivity.class);
intent1.setComponent(componentName);
startActivity(intent1);
startActivity(intent);

隐式Intent:

android.intent.action.MAIN

App启动时的入口
android.intent.action.VIEW向用户展示数据
android.intent.action.SEND分享内容
android.intent.action.CALL直接拨号
android.intent.action.DIAL准备拨号
android.intent.action.SENDTO发送短信
android.intent.action.ANSWER接听电话
String phoneNo = "17864152222";
Intent intent1 = new Intent();
intent1.setAction(Intent.ACTION_DIAL);
Uri uri = Uri.parse("tel:"+phoneNo);
intent1.setData(uri);
startActivity(intent1);

APP之间跳转:

被暴露的app=要跳转的app,exported=true

<activity android:name=".MainActivity" android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><intent-filter><action android:name="android.intent.action.PSHDHX"/><category android:name="android.intent.category.DEFAULT"/></intent-filter></activity>
app需要跳转的动作:只要action的名字对上,就能唤起app
intent.setAction("android.intent.action.PSHDHX");
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);

2、向下一个Activity发送数据

intent使用Bundle对象存放传递的数据信息

Bundle对象操作各类数据类型的读写方法

字符串数组:getStringArray putStringArray

字符串列表:getStringArrayList putStringArrayList

可序列化结构:getSerializable putSerializable

Bundle bundle = new Bundle();
bundle.putString("requestTime",DateUtil.getNowTime());
bundle.putString("request_content","xxxxxxxxxxxxxxxxxx");
intent.putExtras(bundle);
startActivity(intent);
        Bundle bundle1 = getIntent().getExtras();String request_time = bundle1.getString("request_time");

3、向上一个Activity发送数据

处理好下一个页面的应答数据后,需要向上一个页面返回数据

1、上一个页面打包数据后,调用startActivityForResult方法执行此跳转动作

2、下一个页面解析请求数据,做出相应处理

3、下一个页面setResult方法返回数据包裹

5、上一个页面重写onActivityResult,解析下一个页面的返回数据

代码如下:

请求方代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".RequestResActivity"><TextViewandroid:id="@+id/tv_req"android:layout_width="match_parent"android:layout_height="wrap_content"/><Buttonandroid:id="@+id/btn_req"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="发送请求"/><TextViewandroid:id="@+id/res_in_req"android:layout_width="match_parent"android:layout_height="wrap_content"/></LinearLayout>
package com.pshdhx.demo2;import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;import com.pshdhx.utils.DateUtil;import java.util.Date;public class RequestResActivity extends AppCompatActivity implements View.OnClickListener {TextView tv_req;TextView res_in_req;Button btn_req;private String req_text = "你睡了吗,我还没有睡";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_request_res);tv_req = findViewById(R.id.tv_req);tv_req.setText("待发送的消息为:" + req_text);btn_req = findViewById(R.id.btn_req);btn_req.setOnClickListener(this);res_in_req = findViewById(R.id.res_in_req);}@Overridepublic void onClick(View v) {Intent intent = new Intent(this,ResponseReqActivity.class);Bundle bundle = new Bundle();bundle.putString("req_time:", DateUtil.getNowTime());bundle.putString("req_content:", req_text);intent.putExtras(bundle);startActivityForResult(intent, 8888);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if(requestCode == 8888){if (resultCode == Activity.RESULT_OK) {Bundle bundle = data.getExtras();String res_time = bundle.getString("res_time");String res_content = bundle.getString("res_content");String desc = String.format("收到返回消息:\n应答时间为%s\n返回内容为%s", res_time, res_content);res_in_req.setText(desc);}}}
}

接收方代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".ResponseReqActivity"><TextViewandroid:id="@+id/tv_res"android:layout_width="match_parent"android:layout_height="wrap_content"/><Buttonandroid:id="@+id/btn_res"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="返回数据"/><TextViewandroid:id="@+id/req_in_res"android:layout_width="match_parent"android:layout_height="wrap_content"/></LinearLayout>
package com.pshdhx.demo2;import androidx.appcompat.app.AppCompatActivity;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;import com.pshdhx.utils.DateUtil;import org.w3c.dom.Text;public class ResponseReqActivity extends AppCompatActivity implements View.OnClickListener {TextView tv_res;Button btn_res;TextView req_in_res;private String res_text = "我还没有睡,我爸妈不在家";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_response_req);tv_res = findViewById(R.id.tv_res);btn_res = findViewById(R.id.btn_res);req_in_res = findViewById(R.id.req_in_res);req_in_res.setText("待响应的内容为:"+res_text);btn_res.setOnClickListener(this);Bundle bundle = getIntent().getExtras();String req_time = bundle.getString("req_time:");String req_content = bundle.getString("req_content:");String desc = String.format("收到请求消息:\n请求时间为%s\n请求内容为%s", req_time, req_content);tv_res.setText(desc);}@Overridepublic void onClick(View v) {Intent intent = new Intent();Bundle bundle = new Bundle();bundle.putString("res_time", DateUtil.getNowTime());bundle.putString("res_content", res_text);intent.putExtras(bundle);setResult(Activity.RESULT_OK,intent);finish();}
}

效果图:

 

踩坑的地方:

startActivityForResult(intent, 8888);

一开始我设置的是RESULT_OK,发现他的值是-1,然后onActivityResult这个方法无法接收到返回数据,不触发该方法的回调。

为活动补充附加信息

1、利用资源文件配置字符串

String appName = getString(R.string.app_name);

2、利用元数据传递配置信息

        调用getPackageManager方法获取当前应用的包管理器

        调用包管理器的getActivityInfo方法获得当前活动的信息对象

        活动信息对象的metaData是Bundle包裹类型,调用包裹对象的getString即可获得指定名称的参数值。

PackageManager packageManager = getPackageManager();try {ActivityInfo activityInfo = packageManager.getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);Bundle bundle = activityInfo.metaData;String weather = bundle.getString("weather");Toast.makeText(MetaDataActivity.this,weather,Toast.LENGTH_SHORT).show();} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}

3、给应用界面注册快捷方式

比如,在桌面,长按支付宝,会出现扫一扫,付钱之类的快捷方式,这是android7.0之后才有的功能。

代码:

<activity android:name=".shortCutActivity"><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="sunny" />--><meta-dataandroid:name="android.app.shortcuts"android:resource="@xml/shortcuts" /></activity>

res/xml/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:shortcutLongLabel="@string/first_long"android:shortcutShortLabel="@string/first_short"><intentandroid:action="android.intent.action.VIEW"android:targetPackage="com.pshdhx.demo2"android:targetClass="com.pshdhx.demo2.RequestResActivity"/><categories android:name="android.shortcut.conversation" /></shortcut>
</shortcuts>

 

<resources><string name="app_name">安卓学习</string><string name="first_short">first</string><string name="first_long">启停活动</string>
</resources>
效果:

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【王道数据结构】【chapter线性表】【P44t16】

设有一个长度为n&#xff08;n为偶数&#xff09;的不带头结点的单链表且结点值都大于0&#xff0c;设计算法求这个单链表的最大的孪生和。孪生和的定义为一个结点值与其孪生结点值的和&#xff0c;对于第i个结点&#xff08;从0开始&#xff09;&#xff0c;其孪生结点为第n-i…

十分钟搭建本地Linux开发运行环境

十分钟搭建本地开运行环境 linux环境请参考&#xff1a;5分钟搭建本地linux开发环境 环境&#xff1a;宝塔、Jdk、Mysql、Redis 1、宝塔&#xff1a; 官网地址&#xff1a;宝塔官网 yum install -y wget && wget -O install.sh https://download.bt.cn/install/in…

安科瑞宿舍安全用电监测:科技保障,安全无忧

在当今社会&#xff0c;电力已成为我们日常生活中不可或缺的一部分。然而&#xff0c;不正确的用电方式或管理不善可能会引发火灾等安全事故&#xff0c;给学生带来生命财产威胁。为了解决这一问题&#xff0c;安科瑞宿舍安全用电监测系统应运而生&#xff0c;为学生的用电安全…

力扣1312. 让字符串成为回文串的最少插入次数

动态规划 思路&#xff1a; 通过插入字符构造回文串&#xff0c;要想插入次数最少&#xff0c;可以将字符串 s 的逆序 s 进行比较找出最长公共子序列&#xff1b;可以先分析&#xff0c;字符串 s 通过插入得到回文串 ps&#xff0c;其中间的字符应该不会变化&#xff1a; 若 s…

仅使用 Python 创建的 Web 应用程序(前端版本)第09章_购物车

在本章中,我们将实现购物车页面。 完成后的图像如下。 创建过程与之前相同,如下。 No分类内容1Model创建继承BaseDataModel的数据类Cart、CartItem2Service创建一个 CartAPIClient3Page定义PageId并创建继承自BasePage的页面类4Application将页面 ID 和页面类对添加到 Multi…

ZYNQ AC7020C的“点LED”实验

一、创建 Vivado 工程 1、启动 Vivado 2、在 Vivado 开发环境里点击“Create New Project”&#xff0c;创建一个新的工程 3、弹出一个建立新工程的向导&#xff0c;点击“Next” 4、在弹出的对话框中输入工程名和工程存放的目录。需要注意工程路径“Project location”不能有…

IS-IS:07 ISIS缺省路由

IS-IS 有两种缺省路由&#xff0c;第一种缺省路由是由 level-1 路由器在特定条件下自动产生的&#xff0c;它的下一跳是离它最近的 &#xff08;cost 最小&#xff09;level-1-2路由器。第二种缺省路由是 IS-IS 路由器上使用 default-route-advertise 命令产生并发布的。 本次实…

智慧交通的“大脑”与“神经”:物联网与车联网双轮驱动,智慧交通加速驶入未来

目录 一、物联网&#xff1a;智慧交通的“大脑” 二、车联网&#xff1a;智慧交通的“神经” 三、物联网与车联网的协同发展 四、智慧交通的未来展望 五、物联网与车联网在智慧交通中的应用案例 六、智慧交通面临的挑战与解决方案 七、政策与法规在智慧交通发展中的作用…

Kafka-服务端-PartitionLeaderSelector、ReplicaStateMachine

PartitionLeaderSelector 通过对前面的分析可知&#xff0c;PartitionMachine将Leader副本选举、确定ISR集合的工作委托给了PartitionLeaderSelector接口实现&#xff0c;PartitionMachine可以专注于管理分区状态。这是策略模式的一种典型的应用场景。 图展示了PartitionLead…

程序员如何应对中年危机

中年危机是一个普遍存在的问题&#xff0c;不仅仅局限于程序员这个职业。不过&#xff0c;对于程序员来说&#xff0c;由于技术更新迅速&#xff0c;中年危机可能更加明显。以下是一些应对中年危机的建议&#xff1a; 持续学习新技术和工具&#xff1a;计算机技术发展迅速&…

【C语言刷题系列】交换两个变量的三种方式

文章目录 1.使用临时变量&#xff08;推荐&#xff09; 2.相加和相减的方式&#xff08;值较大时可能丢失数据&#xff09; 3.按位异或运算 本文所属专栏C语言刷题_倔强的石头106的博客-CSDN博客 两个变量值的交换是编程中最常见的问题之一&#xff0c;以下将介绍三种变量的…

HarmonyOS 鸿蒙应用开发 (七、HTTP网络组件 axios 介绍及封装使用)

在HarmonyOS应用开发中&#xff0c;通过HTTP访问网络&#xff0c;可以使用官方提供的ohos.net.http模块。但是官方提供的直接使用不太好使用&#xff0c;需要封装下才好。推荐使用前端开发中流行的axios网络客户端库&#xff0c;如果是前端开发者&#xff0c;用 axios也会更加顺…