點擊「第一章」按鈕跳轉 Activity1 顯示 page1.txt;點擊「第二章」跳轉同一 Activity1 顯示 page2.txt。
| 方案 | 實現方式 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| Intent Extra 傳文件名 | intent.putExtra("file", "page1.txt") |
簡單、無持久化 | 文本極長超過 Binder 限制(~1MB)會崩潰 | 短文本、動態生成 |
| Intent 傳原始文本 | intent.putExtra("text", longString) |
無 I/O | 同左,且佔用內存 | 極短文本 |
| 本地文件/ assets 讀取 | 傳文件名,目標 Activity 讀取 assets/page1.txt 或內部存儲 |
支持超長文本、離線、緩存 | 需 I/O、權限 | 長文本、電子書、幫助文檔 |
| 數據庫/ContentProvider | 傳 ID,查詢內容 | 結構化、可搜索 | 複雜度高 | 內容管理系統 |
// MainActivity.java
public void onChapterClick(View view) {
String fileName = "page" + view.getTag() + ".txt"; // Tag 設置為 1,2,3...
Intent intent = new Intent(this, ReadActivity.class);
intent.putExtra("fileName", fileName);
startActivity(intent);
}
// ReadActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_read);
TextView tv = findViewById(R.id.textContent);
String fileName = getIntent().getStringExtra("fileName");
try (InputStream is = getAssets().open(fileName);
BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"))) {
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) sb.append(line).append('\n');
tv.setText(sb.toString());
} catch (IOException e) {
tv.setText("章節加載失敗:" + e.getMessage());
}
}
AsyncTask/RxJava/Coroutines 異步讀取大文件,避免 ANR。核心思想:傳標識,不傳內容,由目標頁按需加載。