標籤:android android ui android開發 生命週期
Activity跳轉主要有兩種方式,如下所示:
其實精華,在這裡,onResume,才是安卓程式員實際操作的東東。^_^
命周期的每一個階段都表示為金字塔上的一個台階,當系統建立一個新的activity時,每一個回呼函數都把activity的狀態向上挪一步。
金子塔的最頂層就是activity運行在前景模式下,就是直接啟動並執行狀態。
當使用者離開activity時,系統調用另一些回呼函數,將activity的狀態從金字塔中一步一步移下來。有些情況下,activity只移動一部分,並沒有完全到底,這些情況下仍然可以移動回頂部。
注意這些狀態中只有三個狀態是靜態(static)的,意味著activity只有在這三個狀態下能停留一段時間:
Resumed:foreground,使用者可互動running state
對於fragment的初始化,比如讀取本機資料庫操作,我們可以放在這裡進行
Paused:部分被遮擋,不能接收使用者輸入也不能執行代碼,另一個半透明或者小的activity正擋在前面。
彈出日曆,popupwindow,活著對話方塊型的activity。
Stopped:activity完全被遮擋,不能被使用者看到,activity被認為在background,當Stopped的時候,activity執行個體的狀態資訊被保留,但是不能執行任何代碼。
啟動新的acitivity,或全屏對話方塊,全屏的activity。stop還不至於被destroy,所以onKeyDown中,判斷KeyCode_Back之後,可以進行對應的reStart操作。
其他狀態都是轉換狀態,系統會很快調用其他相應的回呼函數離開這些狀態。比如系統調用onCreate()之後,會很快調用onStart(),之後是 onResume()。
還有比如當啟動和退出Dialog時,Activity的狀態始終未變,可見,Dialog實際上屬於Acitivity內部的介面,不會影響Acitivty的生命週期。
1. 兩個Activity之間普通跳轉
從一個Activity跳至另一個Activity,需要用到Intent 這個東東,
2. 從源Activity跳轉至目標Activity,目標Activity再回傳值給源Activity
在Activity跳轉中,如果需要Activity的回傳值,再進行其他動作,怎麼實現呢?
1). 源Activity重寫onResume()方法
這種方式一般情況下是不推薦,但是針對一些特殊情況推薦使用,畢竟android中Activity跳轉時,一般接收的是值類型的資訊,這個方法可以更全面的接收回傳的資訊。這個就不做解釋了,做項目時用過,還比較好用,就是代碼寫的時候會相對複雜些。
2). 源Activity重新onActivityResult()方法
這種方式還是推薦使用的,通過重寫onActivityResult()方法,可以方便的接收目標Activity的回傳值,關鍵是注意Activity跳轉的方式,源Activity跳轉至目標Activity採用startActivityForResult()方法,而目標Activity關閉跳會源Activity時採用setResult()方法。
這裡要實現,當前頁面,選中地址的那個布局,點擊後跳轉到地址清單的activity,在地址清單的activity,選中一項之後,直接返回地址資料。
Demo代碼如下:
程式碼片段
第一個activity中
case R.id.score_no_address_layout:
if (userEntity != null) {
Intent intent2 = new Intent(this, MeAddressActivity.class);
intent2.putExtra(KEY, VALUE);
startActivityForResult(intent2, 2);
} else {
getUser();
}
第一個activity中接受第二個activity傳回的值,重寫onActivityResult()// 通過結果碼,將地址頁面選定的地址,返回到訂單結算頁
@Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
// TODO Auto-generated method stub
super.onActivityResult(arg0, arg1, arg2);
if (arg1 == RESULT_OK) {
address = (MeAddressEntity) arg2
.getSerializableExtra(MeAddressActivity.ADDRESS);
setUserAddress(address);
scoreErrorLogText.setVisibility(View.GONE);
}
}
而在地址清單的activity中,這麼發送的//一個自訂的listview的監聽器class ItemClick implements OnItemClickListener{
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {//獲得點擊的item的實體
MeAddressEntity entity = (MeAddressEntity) mAdapter.getItem(position);
if(entity!=null){
Intent intent = new Intent();//將序列化的實體,放入intent
intent.putExtra(ADDRESS, (Serializable)entity);
MeAddressActivity.this.setResult(RESULT_OK, intent);
MeAddressActivity.this.finish();
MeAddressActivity.this.overridePendingTransition(R.anim.activity_back_input,
R.anim.activity_back_out);
}
}
3.幾個非常有用的方法
a,.onFocusChanged卻只能在View中重寫。該方法是焦點改變的回調方法,當某個控制項重寫了該方法後,當焦點發生變化時,會自動調用該方法來處理焦點改變的事件。
比如當我們為了擷取組件的寬度,就要在這個方法中使用。 b,onResume()下一個activity被關閉,返回當前activity時候,可以在這裡重新整理資料。 c,onDestroy(),清空緩衝,比如照片緩衝,(當然,現在都不清空了,360沒事就把你幹了)
Android做了一年了,回頭來看看Activity