Android做了一年了,回頭來看看Activity

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.