以 bind 方式创建与绑定 Service实例

本文通过实例详细介绍了如何在Android中使用bindService方式创建和绑定Service,强调了bindService与startService的区别,并展示了如何在Activity中与Service进行通信。文章通过创建自定义的IBind接口和OnDataCallback数据回调接口,演示了如何在ServiceConnection的回调方法中获取并操作Service。同时,文中提到在非UI线程中修改UI元素需要注意的线程安全问题,提到了Handler机制的作用。
摘要由CSDN通过智能技术生成

通过前面的学习,可以发现使用 start方式开启 Service 非常简单,但是它有一个技大的弊端,没有办法与开启者进行通信。为了解决这个问题,我们一般会使用 bind方式来定 Service。以bind方式创建与绑定 Service 的步骤在之前也已讲述,此处将用一个实例来进行讲解。

1、创建一个继承Service 类的子类 MyService类,由于是采用 bind方式绑定Service, 因此 MyService 类与前文以start方式开启Service而创建的继承Service 类的子类有很大不同。

前文说过,采用此种方式绑定 Servce 时会回调 onBind()方法,此方法会返回一个IBind 类的对象。一般情况下,如果我们在某个Activity 中绑定了此 Service,就会从ServiceConnection 类 onServiceConnected(ComponentName name, IBinder service)方法中获取到 onBind()方法返回的IBind类的对象。Activity与Service可以进行通信,利用的就是这个IBind 类的对象。

所以,我们可以建立一个IBind类的子类,并在该类中封装 Service 对象,并在 onBind()方法中返回此类的对象。这样一来,在 Activity中就可以对 Service进行操作了。MyService类代码如下∶

package com.rfstar.servicetest2;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
public class MyService extends Service {
    private String message;
    private boolean isrunning = true;
    private IBinder binder = new MyBinder();
    private MyService.ServiceThread serviceThread=new MyService.ServiceThread();
    private Thread thread;

    @Override
    public IBinder onBind(Intent intent) {
        Log.i("service", "onBind");
        thread = new Thread(serviceThread);
        //开启一个线程
        thread.start();
        /**返回一个可以在Activity的onServiceConnected()方法中接收的binder对象
         * 它是Activity和Service通信的桥梁
         * 在Activity中通过这个bind对象可以得到Service的实例引用
         * 通过获取的Service实例就可以调用相关方法和属性
         */
        return binder;
    }

    @Override
    public void onCreate() {
        Log.i("service", "oncreate");
        super.onCreate();
    }

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

    @Override
    public boolean onUnbind(Intent intent) {
        Log.i("service", "onUnbind");
        return super.onUnbind(intent);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值