【问题标题】: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】:
据我所知,你可以做这三件事:
- 您可以创建一个 Intent 并将数据放入 Intent 并启动该活动 ----- 坏主意
- 您可以使用 SharedPreferences 来传递值——仅适用于原始值
- 您可以使用静态变量 ------ 我认为这是从服务传递的最佳方式。
注意:
如果你有大量数据,你也可以使用数据库。
【解决方案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() 以捕获服务发送的任何意图。