【问题标题】:Send data from Service back to my activity将数据从服务发送回我的活动
【发布时间】:2011-06-16 22:13:06
【问题描述】:

我有一个创建意图的活动,使用 putExtra() 放置一些额外内容并调用 startService(intent) 来启动服务。

此服务会根据附加值计算一些内容,然后我想将结果发送回活动。

我可以通过什么方式做到这一点?

我尝试在我的服务上创建一个意图并使用 sendBroadcast() 广播它。我在活动中有一个广播接收器,但我不确定我是否正确注册它。我糊涂了!

还有其他方法吗?类似于 StartActivityForResult 的东西,但用于服务(类似于 StartServiceForResult 之类的东西)?

【问题讨论】:

    标签: android service android-activity android-intent communication


    【解决方案1】:

    据我所知,你可以做这三件事:

    1. 您可以创建一个 Intent 并将数据放入 Intent 并启动该活动 ----- 坏主意
    2. 您可以使用 SharedPreferences 来传递值——仅适用于原始值
    3. 您可以使用静态变量 ------ 我认为这是从服务传递的最佳方式。

    注意: 如果你有大量数据,你也可以使用数据库。

    【讨论】:

      【解决方案2】:

      您尝试使用的方法很好!没有代码虽然很难说你可能做错了什么。

      在您的服务中,您会广播这样的意图...

      /**
       * Send broadcast to the activity letting it know the service is active
       * 
       * @param pActivate
       */
      private final void sendServiceActiveBroadcast( final boolean pActivate ) {
          final Intent _intent = new Intent();
          _intent.setAction( "com.yourtld.android.SERVICE_BROADCAST" );
          _intent.addCategory( "com.yourtld.android.CATEGORY" );
          _intent.putExtra( "isactive", pActivate );
      
          this.sendBroadcast( _intent );
      }
      

      那么在您的活动中,您可能会有类似...

      创建一个动作字符串:

      private static final String SERVICE_BROADCAST_ACTION = "com.yourtld.android.SERVICE_BROADCAST";
      

      在您的 onResume() 方法中,您将拥有...

      final IntentFilter serviceActiveFilter = new IntentFilter( SERVICE_BROADCAST_ACTION );
      
      serviceActiveFilter.addCategory( "com.yourtld.android.CATEGORY" );
      
      this.serviceReceiver = new BroadcastReceiver() {
      
          @Override
          public void onReceive( final Context context, final Intent intent ) {
              if( intent != null ) {
                  if( intent.getBooleanExtra( "isactive", false ) ) {
                      // The service is active
                  } else {
                      // False...
                  }
              }
          }
      };
      this.registerReceiver( this.serviceReceiver, serviceActiveFilter );
      

      希望有帮助

      【讨论】:

        【解决方案3】:

        首先,您可以让服务将意图直接发送到活动。这样,即使 Activity 当前没有运行,它也会被启动。

        其次,您以FLAG_ACTIVITY_SINGLE_TOP 开始活动。如果 Activity 已经在运行,这会阻止它启动。

        第三,如果您的 Activity 已经在运行,您在 Activity 中实现 onNewIntent() 以捕获服务发送的任何意图。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-12-30
          • 1970-01-01
          • 2013-07-28
          • 2021-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多