Android:相機調用與Activity生命週期

一個小項目,要用到相機拍照,保存拍照後,下一個界面就是掃描二維碼。
參考github裏面的大師的項目,分別完成了程序。經過測試,分開兩個界面單獨調用沒問題。
可是,將兩個界面連接起來,在拍照保存Activity(簡稱A)跳轉時候,跳到第二個界面掃描二維碼(簡稱B)時候,提示相機出錯。

A中:相機初始化打開和設置參數的代碼都在onCreate裏面,一個類搞定。使用EasyCamera。
B中:大牛都是在onResume和onPause中開啓關閉相機的。這個寫法複雜一點。需要設置管理相機的類等。如:Zxing。

思考一下:單獨調用A,在A按back鍵或者home鍵退出,調用系統默認相機都正常,然後再重新返回A,相機都正常運作。只是:A中的一個按鈕BtnA 打開B,就出錯。應該是打開B時候,A沒有關閉或者釋放相機資源。
測試一下生命週期:
A 的代碼:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activityA);

        ShowMsg("A Create.");
        btn1 = (Button) findViewById(R.id.buttonA1);
        btn1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                ShowMsg("BtnA1 Click And Start CycleB");
                Intent intent = new Intent(ActivityA.this, ActivityB.class);
                startActivity(intent);
                ShowMsg("Start CycleB at A, And Finish A.");
                finish();
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        ShowMsg("A1 Resume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        ShowMsg("A1 Pause");
    }

B的代碼:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_activity_cycle_b);

        ShowMsg("B Create.");
        btn2 = (Button) findViewById(R.id.buttonB2);
        btn2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                ShowMsg("BtnB2 Click Finish");
                finish();
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        ShowMsg("B2 Resume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        ShowMsg("B2 Pause");
    }

運行結果:
跳轉到B時候A先Pause
跳轉到B時候A先Pause 然後B才Create。這樣A的相機應該還沒有完全停止,關閉,明白了。
生命週期使用不當,影響整個程序的運作。
應該參考B的寫法,重新理解Activity生命週期。
參考下圖:最中間的[Another activity comes in front of then activity] 這個是一個重點,簡單理解爲一個要被開啓的activity,也就是上圖運行結果的:B還沒被create,先停止A.Pause,此時,A的相機沒被關閉或者釋放,就在B執行打開相機,程序就會出錯。
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章