1. 程式人生 > >Android實現activity之間的傳值方法總結

Android實現activity之間的傳值方法總結

今天寫這篇文章主要是因為自己這段時間在學習安卓的時候實現不同activity之間傳值問題進行一個小小的總結。

【問題】

舉個簡單例子,比如我要在做一個小專案要獲取使用者的個人資訊,在登入的時候我們需要儲存使用者的資訊,或者我們需要檢視個人的資訊,那實現這個小功能怎麼辦呢。我想你們肯恩會跟我一樣那就是通過資料庫查詢如下

String sql = “select * from user where username=?”;(或者通過賬號,郵箱來查詢);

這裡我們就用郵箱來查詢吧

String sql = “select * from user where email=?”;

好了,寫了這條語句我們的思路大體是正確的,但是我們需要明白的這個email

怎麼來獲取。

【方案一】

如果我們有兩個介面,一個是登入介面(LoginActivity)另外一個是顯示個人資訊的介面(showPersonInfoActivity)

我們登入進去後然後顯示個人資訊可以使用Intent或者Bundle來實現傳值具體做法如下:

>使用Intent實現傳值

//就用我們上述說的從LoginActivity傳值到showPersonInfoActivity
//我們通過email來實現資料庫查詢條件,那麼我們需要將登陸介面的email傳過去
//email是你自己佈局建立控制元件的id這裡僅做參考
String login_email = email.getText().toString();
//傳值
Intent intent = new Intent(LoginActivity.this, showPersonInfoActivity.class);
//這裡我們將login_email存放到receive_eamil中
intent.putExtra("receive_email", login_email);
//向下傳值
startActivity(intent);

接收上面傳過來的值

//取值
Intent intent = getIntent();
//獲取Intent中的資料
//intent.getIntExtra(key, value);//接收int型別的值
//這樣我們就接收到了上面傳過來的值
String login_email = intent.getStringExtra("receive_email");//接收String型別的值

>通過Bundle傳值

使用Bundle傳值其實跟上面方法差不多這裡就簡單寫一下

//傳值
Intent intent = new Intent(this, XXXActivity.class);
Bundle bundle = new Bundle();
bundle.putInt(key, value);
bundle.putString(value);
intent.putExtras(bundle);
startActivity(intent);
//取值
intent.getExtras();
bundle.getInt(key);
bundle.getString(key);

【分析弊端】

在這裡我們可以看到我們實現了activity之間的傳值,但是這只是針對於2個相鄰activity之間的傳值假設我需要從A->D,難道我們還要像上面的那種方法從A->B->C->D 這樣看起來是行的通的但是這種方法的效率實在是低下,而且還很容易出錯,舉個例子

就用我上面講的那個案例來說,假設我這裡有三個頁面,登入,主選單介面,個人資訊介面

首先我們登入進去是主選單介面,通過側滑選單開啟顯示個人資訊介面,那麼我也需要實現檢視個人資訊的功能這下我們如果要用上面的方法來實現傳值就會出現這樣的一個問題

在登入介面我們獲取email之後我們需要判斷下使用者輸入的資訊是否正確才能進入主選單介面如果我們按照上面的邏輯來實現的話

首先我們會跳轉到個人資訊介面,而不是主選單介面,為什麼呢,原因很簡單

因為我們傳值不是有個startActivity(intent);這樣導致我們下面的方法無法執行,所以這是一個弊端不可取。

【解決方法】

好了說了上面的一些利與弊,下面來看看我是如何解決這個問題的。

【思路講解】

對於解決上面的那個問題我們可以使用SharedPreferences來實現資料的儲存以及讀取

首先我們建一個通用類名字為Save如下

import android.content.Context;
import android.content.SharedPreferences;

/**
 * Created by https://blog.csdn.net/wyf2017 on 2018/12/19.
 */

public class Save {
    public static void saveUserInfo(Context context, String email) {
        /**
         * SharedPreferences將使用者的資料儲存到該包下的shared_prefs/config.xml檔案中,
         * 並且設定該檔案的讀取方式為私有,即只有該軟體自身可以訪問該檔案
         */
        SharedPreferences sPreferences = context.getSharedPreferences("config", context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sPreferences.edit();
        //當然sharepreference會對一些特殊的字元進行轉義,使得讀取的時候更加準確
        editor.putString("login_email", email);
        //切記最後要使用commit方法將資料寫入檔案
        editor.commit();
    }
}

這裡就新建了一個saveUserInfo方法原來儲存使用者的email這裡大家可以修改下,然後我們接下來就是要去使用這個方法實現儲存資料如下

  //檢驗登入資訊
    public void isLogin() {
        String activity_email = email.getText().toString();
        String activity_password = password.getText().toString();

        if (activity_email.isEmpty()) {
            Toast.makeText(LoginActivity.this, "賬號不能為空", Toast.LENGTH_SHORT).show();
            return;
        }
        if (activity_password.isEmpty()) {
            Toast.makeText(LoginActivity.this, "請輸入密碼", Toast.LENGTH_SHORT).show();
            return;
        }
        UserService userService = new UserService(LoginActivity.this);
        boolean flag = userService.login(activity_email, activity_password);
        if (flag) {
            showDailog();
            //儲存使用者登入的郵箱
            Save.saveUserInfo(LoginActivity.this,activity_email);

        } else {
            Toast.makeText(LoginActivity.this, "賬號或者密碼錯誤!", Toast.LENGTH_SHORT).show();
        }
    }

接下來就是我們需要去取值了

        //取值
        SharedPreferences sPreferences = getSharedPreferences("config", MODE_PRIVATE);
        String email = sPreferences.getString("login_email", "");

【總結】

以上就是我個人自己在學習過程如何在不同的activity之間傳值的總結,希望能幫助和我一樣碰到相同問題的小夥伴,有什麼疑問可以關注左上角我的公眾號可以給我留言。