如何将一个对象从一个 activity 搬运到另一个?

How do I carry an object from one activity to another?

我正在尝试调整消息传递应用程序,并且我有两个独立的活动。我有连接 activity 和客户端 activity。我也有一个 class 给客户。 Connect和Client活动中都使用了client,但是不知道如何把ConnectActivity中使用的Client对象携带到ClientActivity中

我的连接活动:

public class ConnectActivity extends AppCompatActivity {

    private Client client;

    private EditText txtServerAddress;

    private EditText txtPortNumber;

    private EditText txtUsername;

    private TextView lblErrors;

    public ConnectActivity(){}

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_connect);

        final EditText txtServerAddress = (EditText) findViewById(R.id.edit_text_server_address);
        this.txtServerAddress = txtServerAddress;

        final EditText txtPortNumber = (EditText) findViewById(R.id.edit_text_port_number);
        this.txtPortNumber = txtPortNumber;

        final EditText txtUsername = (EditText) findViewById(R.id.edit_text_username);
        this.txtUsername = txtUsername;

        final TextView lblErrors = (TextView) findViewById(R.id.text_view_errors);
        this.lblErrors = lblErrors;

        Button btnLogIn = (Button) findViewById(R.id.button_log_in);
        btnLogIn.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                String username = txtUsername.getText().toString().trim();
                if(username.length() == 0)
                    return;

                String portNumber = txtPortNumber.getText().toString().trim();
                if(portNumber.length() == 0)
                    return;

                String serverAddress = txtServerAddress.getText().toString().trim();
                if(serverAddress.length() == 0)
                    return;

                int port;

                try
                {
                    port = Integer.parseInt(portNumber);
                }
                catch(Exception en)
                {
                    return;
                }

                client = new Client(serverAddress, port, username, new ClientActivity(), ConnectActivity.this);


                if(!client.start())
                    return;

                Intent intent = new Intent(ConnectActivity.this, ClientActivity.class);
                startActivity(intent);
            }
        });

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    }

    public void append(String str)
    {
        lblErrors.setText(str);
    }
}

我的客户活动:

public class ClientActivity extends AppCompatActivity {

    // for I/O
    private Client client;

    private ListView lstMessages;

    private EditText txtMessage;

    private Button btnSend;

    private ArrayList<ChatMessage> messages;

    private ArrayAdapter<ChatMessage> messageAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_client);

        final ListView lstMessages = (ListView) findViewById(R.id.list_messages);

        final EditText txtMessage = (EditText) findViewById(R.id.edit_text_message);

        final Button btnSend = (Button) findViewById(R.id.button_send);
        btnSend.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                String message = txtMessage.getText().toString();
                txtMessage.setText("");

                client.sendMessage(new ChatMessage(ChatMessage.MESSAGE, message));
            }
        });

        messages = new ArrayList<>();
        messageAdapter = new ArrayAdapter<ChatMessage>(ClientActivity.this, R.layout.chat_message, messages);
        lstMessages.setAdapter(messageAdapter);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    }

    public void connectionFailed()
    {
        Intent intent = new Intent(this, ConnectActivity.class);
        startActivity(intent);
    }

    public void display(String msg)
    {
        messageAdapter.add(new ChatMessage(ChatMessage.ERROR, msg));
    }

    public void append(String str)
    {
        messageAdapter.add(new ChatMessage(ChatMessage.MESSAGE, str));
    }

}

使您的客户端 class 实现 Parcelable,然后使用

在 Intent 中传递客户端对象
Bundle bundle = new Bundle(); 
bundle.putParcelable("client", client); 
intent.putExtra(bundle); 
startActivity(intent);

Here是实现Parcelable的示例代码。

您可以通过在 Class B 中创建 Class A 的实例并传递您想要的任何内容来轻松做到这一点

您可以使用 Parcelable 将对象从一个 Activity 传递给另一个。

来自您的 ConnectActivity.java btnLogIn onClick 方法,parcel Client 对象:

// Bundle
Bundle bundle = new Bundle();
bundle.putParcelable("CLIENT", client);

// Intent
Intent intent = new Intent(ConnectActivity.this, ClientActivity.class);
intent.putExtras(bundle);

startActivity(intent);

在您的 ClientActivity.java onCreate() 方法中,获取 Client 对象:

// Get data from Intent
Bundle bundle = getIntent().getExtras();

if(bundle != null)
{
    Client client = bundle.getParcelable("CLIENT");
}

仅供参考, 确保您的 Client class 实施 Parcelable.

希望对你有所帮助~

您有多种在活动之间共享数据的选项:

  1. 如果数据应该是永久性的,请将其存储在数据库、平面文件或 SharedPreferences 中。每个 activity 直接从永久存储访问数据。

  2. 如果数据不应永久存储,请让您的客户端 class 可打包并通过 Intent 传递。其他人已经介绍过了,我就不赘述了。