Android Studio中SplashActivity未运行致列表为空的问题求助
问题解决:SplashActivity未启动及试题列表为空
核心原因
你的SplashActivity从未运行,是因为AndroidManifest.xml中把MainActivity设置为了应用的启动入口(LAUNCHER),App启动后直接进入MainActivity,完全没有走到SplashActivity的初始化逻辑,导致静态列表listS始终为空。
分步解决方案
1. 修改AndroidManifest,设置SplashActivity为启动页
将SplashActivity的intent-filter改为启动入口,同时调整其他Activity的配置,避免多余的intent-filter导致冲突:
<application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@drawable/mainscreenlogo" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/Theme.QuizTheoryApplication" tools:targetApi="31"> <!-- 设为启动页 --> <activity android:name=".example.QuizTheoryApplication.SplashActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <!-- 移除MainActivity的LAUNCHER配置 --> <activity android:name=".example.QuizTheoryApplication.MainActivity" android:exported="true"> </activity> <activity android:name=".example.QuizTheoryApplication.DashboardActivity" android:label="Preferences" android:exported="true"> </activity> </application>
2. 用Intent传递试题列表(替代静态变量,避免内存泄漏)
静态变量传递数据容易引发内存泄漏问题,推荐通过Parcelable接口实现数据的安全传递:
第一步:让ModelClass实现Parcelable接口
public class ModelClass implements Parcelable { private String question; private String optionA; private String optionB; private String optionC; private String optionD; private String answer; // 构造方法 public ModelClass(String question, String optionA, String optionB, String optionC, String optionD, String answer) { this.question = question; this.optionA = optionA; this.optionB = optionB; this.optionC = optionC; this.optionD = optionD; this.answer = answer; } // Parcelable核心方法 protected ModelClass(Parcel in) { question = in.readString(); optionA = in.readString(); optionB = in.readString(); optionC = in.readString(); optionD = in.readString(); answer = in.readString(); } public static final Creator<ModelClass> CREATOR = new Creator<ModelClass>() { @Override public ModelClass createFromParcel(Parcel in) { return new ModelClass(in); } @Override public ModelClass[] newArray(int size) { return new ModelClass[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(question); dest.writeString(optionA); dest.writeString(optionB); dest.writeString(optionC); dest.writeString(optionD); dest.writeString(answer); } // Getter方法(按需添加) public String getQuestion() { return question; } public String getAnswer() { return answer; } // 其他选项的Getter... }
第二步:修改SplashActivity的跳转逻辑
移除静态变量,通过Intent传递列表:
public class SplashActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.splash_activity_main); ArrayList<ModelClass> listS = new ArrayList<>(); listS.add(new ModelClass("here is the question", "a", "b", "c", "d", "answer")); listS.add(new ModelClass("Under-inflated tires increase fuel consumption. A single tire under-inflated by 56 kpa (8 psi) can increase fuel consumption by?", "25 per cent", "15 per cent", "Seven per cent", "Four per cent", "Four per cent")); listS.add(new ModelClass("You are not allowed to park a vehicle within _____________ of a pedestrian corridor", "9 metres", "3 metres", "30 metres", "15 metres", "15 metres")); listS.add(new ModelClass("What class licence permits the holder to operate a motorcycle?", "Class 4", "Class 1", "Class 6", "Class 5", "Class 6")); listS.add(new ModelClass("Seatbelts must be worn by all drivers and passengers:", "Only when driving in the city", "Only when carrying passengers", "All the time unless exempted by law", "Only when driving on the highway", "All the time unless exempted by law")); new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { @Override public void run() { Intent intent = new Intent(SplashActivity.this, DashboardActivity.class); // 传递试题列表 intent.putParcelableArrayListExtra("QUESTIONS_LIST", listS); startActivity(intent); // 关闭Splash,避免返回时回到启动页 finish(); } }, 1500); } }
第三步:在DashboardActivity中接收数据
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dashboard); Hooks(); // 从Intent中获取试题列表 ArrayList<ModelClass> allQuestionsList = getIntent().getParcelableArrayListExtra("QUESTIONS_LIST"); // 处理空列表的异常情况 if (allQuestionsList == null || allQuestionsList.isEmpty()) { Toast.makeText(this, "试题数据加载失败", Toast.LENGTH_SHORT).show(); finish(); return; } Collections.shuffle(allQuestionsList); modelClass = allQuestionsList.get(index); setAllData(); }
为什么之前的尝试无效
- 你在DashboardActivity中跳转SplashActivity的逻辑是错误的:Dashboard已经先启动并执行了初始化代码,此时再跳Splash,Dashboard中的
listS已经是空值,而且会导致Activity栈混乱。 - 静态变量传递数据本身不是可靠方案,一旦App进程被回收,静态变量会被清空,且容易引发内存泄漏。
内容的提问来源于stack exchange,提问作者ISTech
相关产品推荐
相关产品推荐

