android - 如何在通知点击时在 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。
如果有更好的方法来实现我希望实现的场景,我们非常欢迎提出建议。
提前致谢 :)
解决方案
您正在尝试调用已被销毁的 Activity 的函数。
如果您想通过 BroadcastReceiver 与您的活动进行通信,请使用 Intent。
以您的 Activity 作为目标创建一个新 Intent,并将消息作为 Intent Extras Bundle 中的 Extra 发送。
在您的活动中,您可以设置launchMode
为singleInstance
或singleTask
在您的清单文件中。这意味着如果 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
推荐阅读
- c++ - 为什么我的交互式容器应用程序会自动输入
- r - 分类树的 R 问题
- apache-spark - 如何限制 Jupyter Notebook 的 PySpark 集群上的资源?
- android - 为什么相机不颤抖打开?
- visual-studio - VS Debugger 是否有任何脚本支持,类似于 GDB 的脚本?
- javascript - 在js或jquery中点击广告时调用函数
- php - 如何在一列php中对子数组进行分组
- php - 如何通过 PHP 生成 {0} json 字符串?
- javascript - JS React 导入差异包大小
- javascript - Sensortower daterangepicker 设置期间的最小值最大值