(一看就懂的) Android 返回上一個界面刷新數據 ,安卓activity的生命週期,onResume()等生命週期中的方法什麼時候執行的問題!!!

問題提出:從列表頁進到詳細信息頁並修改數據後返回到上一個活動的時候刷新列表頁的數據。

思考過程:返回上一個活動頁只需要按一下back鍵就可以,並沒有一個用於啓動活動的Intent來傳遞數據,於是查閱文檔發現Activity中海油一個startActivityForResult()方法也是用於啓動活動的,這個方法就是期望在活動銷燬的時候能夠返回一個結果給上一個活動,這就符合了我們的問題要求。

startActivityForResult()需要接收兩個參數,第一個還是Intent(傳遞數據),第二個就是請求碼(在回調中判斷數據的來源)

button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                MyLogUtils.i(Const.LOG_TAG,"新增-設備屬性糾正");
                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
                startActivityForResult(intent,1);
            }
        });

這裏我們使用startActivityForResult()方法來啓動SecondActivity,後面的1是請求碼,唯一即可,接下來解釋在SecondActivity中註冊點擊事件,並在點擊事件中添加返回的數據邏輯。代碼如下:

public class SecondActivity extends AppCompatActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);
        Botton btn = findViewByid(R.id.back_Btn);
        btn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("data_return","Hello SecondActivity");
                setResult(RESULT_OK,intent);
                finish();
            }
        });
    }
    
}

在代碼中看到我們還是使用了Intent傳遞數據,但是它沒有指定任何的“意圖”。把數據放到intent裏面以後就調用setResult()方法,這個方法是專門用於傳遞數據給上一個Activity的,第一個參是用於向上一個Activity中返回處理結果,一般用RESULT_OK或RESULT_CANCELED這兩個值,第二個參數則把數據傳遞回去,然後在finish()銷燬當前活動

由於在啓動SecondActivity中使用了startActivityForResult(),在銷燬之後還會回調FirstActivity中的OnActivityResult()方法,因此我們西藥在FirstActivity中重寫這個方法得到返回的數據,代碼如下:

@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
    switch(requestCode){
        case 1:
            if(resultCode==RESULT_OK){
                String returnData = data.getStringExtra("data_return");
                Log.d("FirstActivity,"returnData");
            }
            break;
        default:
    }
}

這樣就可以將數據傳回給上一個Activity了


解決方案2:

利用安卓Activity中的生命週期的執行順序也能簡單的解決這個問題,知道了生命週期的執行順序,就可以通過重寫相應的方法,在方法中重新回去數據,然後刷新頁面就可以實現(此方案更高級)

例如重寫onResume(),代碼如下:

    @Override
    protected void onResume() {
        super.onResume();
        //重新獲取數據的邏輯,此處根據自己的要求回去



        //顯示信息的界面
        setContentView(R.layout.first_layout);
        initView();
    }

 

onResume是在啓動activity啓動之後才能執行的,也就是恢復執行。程序正常啓動:onCreate()->onStart()->onResume();
正常退出:onPause()->onStop()->onDestory()
一個Activity啓動另一個Activity: onPause()->onStop(), 再返回:onRestart()->onStart()->onResume()
程序按back 退出: onPause()->onStop()->onDestory(),再進入:onCreate()->onStart()->onResume();
程序按home 退出: onPause()->onStop(),再進入:onRestart()->onStart()->onResume();

 

 

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