1. 程式人生 > >java工程積累——activity初試

java工程積累——activity初試

最近在工作中,研究了工作流,這裡藉助網路上的一些資料,和大家分享下工作流的入門!

一、什麼是Activity?

    簡單的說:Activity就是佈滿整個視窗或者懸浮於其他視窗上的互動介面。在一個應用程式中通常由多個Activity構成,都會在Manifest.xml中指定一個主的Activity,如下設定


<actionandroid:name="android.intent.action.MAIN" />


當程式第一次執行時使用者就會看這個Activity,這個Activity可以通過啟動其他的Activity進行相關操作。當啟動其他的Activity時這個當前的這個Activity將會停止,新的Activity將會壓入棧中,同時獲取使用者焦點,這時就可在這個Activity上操作了。都知道棧是先進後出的原則,那麼當用戶按Back鍵時,當前的這個Activity銷燬,前一個Activity重新恢復。

二,簡單demo

新建工程,編寫如下程式碼:


<span style="font-size:18px;"><span style="font-size:18px;">package com.android.ttx.actiitylifedemo;  
import android.app.Activity;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.KeyEvent;  
public class ActivityLifeDemo extends Activity {  
    private final static String TAG="ActivityLifeDemo";  
      
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
          
        Log.i(TAG, "onCreate");  
    }  
    @Override  
    protected void onStart() {  
        Log.i(TAG, "onStart");  
        super.onStart();  
    }  
    @Override  
    protected void onRestart() {  
        Log.i(TAG, "onRestart");  
        super.onRestart();  
    }  
    @Override  
    protected void onResume() {  
        Log.i(TAG, "onResume");  
        super.onResume();  
    }  
    @Override  
    protected void onPause() {  
        Log.i(TAG, "onPause");  
        super.onPause();  
    }  
    @Override  
    protected void onStop() {  
        Log.i(TAG, "onStop");  
        super.onStop();  
    }  
    @Override  
    protected void onDestroy() {  
        Log.i(TAG, "onDestroy");  
        super.onDestroy();  
    }  
}  
</span>  </span>




程式碼很簡單,只涉及到一個Activity,一些使用者的操作,我們通過記錄操作和列印日誌的方式來看看Activity的生命週期過程。


<span style="font-size:18px;">1、  執行
看到如下列印日誌:
08-31 08:46:53.916: INFO/ActivityLifeDemo(312): onCreate
08-31 08:46:53.916: INFO/ActivityLifeDemo(312): onStart
08-31 08:46:53.916: INFO/ActivityLifeDemo(312): onResume
2、按下返回按鍵: 
08-31 09:29:57.396: INFO/ActivityLifeDemo(354): onPause
08-31 09:29:58.216: INFO/ActivityLifeDemo(354): onStop
08-31 09:29:58.216: INFO/ActivityLifeDemo(354): onDestroy
3、長按Home鍵,彈出最近開啟過的應用程式,點選ActivityLifeDemo
08-31 08:51:46.916: INFO/ActivityLifeDemo(312): onCreate
08-31 08:51:46.916: INFO/ActivityLifeDemo(312): onStart
08-31 08:51:46.936: INFO/ActivityLifeDemo(312): onResume
4、按Home鍵
08-31 08:53:32.676: INFO/ActivityLifeDemo(312): onPause
08-31 08:53:33.796: INFO/ActivityLifeDemo(312): onStop
5、在AllList中點選開啟
08-31 08:54:14.286: INFO/ActivityLifeDemo(312): onRestart
08-31 08:54:14.286: INFO/ActivityLifeDemo(312): onStart
08-31 08:54:14.296: INFO/ActivityLifeDemo(312): onResume
</span>



通過日誌資訊,我們可以看到。Activity的啟動過程:onCreate—onStart—onResume;下返回鍵時:onPause—onStop—onDestroy 正如上面說是,當按下返回鍵時,此Activity彈出棧,程式銷燬。確實如此,我們再次 開啟時的啟動過程又回到onCreate—onStart—onResume。OK,啟動之後按下Home鍵,回到Launcher,檢視列印資訊:onPause—onStop,再次開啟的執行過程:onRestart—onStart—onResume。


我們通過對Activity的各種操作,構成了Activity的生命週期,我們看到無論對Activity做如何的操作,都會接收到相關的回撥方法,那麼我們在開發的過程中通過這些回撥方法就可以寫工作,比如說釋放一些重量級的物件,網路連線,資料庫連線,檔案讀等等。



三、啟動Activity

要啟動一個新的Activity,我們可以通過呼叫Context中的startActivity來啟動。像這樣:


<span style="font-size:18px;"><span style="font-size:18px;">Intent intent = new Intent(this, ActivityDemo.class);  
startActivity(intent);  // ActivityDemo是需要啟動的Activity類  
</span>  </span>




通過上面的方法可以啟動新的Activity了,但如果我要從當前的Activity中傳遞資料到新的Activity呢?很簡單:
<span style="font-size:18px;"><span style="font-size:18px;">Intent intent = new Intent(this,ActivityDemo.class);  
Bundle bundle = new Bundle();  
bundle.putBoolean("bool_key", true);  
intent.putExtras(bundle);  
startActivity(intent);  
</span>  </span>




還有,有時候我們需要啟動帶返回值的Activity,簡單的說就是需要新啟動的Activity返回時將值傳遞給啟動它的Activity,像這樣:


<span style="font-size:18px;"><span style="font-size:18px;">Intent intent = new Intent(ActivityLifeDemo.this,RevalueActivity.class);  
startActivityForResult(intent, 0x1001);  
</span>  


ActivityLifeDemo是當前的Activity,啟動RevalueActivity,我們在ActivityLifeDemo中需要獲取RevalueActivity傳回來的值。那麼在RevalueActivity中就必須這樣寫:
<span style="font-size:18px;">Intent intent  = new Intent();  
intent.putExtra("revalue_key","haha-revalueActivity");  
setResult(0x1001, intent);</span>  
那麼“revalue_key”值在哪裡獲取呢?必須重寫onActivityResult方法,通過判斷requestCode,來確定
<span style="font-size:18px;">if(requestCode==0x1001){  
            String str = data.getStringExtra("revalue_key");  
            Log.i(TAG, "返回的值為:"+str);  
        }  
</span>  </span>

四、儲存狀態

通過重寫onSaveInstanceState()方法來實現Activity的執行狀態,請注意以下幾點:


1)由於activity 物件被暫停或停止時,它仍然保留在記憶體裡面,關於它的成員資訊和當前狀態都是活動的,所以此時可以儲存Activity的狀態,從而使使用者所作的Activity的更改儲存在記憶體中


2)  當系統回收記憶體而將Activity銷燬時,就無法儲存其狀態,所以需要呼叫onSaveInstanceState()方法來實現狀態的儲存


3)  很多情況並不需要保持狀態資訊,比如按下返回鍵直接關閉程式,所以並不能保證會呼叫onSaveInstanceState。如果呼叫了該方法,一般是在onStop 方法之前且可能在 onPause 之後呼叫。儘管如此,即使你沒做任何操作或沒有實現 onSaveInstanceState() 方法,你的 activity 狀態也能通過Activity 類裡面預設實現的 onSaveInstanceState 方法恢復出來。特別是會為佈局中的檢視( View )預設呼叫onSaveInstanceState 方法,並在這個方法中允許每一個檢視提供它需要恢復的任何資訊。幾乎每一個 Android框架中的 widget 都視情況實現了這個方法。


注:因為 onSaveInstanceState 方法不一定會被呼叫,所以你應該只是用它來儲存一些 activity 的轉換過程狀態(即 UI 的狀態),而不能用來儲存永久性資料。但你可以用 onPause 方法在使用者離開 activity 時來儲存永久性資料,比如需要儲存到資料庫的資料。


有一個很好的方法可以用來檢驗應用程式儲存狀態的能力,就是簡單地旋轉你的裝置來改變螢幕的方向。因為當螢幕方向改變時,系統為了給新的方向提供一個可能合適的代替資源,會銷燬 activity 並新建一個新的。由於這個原因,你的 activity 是否能在其重新建立時完成儲存狀態就顯得尤為重要,因為使用者經常會在使用應用程式時旋轉螢幕的。



五、總結

        大家看到這裡對工作流有了個簡單的認識,咱們也有了理解,其實任何一種技術,都是對前輩問題的解決,而工作流就是對以前流程問題的總結,說白了,這裡的所有的程式碼都是對以前重複問題的總結!

        學習任何一種技術,只要從戰略上先蔑視他,然後從戰術上重視他,他就不是問題!