如何向继承BroadcastReceiver的类传递数据?
解决在BroadcastReceiver类中传递/获取字符串值的问题
你其实完全可以在SMSRecevir(建议改成SMSReceiver,符合Java命名规范)里使用SharedPreferences、注册广播接收器或者借助自定义Application类来获取目标值,之前的误区完全没必要,下面给你几种可行的落地方案:
方案一:用SharedPreferences持久化存储(最省心的方案)
把需要传递的手机号存在SharedPreferences里,在SMSReceiver里直接读取即可,这种方式不受组件生命周期影响,非常稳定。
步骤1:在Firstlog中保存手机号到SharedPreferences
修改你按钮点击的逻辑,加上存储代码:
B11.setOnClickListener( new View.OnClickListener() { public void onClick(View view) { String nb = mEdit.getText().toString(); nnb=nb; Log.v("EditText value=",mEdit.getText().toString()); // 保存手机号到SharedPreferences SharedPreferences sp = getSharedPreferences("MyAppSettings", MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); editor.putString("target_phone", nb); editor.apply(); // 异步提交,比commit更高效 Intent my2 = new Intent(Firstlog.this,MapsActivity.class); my2.putExtra("fnb",nnb); startActivity(my2); } });
步骤2:在SMSReceiver中读取SharedPreferences
在SMSReceiver的onReceive方法开头读取存储的值:
@Override public void onReceive(Context context, Intent intent) { // 从SharedPreferences读取目标手机号 SharedPreferences sp = context.getSharedPreferences("MyAppSettings", Context.MODE_PRIVATE); phonenumb = sp.getString("target_phone", ""); // 第二个参数是默认值,为空字符串 if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { // 你的原有短信处理逻辑... String replyPhone = msgs[0].getOriginatingAddress(); if (replyPhone.equals(phonenumb)){ // 匹配到目标手机号,执行后续操作 } } }
方案二:修复你的LocalBroadcastReceiver实现
你已经尝试用LocalBroadcast,但问题是SMSRecevir里定义的mReceiver从来没注册过,所以收不到广播。这里给你补全正确的注册逻辑:
步骤1:保留Firstlog中的广播发送代码
你的原有发送逻辑没问题,可以继续用:
Intent intent = new Intent("INTENT_NAME").putExtra("fgivnb",nnb); LocalBroadcastManager.getInstance(Firstlog.this).sendBroadcast(intent);
步骤2:在自定义Application中注册LocalBroadcastReceiver
因为BroadcastReceiver本身是短生命周期组件,推荐在Application类里注册全局的LocalReceiver,确保能收到广播:
- 创建自定义Application类:
public class MyApp extends Application { private BroadcastReceiver mLocalReceiver; private String targetPhone; // 全局存储手机号 @Override public void onCreate() { super.onCreate(); // 注册LocalBroadcastReceiver mLocalReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if ("INTENT_NAME".equals(intent.getAction())) { targetPhone = intent.getStringExtra("fgivnb"); } } }; LocalBroadcastManager.getInstance(this) .registerReceiver(mLocalReceiver, new IntentFilter("INTENT_NAME")); } // 提供全局获取手机号的方法 public String getTargetPhone() { return targetPhone; } @Override public void onTerminate() { super.onTerminate(); // 退出时解绑接收器,避免内存泄漏 LocalBroadcastManager.getInstance(this).unregisterReceiver(mLocalReceiver); } }
- 在AndroidManifest.xml中配置这个Application:
<application android:name=".MyApp" <!-- 其他原有配置 --> >
- 在SMSReceiver中获取全局手机号:
@Override public void onReceive(Context context, Intent intent) { // 从Application中获取目标手机号 phonenumb = ((MyApp)context.getApplicationContext()).getTargetPhone(); // 你的原有短信处理逻辑... }
注意事项
- 处理短信务必确保权限齐全:在AndroidManifest.xml中添加
<uses-permission android:name="android.permission.RECEIVE_SMS"/>,Android 6.0及以上还要动态申请这个权限 - 如果需要在用户退出APP后清除存储的手机号,可以在合适的时机调用
sp.edit().remove("target_phone").apply() - 类名、变量名尽量遵循Java命名规范,比如
SMSRecevir改成SMSReceiver,phonenumb改成targetPhone,方便后续维护
内容的提问来源于stack exchange,提问作者Varuna Lakshan
相关产品推荐
相关产品推荐

