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

Activity間傳值的方式

官方 serializa 例如 代碼 nds creat ont fin idg

原文地址:https://blog.csdn.net/qq_33748378/article/details/53023036

Activity間的跳轉:

要了解Activity間的傳值,首先得知道actvivity是怎麽跳轉的。Activity間的跳轉有隱式和顯式兩種方式,代碼如下:

//      顯式
        Intent intent = new Intent(this,SecondActivity.class);

/*      Intent intent = new Intent();
        intent.setClass(this,SecondActivity.class);
*/ startActivity(intent); // startService(intent); 也可開啟服務,intent中傳入要啟動的服務的類即可 // 隱式 Intent intent1 = new Intent(); intent1.setAction("配置文件配置的action"); startActivity(intent1);

其實關鍵就在與intent是指定class,還是action。

Activity間的傳值:

一.傳值一般是將數據放在Intent對象中。

//      MainActivity
String value = "values"; int number = 123; intent.putExtra("name",value); intent.putExtra("password",number) // SecondActivity this.getIntent().getStringExtra("name"); this.getIntent().getIntExtra("password",0);

也可以先把值放在bundle對象中,再將bundle放入intent中。

        Bundle bundle = new Bundle();
        bundle.putString("name",value);
        bundle.putInt("password",number);
        intent.putExtra("bundle",bundle);

        this.getIntent().getBundleExtra("bundle");

以上是傳遞一些基本的類型,但如果要傳遞我們定義的一些引用類型,該類型需要先implements Parcelable,或者implements Serializable。具體的說明可以參考這裏:intent傳遞數據類型

二、通過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));  
    }  
}  

三、先把數據存在本地,然後在下一個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中方法。這個過程是不是有點復雜呢? 如果你也這麽覺得,那也就是你繼續看下去的理由了。

Activity間傳值的方式