将服务中的数据发送回我的活动

时间:2011-01-27 23:20:54

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

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

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

我可以这样做?

我尝试在我的服务上创建一个intent并使用sendBroadcast()进行广播。我有一个关于活动的broadcastReceiver,但我不确定我是否正确注册。我糊涂了!

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

3 个答案:

答案 0 :(得分:5)

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

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

/**
 * 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 );

希望有所帮助

答案 1 :(得分:0)

你可以做我知道的这三件事:

  1. 您可以创建一个Intent并将数据放入Intent并启动该活动-----糟糕的想法
  2. 您可以使用SharedPreferences传递值 - 仅适用于原始值
  3. 您可以使用静态变量------我认为这是从服务传递的最佳方式。
  4. 注意:  你也可以使用DB,如果你拥有大量数据,那就很好。

答案 2 :(得分:0)

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

其次,您使用onNewIntent()开始活动。如果活动已经在运行,这将使活动无法启动。

第三,您在活动中实施c以捕获服务在您的活动已经运行时发送的任何意图。