You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发:如何将UI元素的值传递至另一个类

用SharedPreferences实现UI值到BroadcastReceiver的传递方案

嗨,我来帮你把这个流程梳理得明明白白!你选SharedPreferences来传递这个简单的字符串数据完全没问题,这是Android跨组件传递轻量数据的常用方案,接下来咱们一步步来实现:

第一步:在MainActivity中读取UI输入并保存到SharedPreferences

首先你需要在MainActivity里获取用户输入的设备号码(比如从EditText控件),然后写入SharedPreferences。这里给你一个完整的示例代码:

public class MainActivity extends AppCompatActivity {
    private EditText etDevicePhoneNumber;
    private Button btnSaveNumber;

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

        // 绑定UI控件
        etDevicePhoneNumber = findViewById(R.id.et_device_phone_number);
        btnSaveNumber = findViewById(R.id.btn_save_number);

        // 给保存按钮设置点击事件
        btnSaveNumber.setOnClickListener(v -> {
            String inputNumber = etDevicePhoneNumber.getText().toString().trim();
            // 先校验输入是否为空(也可以加手机号格式校验)
            if (!inputNumber.isEmpty()) {
                // 获取全局默认的SharedPreferences实例
                SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
                // 开启编辑模式
                SharedPreferences.Editor editor = prefs.edit();
                // 存入键值对
                editor.putString("devicePhoneNumber", inputNumber);
                // 异步保存(推荐用apply(),比同步的commit()更高效)
                editor.apply();
                // 给用户一个反馈
                Toast.makeText(this, "设备号码已保存", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "请输入有效的设备号码", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

第二步:确认SmsReceiver中的读取逻辑正确性

你现在写的SmsReceiver代码已经能正确读取SharedPreferences里的值了,不过可以稍微优化一下,增加对默认值的判断,避免后续逻辑出错:

public class SmsReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 其他无关代码
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
        // 获取保存的号码,没有的话返回"DEFAULT"
        String deviceNumber = prefs.getString("devicePhoneNumber", "DEFAULT");
        Log.d("Device Number","Device number: " + deviceNumber);
        
        // 可以在这里判断是否是默认值,再执行后续业务
        if (!"DEFAULT".equals(deviceNumber)) {
            // 比如用这个号码做短信相关处理
        }
    }
}

几个关键注意事项

  • 权限与注册:如果你的SmsReceiver是静态注册的,记得在AndroidManifest.xml里声明接收器和权限:

    <!-- 申请接收短信权限 -->
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    
    <!-- 注册SmsReceiver -->
    <receiver android:name=".SmsReceiver">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>
    

    注意:Android 6.0及以上版本,RECEIVE_SMS属于危险权限,需要在代码中动态申请权限,不然接收器可能无法正常工作。

  • SharedPreferences模式:PreferenceManager.getDefaultSharedPreferences()默认使用MODE_PRIVATE模式,这意味着只有你的应用能访问这些数据,安全性有保障,完全符合你的需求。

  • 数据有效性:建议在保存前对用户输入的手机号做格式校验(比如正则表达式判断是否是合法手机号),避免存入无效数据影响后续逻辑。

内容的提问来源于stack exchange,提问作者david

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:37:16