我在一项服务中创建了一个广播接收器(BR),它将对具有特定编号和正文的传入SMS做出反应。我只需要它在用户操作后几秒钟/分钟就可以收到,这就是为什么我没有在清单或活动中注册它(用户可以关闭它)的原因。 BR有两个部分,自动部分(可以正常工作)和手动部分,应启动MainActivity
并启动Dialog
。我知道无法从BR启动Dialog
,这就是为什么我创建了Listener
的原因,但是我的问题是服务启动后总是null
。它在我的onCreate
的{{1}}中具有价值,但是当服务启动时,它更改为MainActivity
,并且我理解为什么(服务重新初始化null
)。我什至尝试将初始化的侦听器值放入SharedPrefs并在之后将其还原,但是当我尝试使用json存储它时,它仅再次存储了null。
那么我该如何制作Listener listener
???这些是我代码的相关部分:
MainActivity
listener != null
SMSService
onCreate {
SMSService smsReceiver = new SMSService();
smsReceiver.setListener(new SMSService.Listener() { //here listener from service is != null
@Override
public void onTextReceived(String s) {
dialogS(s); // totaly different dialog
}
});
...
mDialogBuilder = new AlertDialog.Builder(this);
...
.setPositiveButton(new OnClick...
Intent servisIntent = new Intent(MainActivity.this, SMSService.class);
startService(servisIntent);
...
}
顺便说一句,在调用private Listener listener; // and here it get null which is the problem
public int onStartCommand(Intent intent, int flags, int startId) {
...
SMSReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, MainActivity.class);
context.startActivity(i);
if (listener != null) {
listener.onTextReceived("4333");
}
}
void setListener(Listener listener) {
this.listener = listener; }
interface Listener {
void onTextReceived(String text);
}
之后,我还尝试将smsReceiver.setListener
代码块放入我的Dialog
.setPossitive onClickListener
中,希望它能在服务后启动,但是什么也没做
答案 0 :(得分:1)
在服务中使用setter方法安装侦听器机制是不好的做法。您可以使用ResultReceiver从服务接收回调结果。它是Parcelable,因此可以在服务启动之前按意图传递它