13.退出应用程序(递归和栈退出)

深入理解栈:从CPU和函数的视角看栈的管理、从栈切换的角度理解进程和协程 执行单元是指 CPU 调度和分派的基本单位,它是一个 CPU 能正常运行的基本单元。执行单元是可以停下来的,只要能把 CPU 状态(其实就是寄存器的值)全部保存起来,等到这个执行单元再被调度的时候,就把状态恢复过来就行了。我们把这种保存状态,挂起,恢复执行,恢复状态的完整过程,称为执行单元的调度 (Scheduling)。具体来说,常见的执行单元有进程,线程和协程三种,接下来,我们详细说明这三种执行单元的区别和联系。我们先来比较进程和线程。 阅读详情

一.递归退出

递归执行方式:A调B,B跳C,C跳D。
当在D里面退出,就D跳C,C跳B,B跳A,然后就退出了(一个一个退)

效果图:


实现代码如下:
activity_main.xml
<?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"
    tools:context="com.zking.android13_activity.MainActivity"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="这是MainActivity"
        android:textSize="30sp"
        android:background="#00ff00"/><!--为了看效果的TextView-->

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tv_main_text"
        android:textSize="25sp"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="(当前为A页面)跳自己"
        android:onClick="jumpMain"/><!--跳转(跳自己 即A跳A)-->

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="跳B页面"
        android:onClick="jumpB"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="退出应用程序"
        android:onClick="exit"
        />
</LinearLayout>
activity_b.xml
<?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"
    tools:context="com.zking.android13_activity.BActivity"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="这是BActivity"
        android:textSize="30sp"
        android:background="#00ffff"/><!--为了看效果的TextView-->

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="25sp"
        android:id="@+id/tv_b_text"/><!--文本框-->

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="跳Main(A页面)"
        android:onClick="jumpMain"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="退出应用程序"
        android:onClick="exit"
        /><!--退出按钮-->

</LinearLayout>

MainActivity.java
package com.zking.android13_activity;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

/**
 * A页面
 */
public class MainActivity extends AppCompatActivity {

        private TextView tv_main_text;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

                 tv_main_text = (TextView) findViewById(R.id.tv_main_text);
                 //查看当前Activity在内存里的地址
                 //拿到当前任务栈的id,id一样代表一个栈
                 tv_main_text.setText("当前Activity实例:"+this+"\n当前任务栈在:"+this.getTaskId());
        }

        public void jumpMain(View view){//跳自己
                Intent intent=new Intent(this,MainActivity.class);
                startActivity(intent);
        }

        public void jumpB(View view){//A跳B
                Intent intent=new Intent(this,BActivity.class);
                //startActivity(intent);
                startActivityForResult(intent,0x101);
        }

        //退出方法
        public void exit(View view){
                finish();//退出当前的Activity(满足不了要求了)    会调onDestroy
                //System.exit(0);//退出当前的Activity    不会调onDestroy
        }

        @Override
        protected void onDestroy() {
                super.onDestroy();
                Log.i("test","onDestroy");
        }

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
                exit(null);
        }

}
BActivity.java
package com.zking.android13_activity;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class BActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_b);

                TextView tv_b_text = (TextView) findViewById(R.id.tv_b_text);
                //打印B在内存当中的地址
                tv_b_text.setText("当前Activity地址:"+this+"\nB的任务栈在:"+this.getTaskId());
        }

        public void jumpMain(View view){//跳A页面
                Intent intent=new Intent(this,MainActivity.class);
                startActivity(intent);
        }

        //退出方法
        public void exit(View view){
                finish();//干掉自己
        }
}

二.栈退出

效果图:



1.写全局变量

package com.zking.application;

import android.app.Activity;
import android.app.Application;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2017/6/17 0017.
 */

//全局变量
public class MyApplication extends Application {
       //定义一个对象集合
        private List<Activity> activities=new ArrayList<>();

        public void add(Activity activity){
            activities.add(activity);
        }
        public void exit(){
            for (Activity activity : activities) {
                activity.finish();
            }
        }

}

2.配置
<application  android:name="com.zking.application.MyApplication">

</application>

3.Java代码(layout代码如上所示)
MainActivity.java
package com.zking.android13_activity;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import com.zking.application.MyApplication;

/**
 * A页面
 */
public class MainActivity extends AppCompatActivity {

        private TextView tv_main_text;
        private MyApplication myApplication;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

                 tv_main_text = (TextView) findViewById(R.id.tv_main_text);
                 //查看当前Activity在内存里的地址
                 //拿到当前任务栈的id,id一样代表一个栈
                 tv_main_text.setText("当前Activity实例:"+this+"\n当前任务栈在:"+this.getTaskId());

                //获取MyApplication
                myApplication = (MyApplication) getApplication();
                myApplication.add(this);

        }

        public void jumpMain(View view){//跳自己
                Intent intent=new Intent(this,MainActivity.class);
                startActivity(intent);
        }

        public void jumpB(View view){//A跳B
                Intent intent=new Intent(this,BActivity.class);
                startActivity(intent);
        }

        //退出方法
        public void exit(View view){
                myApplication.exit();
        }

        @Override
        protected void onDestroy() {
                super.onDestroy();
                Log.i("test","onDestroy");
        }
}
BActivity.java
package com.zking.android13_activity;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import com.zking.application.MyApplication;

public class BActivity extends AppCompatActivity {

        private MyApplication myApplication;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_b);

                TextView tv_b_text = (TextView) findViewById(R.id.tv_b_text);
                //打印B在内存当中的地址
                tv_b_text.setText("当前Activity地址:"+this+"\nB的任务栈在:"+this.getTaskId());

                //获取MyApplication
                myApplication = (MyApplication) getApplication();
                myApplication.add(this);


        }

        public void jumpMain(View view){//跳A页面
                Intent intent=new Intent(this,MainActivity.class);
                startActivity(intent);
        }

        //退出方法
        public void exit(View view){
                myApplication.exit();
        }

}





FDTD材料nk值拟合优化指南:利用材料资源管理器提升光学模型精度 本文详细介绍了如何利用FDTD仿真软件中的材料资源管理器,对材料nk值进行精确拟合与优化,从而提升光学模型的仿真精度。文章通过实战案例,解析了拟合参数调整、报告解读以及针对varFDTD求解器的特殊注意事项,帮助用户从根本上解决仿真结果不准的常见问题。 阅读详情

相关推荐

python多线程实现http代理

python多线程实现http代理文章要求1.py socket模块2.py threading模块3.环境搭建3.1设置代理3.2搭建http简单服务器代码分析1.完整代码2.逻辑结构 文章要求 1.py socket模块 socket模块接触后很简单,我实现的是阻塞性的套接字。 需要了解到,连接套接字,监听套接字,和套接字accept()方法的返回值是元组 数据传递过程sock.recv(1024),sock.send()也不需要转换编码,直接以b"二进制流"传输 2.py threading模块 th

qq_43402663的博客 2508

算法-递归算法

递归算法

伟庭的博客 1436

ConvLSTM时空预测实战代码详解

ConvLSTM代码复现

JaysonWong的博客 1万+

在使用递归时,能中途退出递归吗?

你也可以根据需要设置其他退出条件。例如,你可以添加一个检查来限制递归的深度,以防止栈溢出或达到某个特定的计算目标。在前端开发中,当你使用递归时,确实可以在满足特定条件时中途退出递归。递归函数通常有一个退出条件,当满足这个条件时,函数将停止递归调用自身并返回结果。以下是一个简单的JavaScript递归函数示例,用于计算阶乘。递减到0时,递归将停止,并返回计算结果。时,函数将停止递归并返回一个字符串。在这个例子中,当递归深度达到。

王铁柱666的博客 726

【入门篇】第五章 第一次与 AI Agent 交互

本文介绍了OpenClaw中最基本的用户与AI Agent交互方式,剖析了Agent和Gateway两个核心组件的作用,通过简单示例展示了从用户请求到结果返回的完整执行流程,说明了最小交互过程对验证系统可用性的重要意义,为后续学习复杂任务执行机制奠定基础。

lanyv的博客 512

第2章: MMU Notifier 全局通知器的核心原理⭐

摘要 MMU Notifier机制是Linux内核中用于处理内存地址空间变化通知的关键框架。其设计遵循解耦与标准化、最小侵入性、高性能和安全性四大原则,采用三层架构实现上层应用、核心层与内存管理层的协作。框架提供两种通知模型:全局订阅的mmu_notifier和区间订阅的mmu_interval_notifier,分别适用于KVM虚拟化和GPU共享虚拟内存等不同场景。核心数据结构mmu_notifier_ops定义了设备驱动需要实现的回调函数集合,包括进程退出处理、页面老化管理、地址范围失效通知等功能。

图形/计算GPU的驱动与虚拟化技术分享园地 4556

如何退出递归循环调用?你得有flag呀

继上次 递归实现列表赋值 的经历之后,今天又遇到了新的需要:给你一棵树的最深节点value值,让你找到从根到该节点的value列表。树的结构长下面这样 { value: 1, children: [ { value: 2, children: [ { value: 3 }, {

weixin_44184425的博客 2743

为什么先进工艺需要check那么多corner?

那么hold slack = launch clock path delay + data path delay - capture_clock_path_delay = -capture_clock_path_delay,也就是说,capture clock path delay越大,hold越难满足。而且,我们在设计的时候,一般clock频率都会过约,所以是有较大的margin的。有的foundry还会对rc的取值范围进行了约束,如cworst_T,采用的是1.5 sigma的取值范围。

芯冰乐 2086

android app退出 服务不退,Android应用退出的几种方式

本来在简书发过一次,但是由于饱醉豚,搬家到掘金了。本人小菜鸟一个,都说写文章会进步,所以一直想尝试。第一次写,希望大家多多包涵!哈哈三种最简单最常用的退出APP的方法:第一种:LauchMode设置为SingleTaskStep1:加载模式为singleTask在AndroidManifest中将我们进入的第一个Activity(MainActivity)的加载设置为singleTask。这样Ma...

weixin_35530964的博客 1265

第10篇:Agent + 爬虫 = 全自动数据采集专家

在企业级数据采集场景中,传统爬虫的痛点已经到了无法忽视的地步:而Agent + 爬虫的组合,就是这些痛点的终极解决方案。它的核心逻辑是:把爬虫从「人工写死的固定执行脚本」,升级为「能自主分析、自主决策、自主适配、自主修复的智能采集机器人」。我们在生产环境中做过对比测试:传统爬虫开发10个网站的采集脚本需要3人天,而Agent采集机器人只需要3分钟,页面改版后的修复成本从1人天降到了0,采集任务的成功率从62%提升到了95%以上。终端执行以下命令,安装基础依赖,与前9篇环境完全兼容: 二、核心能力拆解:Age

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1576

【速通RAG实战:索引】4.RAG文档解析技术

通过本文技术方案,可构建高精准、高效率的文档解析流水线,为 RAG 应用提供坚实的知识底座。核心在于**格式解析的鲁棒性**和**语义分块的准确性**,后续通过持续的性能优化和质量监控,逐步提升索引质量和检索效率。

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 1545

android 退出应用程序

一、android 退出应用程序主要有三种方法:递归退出;栈退出;报错退出。这篇博客主要介绍前两种,递归退出和栈退出         二、递归退出       递归退出的原理就是在主界面跳子界面时用startActivityForResult()这个方法进行跳转,在子界面退出时将子界面关闭,而后主界面直接调关闭的方法,废话不多说,看代码      主界面(MainActivity)

qq_37999820的博客 382

风电功率预测 | 基于RF随机森林的风电功率预测(附matlab完整源码)

风电功率预测 | 基于RF随机森林的风电功率预测(附matlab完整源码)

天天酷科研的博客 896

递归(五)—— 初识暴力递归之“如何利用递归实现栈逆序”

第五步:程序检查系统栈,进入getLast(stack_1{2,3}), 将返回值赋给last, 使last = 3, 程序继续执行到第8行,将result= 1 写入stack_1, 执行第9行,函数返回last值,并且销毁getLast(stack_1{2,3})的调用过程。程序再次进入reverse(stack_1)第五步,程序检查当前系统栈的情况,进入reverse(3),继续执行第13行代码 stack_1.push(last),将last = 1写入stack_1,退出 reverse(3);

xinran0703的专栏 1090

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Activity的模式,退出应用程序

1.Activity的四种模式:        运用launchMode();选择模式。          standard:标准模式。自己可调用自己的Activity。          singleTop:顶单例模式。不可以直接调用自己,通过间接的方式获取Activtity。两个一样Activity          但地址不同。          singleTask:内单例模式。

言叶水吉的博客 296

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Python旅途——函数的递归和栈的使用

Python——函数之递归、栈的使用 今天主要和大家分享函数的递归,同时引入一个新的概念——栈 1.递归 1.定义 函数的递归指的就是函数自己调用自己,什么是函数自己调用自己呢?我们来看一个栗子: 这里给大家一个数学中的一个数列:斐波那契数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6...

weixin_30407613的博客 402

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

计算机算法基础:13个法则消去递归

基本思路:将递归过程中出现递归调用的地方,用等价的非递归代码来代替,并对return语句做适当处理。 13条规则:处理直接递归调用中的递归代码和return语句,将之转化成等价的迭代代码。 初始 在开始,插入说明为栈的代码并将其初始化为空。在一般情况下,这个栈用来存放参数、局部变量和函数的值、每次递归调用的返回地址。 将标号L1附于第一条可执行语句。然后对于每一处递归调用都用一组下列规则的指令来...

weixin_44225940的博客 333

java递归栈_理解递归与堆栈??

数据结构学习(C++)之递归(good)http://www.yesky.com/90/1736590.shtml对于递归的一些探讨http://blog.csdn.net/zongxiong/archive/2006/03/23/635777.aspxquote:用递归的程序都可以用迭代(其实也就是循环)的方式代替,而所有的循环程序也都可以改写成递归,这两者之间的转换只是一个程序设计难度、易读性...

weixin_33263633的博客 328

递归完成斐波拉契--函数递归与栈

本文将递归与栈的实例

一位学生的无用武之地 431

对递归的进一步理解

这周看了一道求数组排列的题目,解法用了递归,看懂之后自己对递归的理解更深了。 递归的定义 递归是指程序调用自身,但调用时必须改变调用参数,直到某个参数满足退出条件。函数调用的过程会用到run-time stack,递归时栈中的内容有相似性,但是每一层的差异最终会导致运行栈增长的停止,并且从栈顶返回。 理解递归,最终还是要归结到理解函数调用过程中运行栈的增长和退出。 run-time stack...

面向学姐编程 303

Python-递归函数

文章目录递归函数函数执行流程递归Recursion概念举例说明递归的性能 fib35项比较递归的性能间接递归总结 递归函数 函数执行流程 def foo1(b, b1=3): print("foo1 called", b, b1) def foo2(c): foo3(c) print("foo2 called", c) def foo3(d): ...

鑫仔之行 649

递归函数

递归 递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。 注: 递归的时候,每次调用一个函数,计算机都会为这个函数分配新的空间,这就是说,当被调函数返回的时候,调用函数中的变量依然会保持原先的值,否则也不可能实现反向输出。 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> //递归 void test(int num) { if (num == 1) { printf

m0_53157173的博客 6634

大话数据结构 第四章 栈与队列 栈 栈的应用---递归

我们先看一个经典的斐波那契数列(Fibnacci)。 应用题:兔子出生两个月就可以生兔子,每对兔子每月生一队兔子,假设兔子不死,一年后共多少对兔子? 月 1 2 3 4 5 6 7 8 9 10 11 12 兔子对数 1 1 2 3 5 8 13 21 34 55 89 144 数学函数定义就是: 我们先用常规的迭代实现前几位的斐波那契数列。

songhuanfei2017的博客 368

栈与队列->栈的作用

栈的引用简化了程序设计的问题,划分了不同的关注层次,使得思考范围缩小,更加聚焦于我们要解决问题的核心。 而数组等,要分散精力去思考数组的下标增减等细节问题,从而掩盖了问题的本质。 栈的应用 -- 递归 栈的重要应用就是在程序设计语言中实现了递归。 经典的递归例子: 斐波那契数列。 Eg: 如果说兔子出生两个月后便有繁殖能力,一对兔子每月能出生一对兔子,假如所有的兔子都不死

NicholasKong 1994

二叉树的遍历(包括递归和非递归方法)

注意:根节点是最先被压入第一个栈中的,同时也是最先被压入第二个栈中的!中序时,我们首先去遍历二叉树的左分支,并将节点压入栈中,只到找到最左边的叶节点,接着弹出(并打印节点),并看其有没右分支,如果没有,栈再弹出一个节点(根节点),看其有没有右分支。我们将树的每个节点压入栈中,由于是先序遍历,首先压入的是根节点,然后弹出(弹出节点时打印信息,且一个循环弹出一个节点),接着是压入右子树节点,最后压入左子树节点。isEmpty(s)) //在栈不为空的情况下,左孩子为空,弹出该结点,遍历右孩子。

H1767410的博客 939

递归调用的过程

递归调用的过程 递归的调用是一个不断出栈进栈的过程,将数据在栈中进行保存处理,在使用过后再依次退出栈。 如下为递归调用的演示: 1.int Age(int n) 2.{ 3. int tmp; 4. if(n==1) 5. { 6. return 10; 7. } 8. else 9. { 10. tmp = Age(n-1)+2; 11. return tmp; 12. } 13.} ...

weixin_45726014的博客 2108
上一篇: 13.Activity的LaunchMode(四种)启动模式
下一篇: 18.自定义UI(画布)-单点触摸-多点触摸
_北冥有鱼_
博客等级 码龄10年 41粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值