代码之家  ›  专栏  ›  技术社区  ›  Nemanja

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

  •  0
  • Nemanja  · 技术社区  · 6 年前

    我在一个服务中创建了一个广播接收器(BR),它将对带有特定号码和正文的传入短信做出反应。我只需要在用户操作后接收几秒钟/分钟,这就是为什么我没有在清单或活动中注册它(用户可能会关闭它)。BR有两个部分,自动(工作正常)和手动(应该启动) MainActivity 开始一个 Dialog . 我知道 对话 不能从BR开始,所以我创建了 Listener ,但我的问题是 null 服务开始后。它有价值 onCreate 我的 主要活动 ,但当服务启动时,它将更改为 无效的 ,我明白为什么(serivce重新初始化 Listener listener ). 我甚至尝试将初始化的侦听器值放入SharedPrefs并在之后还原它,但是当我尝试用json存储它时,它只会再次存储空值。
    那我该怎么做 listener != null ??? 以下是我的代码的相关部分:

    主要活动

    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);
    ...
    
    }
    

    SMS服务

    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 我的代码块 对话 .setPossitive onClickListener 打电话之后 startService 希望它能在服务结束后启动

    1 回复  |  直到 6 年前
        1
  •  1
  •   Akaki Kapanadze    6 年前

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