同时使用两种方式启动服务

突然看到公司项目有个地方同时使用startService()和bindService()启动服务,做了个demo测试了一下,下面直接上代码:

Activity中:

package com.example.test3;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;

import com.example.service.ConnService;

public class ConnActivity extends Activity {

    private static final String tag = "ConnActivity";
    private MyServiceConnection mConn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_conn);

        bindServiceMothod();
    }

    private void bindServiceMothod() {
        Intent intent = new Intent(this, ConnService.class);
        mConn = new MyServiceConnection();
        startService(intent);
        bindService(intent, mConn, Context.BIND_AUTO_CREATE);
    }

    private class MyServiceConnection implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.i(tag, "====onServiceConnected----------------");

            ConnService.MyBinder myBinder = (ConnService.MyBinder) service;
            myBinder.sendMsg("我是Activity!");
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.i(tag, "====onServiceDisconnected----------------");
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(tag,"====onDestroy-----------------");
        if(mConn != null){
            unbindService(mConn);
        }
    }
}

Service中(记得在Manifest配置):

package com.example.service;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;

/**
 * user: uidq0530 ,date: 2017-04-05.
 * description:
 *
 * @author xhunmon
 */

public class ConnService extends Service {

    private static final String tag = "ConnService";

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.i(tag,"======onBind---------------------------");
        return new MyBinder();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(tag,"======onCreate---------------------------");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(tag,"======onStartCommand---------------------------");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.i(tag,"======onUnbind---------------------------");
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i(tag,"======onDestroy---------------------------");
    }

    public class MyBinder extends Binder{
        public void sendMsg(String str){
            Log.i(tag,"=====接受的数据为:"+str);
        }
    }
}

情况1,只是使用startService(),启动后退出,如下图:

image

情况2,只是使用bindService(),启动后退出,如下图:

image

情况3,同时使用用startService()和bindService(),启动后退出,如下图:

image

结论:当同时使用两个方法启动服务时,绑定的服务只是被解绑了,而没有被销毁!

Android中,Service两种启动方式,分别是通过`startService()``bindService()` [^1][^2]。 `startService()`启动方式主要用于执行后台计算。其生命周期特点为:`onCreate`,若service没有被创建过,调用`startService`时会执行该回调;若service已经在执行,调用`startService`则不会执行。`onStartCommand`,每次service创建或者运行时都会执行。`onBind()`,Service中的`onBind()`方法是抽象方法,Service类本身就是抽象类,所以`onBind()`方法必须重写,即便用不到。`onDestory()`,在销毁Service时会执行该方法。该方式启动Service,其生命周期activity的生命周期无关,用于启动一个后台任务,不进行通信,停止服务使用`stopService` [^1][^3]。 `bindService()`启动方式主要用于其它组件的交互。其生命周期activity绑定在一起,会受activity的生命周期的影响,当activity销毁时,service也会被销毁。该方式用于启动一个服务,可以与后台进行数据通信,停止服务用`unbindService`。service与activity的通信通过创建一个类继承`Binder`,`onBind`方法返回实现。若同时使用`startService``bindService`,停止服务时需同时使用`stopService``unbindService` [^1][^3]。 需要注意的是,这两种状态是可以共存的,即一个Service既可以处于启动状态,也可以同时处于绑定状态 [^1]。 ```java // startService示例 Intent startIntent = new Intent(context, MyService.class); context.startService(startIntent); // bindService示例 Intent bindIntent = new Intent(context, MyService.class); context.bindService(bindIntent, serviceConnection, Context.BIND_AUTO_CREATE); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值