不要销毁绑定的Service on Activity destroy

时间:2016-03-20 17:21:32

标签: java android android-activity service

目前,我需要绑定(音乐)服务,因为我需要与之互动。但我也希望它不被停止,即使所有组件都已自行解除。

正如Android Developer Guide所说

  

“[...]多个组件可以立即绑定到服务,但是当所有组件解除绑定时,服务就会被破坏。”

指南也说

  

“[...]您的服务可以双向工作 - 它可以启动(无限期运行)并允许绑定。”

在我的应用程序中,服务在应用程序启动时启动。 我想只通过用户点击我在自定义通知中显示的关闭按钮来销毁此服务。但是目前,当我破坏我的MainActivity时,服务也会停止。

这就是我现在的位置,当我想创建我的服务时会调用它:

public void createServiceConnection(){
     musicConnection = new ServiceConnection(){
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            MusicService.MusicBinder binder = (MusicService.MusicBinder)service;
            musicSrv = binder.getService();
            attachMusicService();
        }
    };
}

......这称之为:

public void attachMusicService(){
    playerFragment.setMusicService(musicSrv);
    musicSrv.attach(context); //need this for my listeners, nevermind
    bindService(context);
}

......这称之为:

    public void bindService(Context act){
        if(playIntent==null){
            playIntent = new Intent(act, MusicService.class);
            act.startService(playIntent);

            act.bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE);
        }else{
            act.startService(playIntent);
            act.bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE);
        }

//finished. I can do stuff with my Service here.
    }

我误解了什么吗? 我觉得服务应该继续运行,即使活动被破坏,因为我首先开始服务然后绑定它。

2 个答案:

答案 0 :(得分:0)

从自定义应用程序类绑定到您的服务。我不认为你可以在绑定到它的活动被破坏后(当调用onDestroy时)保持服务。如果活动通过从服务

调用startForeground暂停(onPause),则可以使服务保持活动状态

答案 1 :(得分:0)

似乎代码是正确的。

根据http://docs.sequelizejs.com/en/latest/docs/querying/#where我发现我的问题是我显示的通知,非常有趣

似乎为无限期运行而创建的服务需要通过 /* $DB_SERVER="db_server_name"; $DB_USER_READER="root"; $DB_PASS_READER="passw*rd"; $DB_NAME="db_name"; $DB_PORT="port number"; $SELECT_WHAT="`name_of_column_as_in_your_table`"; $WHICH_TBL="`table_name`"; $ON_WHAT_CONDITION="`id`='7'"; */ $con = mysqli_connect($DB_SERVER, $DB_USER_READER, $DB_PASS_READER, $DB_NAME, $DB_PORT);//this is the unique connection for the selection mysqli_set_charset( $con, 'utf8'); $slct_stmnt = "SELECT ".$SELECT_WHAT." FROM ".$WHICH_TBL." WHERE ".$ON_WHAT_CONDITION; $slct_query = mysqli_query($con, $slct_stmnt); if ($slct_query==true) { //Do your stuff here . . . } 显示通知。

我之前用startForeground(NOTIFY_ID, notification);显示了我的通知,现在我已经

notificationmanager.notify(NOTIFY_ID, notification);

并且在我的所有绑定活动都被销毁后,服务将不再停止。