与前台服务android通信
Posted
技术标签:
【中文标题】与前台服务android通信【英文标题】:Communicate with foreground service android 【发布时间】:2014-05-25 21:57:00 【问题描述】:这里是第一个问题,但我已经有一段时间了。
我有什么:
我正在构建一个播放音频流和在线播放列表的 android 应用。现在一切正常,但我在与我的服务通信时遇到问题。
音乐在服务中播放,从 startForeground 开始,所以它不会被杀死。
我需要通过我的活动与服务进行通信,以获取曲目名称、图像和其他一些内容。
我的问题是什么:
我认为我需要使用 bindService(而不是我当前的 startService)启动我的服务,以便活动可以与之对话。
但是,当我这样做时,我的服务会在关闭 Activity 后被终止。
我怎样才能两者兼得?绑定和前台服务?
谢谢!
【问题讨论】:
您是否尝试过为您的服务发出通知?我认为这应该有助于阻止它被杀死。 我的回答有帮助吗? 【参考方案1】:没有。 bindService
不会启动服务。它只会使用service connection
绑定到Service
,这样您就可以拥有服务的instance
来访问/控制它。
根据您的要求,我希望您将拥有 MediaPlayer
的实例 in service 。您也可以从Activity
启动服务,然后bind
它。如果service
已经在运行onStartCommand()
将被调用,并且您可以检查MediaPlayer
实例是否不为空,则只需返回START_STICKY
。
像这样改变你Activity
..
public class MainActivity extends ActionBarActivity
CustomService customService = null;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
// start the service, even if already running no problem.
startService(new Intent(this, CustomService.class));
// bind to the service.
bindService(new Intent(this,
CustomService.class), mConnection, Context.BIND_AUTO_CREATE);
private ServiceConnection mConnection = new ServiceConnection()
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder)
customService = ((CustomService.LocalBinder) iBinder).getInstance();
// now you have the instance of service.
@Override
public void onServiceDisconnected(ComponentName componentName)
customService = null;
;
@Override
protected void onDestroy()
super.onDestroy();
if (customService != null)
// Detach the service connection.
unbindService(mConnection);
我与MediaPlayer
service
有类似的应用程序。如果这种方法对您没有帮助,请告诉我。
【讨论】:
在我的情况下,如果我取消绑定我的服务。服务被杀死。因为绑定到它的唯一活动已关闭/离开视图。这是高度记录的。我正在为我的应用程序做一个下载器系统。但它会杀死服务。下载器完成后,我在服务中的某个地方调用了 stopSelf,因此我的服务根本不会永远运行。有什么想法吗? OP询问了ContextCompat.startForegroundService()
,这个答案只处理startService()
,也不处理AIDL。
请注意,bindService() 确实创建了服务,而无需调用 startService()。 developer.android.com/guide/components/services.html【参考方案2】:
引用Android documentation:
一旦所有客户端解除绑定,绑定的服务就会被销毁,除非该服务也已启动
而关于started和bound的区别就看https://developer.android.com/guide/components/services.html
因此,您必须使用startService
然后bindService
创建服务,就像@Libin 在他/她的示例中所做的那样。然后,该服务将一直运行,直到您使用 stopService
或 stopSelf
或直到 Android 决定它需要资源并杀死您。
【讨论】:
问题是,一旦 Activity 被销毁,绑定/启动的服务就会重新启动,对于音乐播放器来说,这意味着音乐中途重新启动 你在运行它in foreground吗? 它应该作为前台运行,而不是作为绑定/启动的服务以上是关于与前台服务android通信的主要内容,如果未能解决你的问题,请参考以下文章