1. 程式人生 > >Activity 之間傳值的幾種方式

Activity 之間傳值的幾種方式

二、通過startActivityForResult方法來得到Activity的回傳值

在一些情況下,我們通過 A activity跳轉到 B activity上,這時希望 A activtiy能從 B activity上得到一些返回值,這個時候我們就不能使用startActivity方法了,而是使用 startActivityForResult方法來完成我們的操作。這樣的場景在實際開發中還是很常見的,比如說A activity中做了一個查詢的功能,查詢向後臺請求資料假設需要傳入一個時間欄位,不傳的話預設是當前時間,B activity中可以設定時間,那我們就可以在根據B activity 傳回來的時間,在A activity 中就會有不同的查詢結果。 下面我們來模擬完成下提的需求: MainActivity:
package com.example.activitytest;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button button;
    private TextView textView;
    private int REQUEST_GET_TIME=0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button= (Button) findViewById(R.id.btn_click);
        textView= (TextView) findViewById(R.id.tv_time);
        button.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
//        Intent intent=new Intent();
//        intent.setClass(MainActivity.this,SecondActivity.class);
//        startActivity(intent);
        Intent intent=new Intent(this,SecondActivity.class);
        //第一個引數是Intent物件,第二個requestCode指定我們的一個啟動標誌值,因為我們可能有多個按鈕,如果都是跳轉到同一個Activity物件上,
        //我們需要對其進行標誌,才知道是哪個Activity物件跳轉過來的。
        startActivityForResult(intent,REQUEST_GET_TIME);
    }

    /**
     * 所有的Activity物件的返回值都是由這個方法來接收
     * requestCode    If >= 0, this code will be returned in onActivityResult() when the activity exits.
     * @param requestCode 表示的是啟動一個Activity時傳過去的requestCode值
     * @param resultCode 表示的是啟動後的Activity回傳值時的resultCode值
     * @param data 表示的是啟動後的Activity回傳過來的Intent物件
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
            if(requestCode==REQUEST_GET_TIME&&resultCode==RESULT_OK){
                textView.setText(data.getStringExtra("cur_time"));
            }
    }
}
SecondActivity:
package com.example.activitytest;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import java.text.SimpleDateFormat;
import java.util.Date;

public class SecondActivity extends AppCompatActivity {
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        textView= (TextView) findViewById(R.id.tv_cur_time);
        String curTime=getCurTime();
        textView.setText(curTime);
        Intent intent=new Intent();
        intent.putExtra("cur_time",curTime);
        setResult(RESULT_OK,intent);
        this.finish();
    }

    private String getCurTime() {
        long currentTimeMillis = System.currentTimeMillis();
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy年MM月dd日 HH:mm");
        return simpleDateFormat.format(new Date(currentTimeMillis));
    }
}
下面是效果圖:
另外需要提到的是,上面都是傳一些系統自帶的資料型別,如果想傳一個物件或者物件的陣列怎麼辦呢?還是可以用Intent傳值,不過要對傳遞的物件作一些特殊處理,可以參考這篇部落格:intent可以傳遞的資料型別

三、先把資料存在本地,然後在下一個Activity中從本地取。

這種方式涉及到資料儲存,Android資料的四種持久化儲存方式SharedPreferences、SQLite、Content Provider和File,該方式的缺點就是要佔用本地的資源,優點是資料可以在多個Activity之間共享。關於這種Activity之間的傳值以後會專門寫一篇部落格介紹,這裡先談下Activity之間傳值的幾種方式的主線。這裡推薦一篇部落格,可以大概瞭解下Android的幾種資料儲存方式
點選開啟連結

四、使用EventBus框架

越來越多的專案開發中使用到EventBus這個框架,那什麼是EventBus呢?用github開源文件上的介紹就是:一個Android平臺的事件匯流排框架, 它簡化了Activity、Fragment、Service等元件之間的互動,很大程度上降低了它們之間的耦合,使得我們的程式碼更加簡潔,耦合性更低,提升我們的程式碼質量。

開發中我們都知道,很多時候要在Activty與Activty間,Activty與Fragment等之間傳遞資料進行互動,操作起來很不方便,我們以前可能會用到介面回撥,或是用觀察者模式來實現,或是發廣播等等。這們操作不僅僅程式碼量大,而且程式碼耦合性高,效能不佳,也不便於維護。例如:兩個Fragment之間的通訊你會怎麼實現? 按照Android官方給的建議的解決方法如下: Communicating with the Activity,思路就是Activity實現某個介面,然後在Fragment-A關聯上Activity之後將Activity強轉為介面型別,然後在某個時刻Fragment中回撥這個介面,然後再從Activity中呼叫Fragment-B中方法。這個過程是不是有點複雜呢? 如果你也這麼覺得,那也就是你繼續看下去的理由了。