0
点赞
收藏
分享

微信扫一扫

Android Intent 传输数据

落拓尘嚣 08-11 06:00 阅读 34

在 Android 开发中,Intent 是用于在不同组件之间进行通信的重要机制。通过 Intent,你可以在 Activity、Service 和 BroadcastReceiver 之间传递数据。以下是详细说明和示例代码,展示如何使用 Intent 传输不同类型的数据。

1. 基本概念

  • 显式 Intent: 直接指定目标组件的类名。
  • 隐式 Intent: 不直接指定目标组件,而是通过 action、category 等信息来匹配目标组件。

2. 传递基本数据类型

示例:从一个 Activity 发送数据到另一个 Activity
MainActivity.java

package com.example.intentdata;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    private EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = findViewById(R.id.editText);
        Button buttonSend = findViewById(R.id.buttonSend);

        buttonSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String message = editText.getText().toString();
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                intent.putExtra("EXTRA_MESSAGE", message);
                startActivity(intent);
            }
        });
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter a message"/>

    <Button
        android:id="@+id/buttonSend"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send"
        android:layout_marginTop="16dp"/>
</LinearLayout>

SecondActivity.java

package com.example.intentdata;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        TextView textView = findViewById(R.id.textView);
        Intent intent = getIntent();
        String message = intent.getStringExtra("EXTRA_MESSAGE");
        textView.setText(message);
    }
}

activity_second.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="16dp">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24sp"/>
</LinearLayout>

3. 传递复杂数据类型

示例:传递自定义对象

为了传递自定义对象,你需要实现 SerializableParcelable 接口。

User.java (Serializable)

package com.example.intentdata;

import java.io.Serializable;

public class User implements Serializable {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

MainActivity.java (发送自定义对象)

package com.example.intentdata;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button buttonSendObject = findViewById(R.id.buttonSendObject);

        buttonSendObject.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                User user = new User("John Doe", 30);
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                intent.putExtra("EXTRA_USER", user);
                startActivity(intent);
            }
        });
    }
}

SecondActivity.java (接收自定义对象)

package com.example.intentdata;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        TextView textView = findViewById(R.id.textView);
        Intent intent = getIntent();
        User user = (User) intent.getSerializableExtra("EXTRA_USER");
        if (user != null) {
            textView.setText("Name: " + user.getName() + ", Age: " + user.getAge());
        }
    }
}

User.java (Parcelable)

package com.example.intentdata;

import android.os.Parcel;
import android.os.Parcelable;

public class User implements Parcelable {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    protected User(Parcel in) {
        name = in.readString();
        age = in.readInt();
    }

    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel in) {
            return new User(in);
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
    }
}

MainActivity.java (发送 Parcelable 对象)

package com.example.intentdata;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button buttonSendObject = findViewById(R.id.buttonSendObject);

        buttonSendObject.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                User user = new User("John Doe", 30);
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                intent.putExtra("EXTRA_USER", user);
                startActivity(intent);
            }
        });
    }
}

SecondActivity.java (接收 Parcelable 对象)

package com.example.intentdata;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        TextView textView = findViewById(R.id.textView);
        Intent intent = getIntent();
        User user = intent.getParcelableExtra("EXTRA_USER");
        if (user != null) {
            textView.setText("Name: " + user.getName() + ", Age: " + user.getAge());
        }
    }
}

4. 使用 Bundle 传递数据

Bundle 可以用来组织和传递一组键值对数据。

MainActivity.java (使用 Bundle)

package com.example.intentdata;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    private EditText editTextName;
    private EditText editTextAge;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editTextName = findViewById(R.id.editTextName);
        editTextAge = findViewById(R.id.editTextAge);
        Button buttonSendWithBundle = findViewById(R.id.buttonSendWithBundle);

        buttonSendWithBundle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name = editTextName.getText().toString();
                int age = Integer.parseInt(editTextAge.getText().toString());

                User user = new User(name, age);
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);

                Bundle bundle = new Bundle();
                bundle.putParcelable("EXTRA_USER", user);
                intent.putExtras(bundle);

                startActivity(intent);
            }
        });
    }
}

activity_main.xml (添加更多输入字段)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/editTextName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter your name"/>

    <EditText
        android:id="@+id/editTextAge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter your age"
        android:inputType="number"/>

    <Button
        android:id="@+id/buttonSendWithBundle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send with Bundle"
        android:layout_marginTop="16dp"/>
</LinearLayout>

SecondActivity.java (接收 Bundle 数据)

package com.example.intentdata;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        TextView textView = findViewById(R.id.textView);
        Intent intent = getIntent();

        Bundle bundle = intent.getExtras();
        if (bundle != null) {
            User user = bundle.getParcelable("EXTRA_USER");
            if (user != null) {
                textView.setText("Name: " + user.getName() + ", Age: " + user.getAge());
            }
        }
    }
}

5. 传递数组或集合

你可以通过 putExtra() 方法传递数组或集合。

MainActivity.java (传递数组)

package com.example.intentdata;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button buttonSendArray = findViewById(R.id.buttonSendArray);

        buttonSendArray.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String[] items = {"Item 1", "Item 2", "Item 3"};
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                intent.putExtra("EXTRA_ITEMS", items);
                startActivity(intent);
            }
        });
    }
}

activity_main.xml (添加按钮)

<Button
    android:id="@+id/buttonSendArray"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Send Array"
    android:layout_marginTop="16dp"/>

SecondActivity.java (接收数组)

package com.example.intentdata;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        TextView textView = findViewById(R.id.textView);
        Intent intent = getIntent();

        String[] items = intent.getStringArrayExtra("EXTRA_ITEMS");
        if (items != null) {
            StringBuilder sb = new StringBuilder();
            for (String item : items) {
                sb.append(item).append("\n");
            }
            textView.setText(sb.toString());
        }
    }
}

6. 传递 URI

你可以通过 Intent 传递文件的 URI,例如打开图片或视频文件。

MainActivity.java (传递 URI)

package com.example.intentdata;

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button buttonOpenImage = findViewById(R.id.buttonOpenImage);

        buttonOpenImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Uri imageUri = Uri.parse("content://path/to/image.jpg");
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setDataAndType(imageUri, "image/*");
                startActivity(intent);
            }
        });
    }
}

activity_main.xml (添加按钮)

<Button
    android:id="@+id/buttonOpenImage"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Open Image"
    android:layout_marginTop="16dp"/>

总结

通过上述示例,你可以看到如何在不同的 Activity 之间传递各种类型的数据。以下是一些关键点:

  • 基本数据类型:可以直接使用 putExtra() 和相应的 getXXXExtra() 方法。
  • 自定义对象:需要实现 SerializableParcelable 接口。
  • Bundle:可以用来组织和传递一组键值对数据。
  • 数组或集合:可以通过 putExtra() 方法传递。
  • URI:可以传递文件的 URI 以便其他应用打开文件。

希望这些示例能帮助你更好地理解和使用 Intent 在 Android 中传递数据。如果你有更多具体的问题或需要进一步的细节,请随时提问!

举报

相关推荐

0 条评论