Seervice使用总结

服务安卓的4大组件之一

服务的启动有两种方式:第一种startService启动和stopService关闭,这种启动方式访问者无法和服务进行通讯,交换数据,这种启动方式不会随着访问者的关闭而关闭。第二种是bindService绑定启动和unBindService接触绑定并关闭,这种访问者和服务之间可以通过IBinder接口进行通讯。

使用1 startService

定义一个Service,清单文件注册,启动关闭服务


public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Intent intent = new Intent(MainActivity.this, MyService.class);
        findViewById(R.id.btn_start_service).setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                MainActivity.this.startService(intent);
            }
        });
        findViewById(R.id.btn_stop_service).setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                MainActivity.this.stopService(intent);
            }
        });
        findViewById(R.id.btn_close_activity).setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                MainActivity.this.finish();
            }
        });
    }
}
public class MyService extends Service {


    @Override
    public void onCreate() {
        super.onCreate();
        Log.v("PDA", "onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.v("PDA", "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        Log.v("PDA", "onDestroy");
        super.onDestroy();
    }
}
这是多次启动服务的日志记录,可以得知,多次调用startservice只有第一次会调用oncreate和onstartcommand


启动成功后不进行关闭服务,直接finish   Activity 在系统中查看应用程序的服务并没有被关闭,仍然处于运行状态

当我们点击关闭服务系统就会将启动的服务进行关闭,再看手机后台则可以看到服务已经关闭。


使用2 bindService绑定服务

绑定服务

bindService(intent, connection, Context.BIND_AUTO_CREATE);

Intent 是指定打开服务的意图,connction是ServiceConnection,在该对象中有访问者和服务之间的连接状态的回调,Context.BIND_AUTO_CREATE是flags是指定绑定时是否自动创建Service(若Service未创建),可指定0不自动创建,BIND_AUTO_CREATE自动创建。

ServiceConnection:当访问者和Service之间连接成功时将回调onServiceConnected方法,当Service所在的宿主进程由于异常中止或其他原因终止,导致Service与访问者之间断开连接时回调该ServiceConnection对象的onServiceDisconnected方法

public class MyBinder extends Binder {

    public int add(int one, int two) {
        return one + two;
    }
}
public class MyService extends Service {

    private MyBinder binder;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.v("PDA", "onCreate");
        binder = new MyBinder();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.v("PDA", "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.v("PDA", "onBind");
        return binder;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.v("PDA", "onUnbind");
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.v("PDA", "onDestroy");
    }
}

public class MainActivity extends AppCompatActivity {

    private MyBinder binder;
    private Button btn_tongxun;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Intent intent = new Intent(MainActivity.this, MyService.class);
        findViewById(R.id.btn_start_service).setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                MainActivity.this.startService(intent);
            }
        });
        findViewById(R.id.btn_stop_service).setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                MainActivity.this.stopService(intent);
            }
        });
        findViewById(R.id.btn_close_activity).setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                MainActivity.this.finish();
            }
        });
        final ServiceConnection connection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
                binder = (MyBinder) iBinder;
            }

            @Override
            public void onServiceDisconnected(ComponentName componentName) {

            }
        };
        findViewById(R.id.btn_bind_service).setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                bindService(intent, connection, Context.BIND_AUTO_CREATE);
            }
        });
        findViewById(R.id.btn_unbind_service).setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                unbindService(connection);
            }
        });
        btn_tongxun = (Button) findViewById(R.id.btn_tongxun);
        btn_tongxun.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                btn_tongxun.setText(binder.add(1, 2) + "");
            }
        });
    }
}

绑定服务bindservice调用的是下面的方法,多次点击不会出重复调用

06-12 18:02:15.637 26543-26543/androidpos.zy.com.servicetest V/PDA: onCreate

06-12 18:02:15.639 26543-26543/androidpos.zy.com.servicetest V/PDA: onBind

不解除绑定就关闭Activity,会报错,但服务会关闭,日志是


解除绑定的日志:

06-12 18:14:28.716 12148-12148/androidpos.zy.com.servicetest V/PDA: onUnbind

06-12 18:14:28.717 12148-12148/androidpos.zy.com.servicetest V/PDA: onDestroy

绑定的形式的话销毁activity时必须解除绑定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值