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); } }
问题分析
- 返回逻辑错误:当前ResultActivity直接启动新的InnerActivity实例,而非回到栈中已存在的InnerActivity,导致栈结构变为
Inner → Quiz → Result → 新Inner,原QuizActivity仍在栈内,容易引发异常跳转。 - Firestore监听的重复触发:InnerActivity使用
addSnapshotListener实时监听数据,每次数据更新都会刷新列表。若InAdapter的子项点击事件存在漏洞(如未防重复点击),会在列表刷新时意外触发QuizActivity启动。 - 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
相关产品推荐
相关产品推荐

