与前台服务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:

一旦所有客户端解除绑定,绑定的服务就会被销毁,除非该服务也已启动

而关于startedbound的区别就看https://developer.android.com/guide/components/services.html

因此,您必须使用startService 然后bindService 创建服务,就像@Libin 在他/她的示例中所做的那样。然后,该服务将一直运行,直到您使用 stopServicestopSelf 或直到 Android 决定它需要资源并杀死您。

【讨论】:

问题是,一旦 Activity 被销毁,绑定/启动的服务就会重新启动,对于音乐播放器来说,这意味着音乐中途重新启动 你在运行它in foreground吗? 它应该作为前台运行,而不是作为绑定/启动的服务

以上是关于与前台服务android通信的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何从活动活动中关闭前台活动?

Android 前台服务

Android 服务的限制

Android:(本地可通信的前台远程)Service使用全面介绍

android前台服务以及通知

Android,前台服务让app保持活力吗?