Android实现activity之间的传值方法总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wyf2017/article/details/85095073

今天写这篇文章主要是因为自己这段时间在学习安卓的时候实现不同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之间传值的总结,希望能帮助和我一样碰到相同问题的小伙伴,有什么疑问可以关注左上角我的公众号可以给我留言。

猜你喜欢

转载自blog.csdn.net/wyf2017/article/details/85095073
今日推荐