如何将数据从一项活动传递到多项活动?

Posted

技术标签:

【中文标题】如何将数据从一项活动传递到多项活动?【英文标题】:How I can passing data from one activity to multiple activities? 【发布时间】:2019-10-08 08:03:33 【问题描述】:

我想将这些数据从当前活动发送到更多“BusInformationsCard”活动。

@覆盖 public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int position)

    viewHolder.busLineName.setText(tickets.get(position).getBusLine());
    viewHolder.seatsNumbers.setText(String.valueOf(tickets.get(position).getSeatNum()));
    viewHolder.leavingTime.setText(tickets.get(position).getLeavingTime());
    viewHolder.companyName.setText(tickets.get(position).getLeavingTime());

    viewHolder.cardView.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            // here passing data to BusInformationCard
            Intent ticketInfo = new Intent(mContext, BusInformationsCard.class);

            ticketInfo.putExtra("busLine", tickets.get(position).getBusLine());
            ticketInfo.putExtra("companyName", tickets.get(position).getCompany());
            ticketInfo.putExtra("driverName", tickets.get(position).getName());
            ticketInfo.putExtra("driverPhone", tickets.get(position).getDriverPhone());
            ticketInfo.putExtra("seatNum", tickets.get(position).getSeatNum());
            ticketInfo.putExtra("leavingTime", tickets.get(position).getLeavingTime());
            ticketInfo.putExtra("latitude", tickets.get(position).getLatitude());
            ticketInfo.putExtra("longitude", tickets.get(position).getLongitude());

            mContext.startActivity(ticketInfo);

        
    );

【问题讨论】:

How do I pass data between Activities in android application?的可能重复 【参考方案1】:

您可以使用共享偏好在整个项目中使用您的数据。您只需要像这样创建一个 App Preference 类:-

public class AppPrefrences 

            private static SharedPreferences mPrefs;
            private static SharedPreferences.Editor mPrefsEditor;

            public static boolean isUserLoggedOut(Context ctx) 
                mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
                return mPrefs.getBoolean("id_logged_in", true);
            

            public static void setUserLoggedOut(Context ctx, Boolean value) 
                mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
                mPrefsEditor = mPrefs.edit();
                mPrefsEditor.putBoolean("id_logged_in", value);
                mPrefsEditor.commit();
            

    public static String getUserName(Context ctx) 
            mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
            return mPrefs.getString("userName", "");
        

        public static void setUserName(Context ctx, String value) 
            mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
            mPrefsEditor = mPrefs.edit();
            mPrefsEditor.putString("userName", value);
            mPrefsEditor.commit();
        

public static void clearAllPreferences(Context ctx) 
        mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
        mPrefsEditor = mPrefs.edit();
        mPrefsEditor.clear();
        mPrefsEditor.commit();
    
        

现在只需调用这些方法来保存数据并获取保存的数据。 创建自己的方法来保存数据并获取保存的数据

【讨论】:

如果您有任何疑问,请发表评论 嘿@Sandeep 答案很好,但我有一个疑问。如果我们进行特定活动时数据已更改怎么办?我们仍然得到从 sharePrefernce 中获得的旧数据,对吧? 当数据改变时,你必须同时改变你的偏好数据,否则它总是会返回你之前存储的旧数据 是的,所以我们需要在其他活动中添加这个set和get方法来检查数据是否已经更新对不对? @Sandeep 我已经看到你的答案了。你写得很好,每个人都能理解@Sandeep。继续.!!!!【参考方案2】:

您可以使用 Intent 的 getExtra 方法

将数据从一个活动获取到另一个

这里是例子::

Example


String name;

name = getIntent().getStringExtra("driverName");

【讨论】:

【参考方案3】:

如果您希望传递完整的ticket 对象,您可以在Java 中使用Serializable 或Parcelable 类。

这些类可帮助您将对象转换为可在活动之间传输的形式。

在 Serializable 的情况下,您需要做的就是扩展您的票证类别

public class Ticket extends Serializable 

在 Parcelable 的情况下,您需要添加更多代码(在 Java 的情况下)。

public class Ticket extends Parcelable 

   public void writeToParcel(Parcel dest, int flags) 
      dest.writeString(name);
      dest.writeString(busLine);
      // Similarly for all the other parameters.
   

   public static final Parcelable.Creator CREATOR = new Parcelable.Creator() 
    public Ticket createFromParcel(Parcel in) 
        return new Ticket(in);
    
    public Ticket[] newArray(int size) 
        return new Ticket[size];
    
 ;


在这两种情况下,现在您可以像 intent.putExtra("ticket", ticket); 一样直接在 Intent 中传递您的完整票证对象,如果您已扩展 Parcelable,则可以在 Ticket ticket = getIntent().getSerializableExtra("ticket") */ getParcelable */ 等其他活动中接收它。

Parcelable 和 Serializable 的主要区别在于速度差异,Parcelable 比 Serializable 快。此外,parcelable 是可定制的,因此开发人员可以独立处理他们的数据。 Serializable 也使用了 Java 反射 API,因此在转换过程中会产生大量垃圾对象。

【讨论】:

以上是关于如何将数据从一项活动传递到多项活动?的主要内容,如果未能解决你的问题,请参考以下文章

无法将位置从一项活动返回到另一项活动

如何将图像从一项活动发送到另一项活动?

如何将字符串从一项活动发送到另一项活动?

多项活动服务

将值从一项活动更新到另一项活动

如何使用数据库将大量数据从一个活动传递到android中的另一个活动