Android學習資料之記事本應用程序開發(fā)練習3_第1頁
Android學習資料之記事本應用程序開發(fā)練習3_第2頁
Android學習資料之記事本應用程序開發(fā)練習3_第3頁
Android學習資料之記事本應用程序開發(fā)練習3_第4頁
Android學習資料之記事本應用程序開發(fā)練習3_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Android學習資料之記事本應用程序開發(fā)練習3概述記事本應用程序開發(fā)練習步驟 1 2 3 4 5 6 7為什么處理生命周期時間非常重要8 9 101在這章練習中, 你將用生命周期事件回調(diào)去存儲和獲得應用程序的狀態(tài)代碼. 這個練習描述了:生命周期函數(shù)及你的程序如何調(diào)用它維護程序狀態(tài)的技術(shù)概述2將 Notepadv3 導入Eclipse. 如果你看到一個關(guān)于 AndroidManifest.xml, 的錯誤,或者一些與Android.zip文件有關(guān)的問題, 右擊工程然后從彈出的按鈕中選擇Android Tools(Android工具) 修正工程屬性 . 此練習的起點正是Nodepadv2的結(jié)束處

2、。 當前應用程序存在問題 點擊返回按鈕當編輯工作會失敗,還有其他的一些在編輯過程中產(chǎn)生的問題也會導致編輯內(nèi)容丟失.要修正這個問題, 我們需要將創(chuàng)建和編輯記事本的大多數(shù)功能(函數(shù))放進 NoteEdit類, 并且為編輯記事本制定完整的生命周期。Android學習資料之步驟 13刪除 NoteEdit 里的那些從附加束里分析標題和主題的代碼. 相反(相對于上面的方法), 我們將用 DBHelper 這個類 直接從數(shù)據(jù)庫訪問記事本. 我們所需傳進 NoteEdit Activity 的是一個 mRowId (但僅僅是我們編輯的時候,如果我們執(zhí)行的是創(chuàng)建 操作,我們什么也不用傳進去).刪除這些行:St

3、ring title = extras.getString(NotesDbAdapter.KEY_TITLE);String body = extras.getString(NotesDbAdapter.KEY_BODY);Android學習資料4被傳進extras Bundle的那些屬性我們也不需要了, 這些屬性只是被我們用來 在UI上編輯body文本的. 所以刪除: if (title != null) mTitleText.setText(title);if (body != null) mBodyText.setText(body);Android學習資料5在NoteEdit類的頂部為

4、NotesDbAdapter 創(chuàng)建一個類對象: private NotesDbAdapter mDbHelper;也在函數(shù)onCreate()中為 NotesDbAdapter添加一個實例 (緊接著在super.onCreate() 調(diào)用后): mDbHelper = new NotesDbAdapter(this); mDbHelper.open();Android學習資料之步驟 26在 NoteEdit, 我們需要為mRowId檢查savedInstanceState , 以防編輯含有束中的已保存的狀態(tài), 而這些是我們需要覆蓋掉的狀態(tài) (這會發(fā)生在activity 失去焦點并被重啟的時候)

5、.替換當前初始化 mRowId的代碼: mRowId = null; Bundle extras = getIntent().getExtras(); if (extras != null) mRowId = extras.getLong(NotesDbAdapter.KEY_ROWID); Android學習資料之步驟 37用以下代碼替換: mRowId = savedInstanceState != null ? savedInstanceState.getLong(NotesDbAdapter.KEY_ROWID) : null; if (mRowId = null) Bundle ex

6、tras = getIntent().getExtras(); mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID) : null; 為 savedInstanceState標注空值檢查, 并且仍需從extras Bundle 加載mRowId:如果savedInstanceState沒有為它提供.這是一個可用來快速安全使用 值的三元操作符,當然如果沒有提供,它會是空。Android學習資料8接下來, 如果我們有mRowId,我們需要在它之上產(chǎn)生相關(guān)的域(fields):populateFields();這個動作需

7、要在confirmButton.setOnClickListener()前做, 這個方法將在呆會定義。Android學習資料之步驟 49無需onClick()處理函數(shù)里創(chuàng)建bundle和設置bundle值, Activity 也不再用返回任何附加信息給調(diào)用者。 因為我們無需返回值,我們可以用setResult()的簡化版: public void onClick(View view) setResult(RESULT_OK); finish();使用生命周期函數(shù)時,要謹記將更新和方法說明存儲到數(shù)據(jù)庫。整個 onCreate() 函數(shù)應該如此:super.onCreate(savedInstan

8、ceState);Android學習資料之步驟 510mDbHelper = new NotesDbAdapter(this);mDbHelper.open(); setContentView(R.layout.note_edit); mTitleText = (EditText) findViewById(R.id.title);mBodyText = (EditText) findViewById(R.id.body); Button confirmButton = (Button) findViewById(R.id.confirm); mRowId = savedInstanceSta

9、te != null ? savedInstanceState.getLong(NotesDbAdapter.KEY_ROWID) : null;Android學習資料11if (mRowId = null) Bundle extras = getIntent().getExtras(); mRowId = extras != null ? extras.getLong(NotesDbAdapter.KEY_ROWID) : null; populateFields(); confirmButton.setOnClickListener(new View.OnClickListener() p

10、ublic void onClick(View view) setResult(RESULT_OK); finish(); );Android學習資料12定義populateFields() 方法.private void populateFields() if (mRowId != null) Cursor note = mDbHelper.fetchNote(mRowId); startManagingCursor(note); mTitleText.setText(note.getString(Android學習資料之步驟 613 note.getColumnIndexOrThrow(N

11、otesDbAdapter.KEY_TITLE); mBodyText.setText(note.getString( note.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY); 該方法用了 NotesDbAdapter.fetchNote() 方法去找到要編輯的說明(標注) , 然后它調(diào)用Activity 類的startManagingCursor() 方法 , 這是Android提供的一個跟蹤光標生命周期的方法. 然后將按照Activity生命周期所描述的一樣:釋放和創(chuàng)建資源, 而無需我們擔心 . 在那之后, 我們只需從光標處獲得標題和主體,并

12、且產(chǎn)生它們的視圖元素。Android學習資料14如果你習慣了總是控制著你的應用程序, 你可能會不能明白為何必需要 這些整個生命周期都存在的東西。其實原因是:在Android,是操作系統(tǒng),而不是你在控制著程序的運 作!正如我們所看到的,Android模型是基于Activities的相互調(diào)用的. 當 一個Activity調(diào)用另外一個時,至少當前的Activity被暫時停止掉,在操作系統(tǒng)運行資源不足時, 也有可能兩個都被停掉。如果這種情況真的發(fā)生,那么該Activity必須保存足夠的狀態(tài)信息,以期恢復。 最好就是保存它被停掉時的狀態(tài).Android學習資料之步驟 7為什么處理生命周期時間非常重要15

13、Android有一個 明確的生命周期. 即使你沒有顯式地將控制權(quán)交個一個Activity,它生命周期時間也有可能會發(fā)生. 比如說,當有電話打 進你的手機,而當時你手機上某個Activity正在運行,那么當前運行的Activity將被交換(系統(tǒng)資源控制權(quán)轉(zhuǎn)換) 而電話Activity將運行(占有資源控制權(quán)).還是在 NoteEdit 類, 現(xiàn)在覆蓋這些方法: onSaveInstanceState(), onPause() 及 onResume(). 這些都是已有的onCreate()函數(shù)附帶的方法。Android學習資料16當某Activity將被停止掉有可能在重啟之前被殺掉, Android

14、將會調(diào)用 onSaveInstanceState() 這將意味著任何有用的狀態(tài)信息將被保存,以使該Activity 重啟時能被重新初始化. 這是和 onCreate() 方法對應的, 實際上 被傳進 onCreate()的savedInstanceState 的Bundle 正是你在onSaveInstanceState() 中作為outState(暫失效狀態(tài))創(chuàng)建的bundle. onPause() 與 onResume() 也是自動調(diào)用的方法. onPause() 總是在一個 Activity結(jié)束時被調(diào)用,即使我們特意調(diào)用了finish()。我們將用這個去將當前的標注保存到數(shù)據(jù) 庫。為了減

15、少被占用的資源,良好做法是在onPause()期間盡量釋放任何能被釋放的資源. 因此我們關(guān)掉DbHelper類, 并將它的域設為空,使得它能被適時回收。Android學習資料17另一方面,onResume() 能重建 mDbHelper 實例以使我們能夠使用它。 然后從數(shù)據(jù)庫中將標注重新讀出,并且產(chǎn)生新的域。 因此,在 populateFields() 方法后留空以添加以下的一些生命周期的方法: onSaveInstanceState(): 重寫 protected void onSaveInstanceState(Bundle outState) super.onSaveInstanceSt

16、ate(outState); outState.putLong(NotesDbAdapter.KEY_ROWID, mRowId); Android學習資料18onPause(): 重寫 protected void onPause() super.onPause(); saveState(); Well define saveState() next.onResume(): 重寫 protected void onResume() super.onResume(); populateFields(); Android學習資料19定義 saveState() 方法以把數(shù)據(jù)讀出到數(shù)據(jù)庫. pri

17、vate void saveState() String title = mTitleText.getText().toString(); String body = mBodyText.getText().toString(); if (mRowId = null) long id = mDbHelper.createNote(title, body); if (id 0) mRowId = id; Android學習資料之步驟820else mDbHelper.updateNote(mRowId, title, body); 注意到我們接受了 createNote() 的返回值,如果該值有

18、效,我們將它保存到 mRowId 字段, 這樣我們就能在將來更新之,而不用再重建一個。 (重建也可能會發(fā)生在生命周期事件被觸發(fā)時).Android學習資料21現(xiàn)在拿出先前的在Notepadv3類 onActivityResult() 方法中定義的處理代碼 所有的標注檢索和更新都發(fā)生在NoteEdit 生命周期內(nèi), 因此所有的 onActivityResult() 方法需要做的就是更新數(shù)據(jù)視圖,不需要其他的工作了。 該方法如下:重寫protected void onActivityResult(int requestCode, int resultCode, Intent intent) super.onActivityResult(requestCode, resultCode, intent); fillData();因為另外一個類正在做這個工作,這個函數(shù)所需的做的就是更新數(shù)據(jù).Android學習資料之步驟 922將onListItemClick() 方法里設置標題和主體的代碼移除 (一樣,它們都是無需的, 除了mRowId ): Cursor c = mNotesCursor; c.moveToPosition(position);也移除: i.putExtra(NotesDbAdapter.KEY_T

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論