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

如何向继承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,确保能收到广播:

  1. 创建自定义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);
    }
}
  1. 在AndroidManifest.xml中配置这个Application:
<application
    android:name=".MyApp"
    <!-- 其他原有配置 -->
>
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:07:33