You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android项目问题:结果页返回按钮跳转异常,自动启动QuizActivity

问题描述

我正在开发一个包含4个Activity的Android项目:

  • MainActivity:通过RecyclerView和Firebase数据库展示分类
  • InnerActivity:通过RecyclerView展示子分类
  • QuizActivity:用于答题
  • ResultActivity:展示答题结果

当前问题:点击ResultActivity中的返回按钮,预期跳转至InnerActivity,但实际跳转到了QuizActivity,现象为先进入InnerActivity后又自动启动了QuizActivity。

相关代码

ResultActivity

package ali.edu.topic;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;

import ali.edu.topic.databinding.ActivityResoultBinding;

public class ResoultActivity extends AppCompatActivity {

    ActivityResoultBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityResoultBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        int currectAns = getIntent().getIntExtra("currectAns",0);
        int totalQuitions = getIntent().getIntExtra("total",0);

        binding.scoor.setText(String.format("%d/%d", currectAns, totalQuitions));

        binding.returnBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(ResoultActivity.this, InnerActivity.class);
                startActivity(intent);
            }
        });
    }
}

InnerActivity

package ali.edu.topic;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;

import android.os.Bundle;

import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreException;
import com.google.firebase.firestore.QuerySnapshot;

import java.util.ArrayList;

import ali.edu.topic.databinding.ActivityInnerBinding;

public class InnerActivity extends AppCompatActivity {

    ActivityInnerBinding binding;
    FirebaseFirestore database;
    ArrayList<InnerModel> innerModels;
    InAdapter Inadapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityInnerBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        database = FirebaseFirestore.getInstance();

        String name = getIntent().getStringExtra("name");
        binding.hadTitle.setText(name);

        innerModels = new ArrayList<>();
        Inadapter  = new InAdapter(this, innerModels);
        database.collection("topics").document(name).collection("boards").orderBy("number")
                .addSnapshotListener(new EventListener<QuerySnapshot>() {
                    @Override
                    public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) {
                        innerModels.clear();
                        for (DocumentSnapshot snapshot : value.getDocuments()) {
                            InnerModel model = snapshot.toObject(InnerModel.class);
                            innerModels.add(model);
                        }
                        Inadapter.notifyDataSetChanged();
                    }
                });

        binding.innerRecycleView.setLayoutManager(new LinearLayoutManager(this));
        binding.innerRecycleView.setAdapter(Inadapter);
    }
}
问题分析
  1. 返回逻辑错误:当前ResultActivity直接启动新的InnerActivity实例,而非回到栈中已存在的InnerActivity,导致栈结构变为Inner → Quiz → Result → 新Inner,原QuizActivity仍在栈内,容易引发异常跳转。
  2. Firestore监听的重复触发:InnerActivity使用addSnapshotListener实时监听数据,每次数据更新都会刷新列表。若InAdapter的子项点击事件存在漏洞(如未防重复点击),会在列表刷新时意外触发QuizActivity启动。
  3. Activity栈管理缺失:QuizActivity启动ResultActivity后未销毁自身,栈内残留QuizActivity,导致返回流程混乱。
解决方案

方案1:修正ResultActivity返回逻辑

直接结束当前ResultActivity,同时确保QuizActivity启动Result后销毁自身:

  • 修改ResultActivity的返回按钮事件:
binding.returnBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // 结束当前页面,回到栈内上一个Activity
        finish();
    }
});
  • 在QuizActivity启动ResultActivity后调用finish():
// QuizActivity中启动Result的代码示例
Intent intent = new Intent(QuizActivity.this, ResoultActivity.class);
intent.putExtra("currectAns", correctCount);
intent.putExtra("total", totalQuestions);
startActivity(intent);
// 销毁QuizActivity,栈结构变为Inner → Result
finish();

方案2:修复Adapter防重复点击逻辑

在InAdapter的ViewHolder中添加防重复点击处理,避免列表刷新时意外触发跳转:

// InAdapter的ViewHolder点击事件示例
itemView.setOnClickListener(new View.OnClickListener() {
    private long lastClickTime = 0;
    @Override
    public void onClick(View v) {
        long currentTime = System.currentTimeMillis();
        // 1秒内禁止重复点击
        if (currentTime - lastClickTime > 1000) {
            lastClickTime = currentTime;
            // 原有启动QuizActivity的逻辑
            Intent intent = new Intent(context, QuizActivity.class);
            // 传递必要参数
            context.startActivity(intent);
        }
    }
});

方案3:优化Firestore监听生命周期

在InnerActivity销毁时移除Firestore监听,防止页面销毁后回调触发异常:

private ListenerRegistration listenerRegistration;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ... 原有代码
    listenerRegistration = database.collection("topics").document(name).collection("boards").orderBy("number")
            .addSnapshotListener(new EventListener<QuerySnapshot>() {
                @Override
                public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) {
                    // ... 原有逻辑
                }
            });
}

@Override
protected void onDestroy() {
    super.onDestroy();
    // 移除监听
    if (listenerRegistration != null) {
        listenerRegistration.remove();
    }
}

内容的提问来源于stack exchange,提问作者Isa Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:50:21