如何将数据从 Main activity 传递到另一个 activity

How to pass data from Main activity to another activity

我想将用户输入的姓名和号码传递到我的 android 应用程序中的 FakeRinger class。我在 fab.setOnClickListener 的意图上使用了 putExtra() 方法。这是我在 MainActivity

中使用的代码
public class MainActivity extends AppCompatActivity {

    public static final String LOG_TAG = "MainActivity";

    ImageView imageView;
    EditText number, name;
    Button setTimeButton;
    FloatingActionButton fab;
    Calendar calendar;
    long selectedTimeInMillis;
    TimePickerDialog timePicker;
    String enteredName, enteredNumber;
    Intent intent;

    private static final int SELECT_IMAGE = 100;

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

        PreferenceManager.setDefaultValues(this, R.xml.settings, false);

        imageView = findViewById(R.id.image_view);
        setTimeButton = findViewById(R.id.set_time);
        fab = findViewById(R.id.floatingActionButton);

        number = findViewById(R.id.number);
        name = findViewById(R.id.name);

        enteredName = name.getText().toString().trim();
        enteredNumber = number.getText().toString().trim();

        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent galleryIntent = new Intent(Intent.ACTION_PICK);
                galleryIntent.setType("image/*");
                startActivityForResult(galleryIntent, SELECT_IMAGE);
            }
        });

        setTimeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                calendar = Calendar.getInstance();
                int hour = calendar.get(Calendar.HOUR_OF_DAY);
                int minute = calendar.get(Calendar.MINUTE);
                timePicker = new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
                    @Override
                    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                        calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
                        calendar.set(Calendar.MINUTE, minute);
                        calendar.set(Calendar.SECOND, 0);
                        calendar.set(Calendar.MILLISECOND, 0);
                        selectedTimeInMillis = calendar.getTimeInMillis();

                        if (hourOfDay > 12) {
                            hourOfDay = hourOfDay - 12;
                        }

                        if (minute < 10) {
                            String minuteStr = "0" + String.valueOf(minute);
                            minute = Integer.parseInt(minuteStr);
                            Log.v(LOG_TAG, "minute is :" + minute);
                        }

                        Toast.makeText(MainActivity.this, hourOfDay + ":" + minute, Toast.LENGTH_SHORT).show();

                        Log.v(LOG_TAG, "Selected time in millis:" + selectedTimeInMillis);
                    }
                }, hour, minute, false);
                timePicker.show();
            }
        });

        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                intent = new Intent(MainActivity.this, AlarmReciever.class);
                intent.putExtra("FAKE_NAME", enteredName);
                intent.putExtra("FAKE_NUMBER", enteredNumber);
                PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);
                AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                if (alarmManager != null) {
                    alarmManager.set(AlarmManager.RTC_WAKEUP, selectedTimeInMillis, pi);
                    Toast.makeText(MainActivity.this, "Your call has been placed", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(MainActivity.this, "Error: something wrong", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.settings:
                Intent intent = new Intent(MainActivity.this, SettingsActivity.class);
                startActivity(intent);
                return true;

            case R.id.quick_call:
                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == RESULT_OK) {
            try {
                Uri imageUri = data.getData();
                InputStream imageStream = null;
                if (imageUri != null) {
                    imageStream = getContentResolver().openInputStream(imageUri);
                }
                Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
                imageView.setImageBitmap(selectedImage);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                Toast.makeText(this, "Something went wrong", Toast.LENGTH_SHORT).show();
            }

        } else {
            Toast.makeText(this, "You haven't picked Image", Toast.LENGTH_SHORT).show();
        }
    }
}

这是我的BroadcastReceiverclass

public class AlarmReciever extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String getFakeName = intent.getStringExtra("FAKE_NAME");
        String getFakeNumber = intent.getStringExtra("FAKE_NUMBER");

        Intent fakeRinger = new Intent();
        fakeRinger.setClassName("com.example.mani.fakecall", "com.example.mani.fakecall.FakeRinger");
        fakeRinger.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        fakeRinger.putExtra("USER_FAKE_NAME", getFakeName);
        fakeRinger.putExtra("USER_FAKE_NUMBER", getFakeNumber);
        context.startActivity(fakeRinger);

        Log.v("Yes, we are in", "Alarm reciever");
        Log.v("fake name is: ", getFakeName);
        Log.v("fake number is: ", getFakeNumber);
    }
}

这是我的 FakeRinger Activity

public class FakeRinger extends AppCompatActivity {

    TextView displayName;
    TextView displayNumber;
    Button alarmOffButton;

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

        displayName = findViewById(R.id.display_name);
        displayNumber = findViewById(R.id.display_number);

        String callName = getFakeName();
        String callNumber = getFakeNumber();

        displayName.setText(callName);
        displayNumber.setText(callNumber);

        alarmOffButton = findViewById(R.id.alarm_off);
        alarmOffButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });
    }

    private String getFakeName(){
        String contactName = null;
        Intent i = getIntent();
        Bundle bundle = i.getExtras();
        if (bundle != null) {
            contactName = bundle.getString("USER_FAKE_NAME");
        }
        return contactName;
    }

    private String getFakeNumber(){
        String contactNumber = null;
        Intent i = getIntent();
        Bundle bundle = i.getExtras();
        if (bundle != null) {
            contactNumber = bundle.getString("USER_FAKE_NUMBER");
        }
        return contactNumber;
    }
}

我仍然无法显示用户在 FakeRinger activity 中输入的姓名和号码。谁能告诉我哪里做错了?

您需要将这两行移动到 FAB 点击监听器中

enteredName = name.getText().toString().trim();
enteredNumber = number.getText().toString().trim();

在您当前拥有它们的地方,布局是空的,并且您永远不会将这些字符串分配给其他任何内容。

如果您没有看到来自 AlarmReciever 的日志,那么无论如何都不会将任何内容传递给下一个 activity