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

本文深入探讨了如何在使用递归时优雅地退出应用程序,详细解析了递归过程中栈的状态与退出机制。

一.递归退出

递归执行方式: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();
        }

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值