来自服务侦听器的广播接收器

时间:2018-08-02 16:39:53

标签: android service broadcastreceiver listener

我在一项服务中创建了一个广播接收器(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中,希望它能在服务后启动,但是什么也没做

1 个答案:

答案 0 :(得分:1)

在服务中使用setter方法安装侦听器机制是不好的做法。您可以使用ResultReceiver从服务接收回调结果。它是Parcelable,因此可以在服务启动之前按意图传递它