Android活动与IntentService的通信

Android活动与IntentService的通信,android,intentservice,localbroadcastmanager,Android,Intentservice,Localbroadcastmanager,我需要在我的活动和正在运行的IntentService之间进行双向通信 场景是这样的:应用程序可以安排运行时的警报,启动一个IntentService,从web获取一些数据并进行处理。IntentService完成时有三种可能的情况: 应用程序处于焦点,这意味着当IntentService完成时,应用程序需要使用新数据刷新其视图 该应用程序在IntentService完成工作后关闭并打开,因此该应用程序将可以访问已处理的数据 应用程序在IntentService运行时打开,在这种情况下,我需要从

我需要在我的活动和正在运行的IntentService之间进行双向通信

场景是这样的:应用程序可以安排运行时的警报,启动一个IntentService,从web获取一些数据并进行处理。IntentService完成时有三种可能的情况:

  • 应用程序处于焦点,这意味着当IntentService完成时,应用程序需要使用新数据刷新其视图

  • 该应用程序在IntentService完成工作后关闭并打开,因此该应用程序将可以访问已处理的数据

  • 应用程序在IntentService运行时打开,在这种情况下,我需要从活动中找到一种方式来询问IntentService是否在后台执行某些操作
  • 1。我已经在我的活动中实现了一个BroadcastReceiver,它已在LocalBroadcastManager中注册。IntentService完成工作后,会发送广播,活动会做出反应。这个很好用

    两个人。没有什么需要做的

    三个人。我不知道该怎么办。到目前为止,我已经尝试过:

    在活动中:

    LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent(BROADCAST_SEND_TO_SERVICE));
    
    在职

    private LocalBroadcastManager localBroadcastManager;
        private BroadcastReceiver broadcastReceiverService = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (intent.getAction().equals(BROADCAST_SEND_TO_SERVICE)) {
                   //does not reach this place
                   //Send back a broadcast to activity telling that it is working
                }
            }
        };
    
      @Override
        protected void onHandleIntent(Intent intent) {
    
    
            localBroadcastManager = LocalBroadcastManager.getInstance(context);
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction(BROADCAST_SEND_TO_SERVICE);
            localBroadcastManager.registerReceiver(broadcastReceiverService, intentFilter);
    .... //do things
    
    }
    
    我的实现的问题是,在IntentService中,BroadcastReceive不会在接收时触发。有什么建议或更简单的方式让活动询问IntentService正在做什么吗

    乐: 试图得到原子布尔。 在职:

    public static AtomicBoolean isRunning = new AtomicBoolean(false);
    
     @Override
        protected void onHandleIntent(Intent intent) {
            isRunning.set(true);
            // do work
            // Thread.sleep(30000)
            isRunning.set(false);
    }
    
    在“活动”中,在服务运行时重新启动应用程序:

        Log(MyIntentService.isRunning.get());
    
    //this returns always false, even if the intent service is running
    
    关于AndroidManifest

     <service
                android:name=".services.MyIntentService"
                android:exported="false" />
    
    
    
    1。您可以在应用程序级别维护一个标志,该标志将通过意图服务获得true和false。2.您还可以在SharedReferenceswitch中维护从
    LocalBroadcastManager
    到greenrobot的EventBus的值,并使用粘性事件指示当前状态。或者,如果您的需求有限,可以使用一个简单的
    AtomicBoolean
    (或其他一些原子包装器)作为
    静态
    字段。YourIntentService.BROADCAST\u SEND\u TO\u服务和HomeActivity.BROADCAST\u SEND\u TO\u服务字符串是否相等?从您的示例代码来看,您可能在两个类中都定义了这个字符串变量。@JanusVarmarken yes是相同的,我已经编辑了这个问题。@Commonware我想知道为什么LocalBroadcastManger可以从一个服务工作到另一个活动,而不能从另一个角度工作?我需要看看AtomicBoolean,因为我以前从未使用过它