首页 > 解决方案 > 如何在通知点击时在 BroadcastReceiver onReceive 中实现回调监听器?

问题描述

我正在创建一个在收到短信时发送通知的应用程序。点击通知时,它会打开 MainActivity 并显示收到的短信。问题是,当应用程序关闭并收到短信时,BroadcastReceiver 类的 onReceive 方法中的 mListener 会产生空指针异常 (NPE)。日志显示错误:“尝试在空对象引用上调用接口方法 'void com.example.smsread.listener.SmsListener.messageReceived(java.lang.String)'”。

我该怎么做才能将控件从 onReceive 传递给活动?

我可以在 onReceive 中执行发送通知的操作,但似乎不合适。我希望将消息传递给接口并让活动实现它。

短信接收器.java

public class SmsReceiver extends BroadcastReceiver {
    //interface
    private static SmsListener mListener;

    public static void bindListener(SmsListener listener) {
        mListener = listener;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        Object[] pdus = new Object[0];
        if (bundle != null) {
            pdus = (Object[]) bundle.get("pdus");
        }
        StringBuilder messageBody = new StringBuilder();

        if (pdus != null) {
            for (Object pdus1 : pdus) {
                SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdus1);

                messageBody.append(smsMessage.getMessageBody());
            }
        }
        //Pass the message text to interface
        mListener.messageReceived(messageBody.toString());    // mListener here is null
    }
}

我希望 mListener 将控制权传递给实现接口的 MainActivity,但发现 mListener 为空。请帮助了解必须进行哪些更改才能使 mListener 指向 MainActivity。

如果有更好的方法来实现我希望实现的场景,我们非常欢迎提出建议。

提前致谢 :)

标签: androidcallbackbroadcastreceiverlistenerandroid-notifications

解决方案


您正在尝试调用已被销毁的 Activity 的函数。

如果您想通过 BroadcastReceiver 与您的活动进行通信,请使用 Intent。

以您的 Activity 作为目标创建一个新 Intent,并将消息作为 Intent Extras Bundle 中的 Extra 发送。

在您的活动中,您可以设置launchModesingleInstancesingleTask在您的清单文件中。这意味着如果 Intent 已发送并且您的 Activity 已经打开,它将onIntent在您的 Activity 中调用函数,您将在其中调用侦听器函数。

android:launchMode="singleInstance"
@Override
 public void onNewIntent(Intent intent){
    super.onNewIntent(intent);
    processDataFromBroadcast(intent);
}

请务必阅读启动模式并singleInstance充分理解其含义,否则您可能会遇到意外行为:

https://developer.android.com/guide/components/activities/tasks-and-back-stack#ManifestForTasks


推荐阅读