Android中Service的三种使用方式

   

 第一种

直接在客户端,一般是activity中调用startService()方法,传递一个Intent参数,将要传递的数据储存在intent中传递给Service即可,启动服务后会依次调用服务的一些生命周期的回调方法,其中在onStartCommand中执行我们想要服务执行的操作即可,在这个方法中我们可以获得客户端传递过来的Intent获得相关数据。
Service相关代码:
public class SimpleService extends Service { 
//绑定服务时才会调用 * 必须要实现的方法 
@Nullable
@Override 
public IBinder onBind(Intent intent) { 
    return null;
}
// 我们这里执行服务启动都要做的操作 
@Override public int onStartCommand(Intent intent, int flags, int startId) {
    System.out.println("onStartCommand invoke");
    return super.onStartCommand(intent, flags, startId);
}
// 服务销毁时的回调 
@Override public void onDestroy() {
    System.out.println("onDestroy invoke");
    super.onDestroy();
}
}

客户端主要代码:

Intent it=new Intent(this, SimpleService.class);
startService(it);

 

第二种

通过绑定服务的方式可以在客户端获得对应Service的引用,从而完成与Service的交互。主要过程如下图所示:
  • 首先,在继承Service类的自定义服务类中新建一个继承自IBinder的内部类,在IBinder中获得myService的引用;
  • 在服务的onBinder()方法中将service中的Ibinder对象处入(这个方法会在绑定服务成功的时候被调用,客户端可以通过这个方法获得IBinder对象,进而获得Service的引用);
  • 在客户端声明一个 ServiceConnection对象,在ServiceConnection对象的 onServiceConnected()(这个方法就是在绑定服务成功的时候调用的)可以获得服务中的IBinder对象;
  • 通过获得的IBinder对象获取Service引用,可以获取Service中的数据和方法。
Service相关代码:
public class LocalService extends Service{ 
    private LocalBinder binder = new LocalBinder();
    /** * 创建Binder对象,返回给客户端即Activity使用,提供数据交换的接口 */ 
    public class LocalBinder extends Binder { 
        // 声明一个方法,getService。(提供给客户端调用)
        LocalService getService() { 
            // 返回当前对象LocalService,这样我们就可在客户端端调用Service的公共方法了
            return LocalService.this;
        }
    }
    /** * 把Binder类返回给客户端 */
    @Nullable
    @Override
    public IBinder onBind(Intent intent) { 
        return binder;
    }
    @Override
    public void onCreate() {
        super.onCreate();
    } 
    /** * 解除绑定时调用 * @return */ 
    @Override 
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }
    @Override 
    public void onDestroy() {
        super.onDestroy();
    }
}

客户端主要代码:

private ServiceConnection conn;
private LocalService mService;
Intent intent = new Intent(this, LocalService.class);
bindService(intent, conn, Service.BIND_AUTO_CREATE);
conn = new ServiceConnection() { /** * 与服务器端交互的接口方法 绑定服务的时候被回调,在这个方法获取绑定Service传递过来的IBinder对象, * 通过这个IBinder对象,实现宿主和Service的交互。 */
@Override 
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG, "绑定成功调用:onServiceConnected");
// 获取Binder 
LocalService.LocalBinder binder = (LocalService.LocalBinder) service;
// 获取服务对象
mService = binder.getService();
} 
/** * 当取消绑定的时候被回调。但正常情况下是不被调用的,它的调用时机是当Service服务被意外销毁时, * 例如内存的资源不足时这个方法才被自动调用。 */ 
@Override 
public void onServiceDisconnected(ComponentName name) {
mService=null;
}
};

 

第三种

通过绑定服务的方式应用Messenger可以实现不同进程间的服务与客户端通信,此方式的实现过程如下:
  • 首先,在Service中新建一个Handler处理客户端传过来的消息,进行对应的消息处理;
  • 将Handler的对象传入新创建的Messenger对象中,建立Messenger与handler之间的联系;
  • 通过Messenger.getBinder()获得IBInder对象,并通过Service的onBinder()方法将IBinder的对象传递给客户端(这里建立了Messenger和IBinder对象之间的联系或者说是绑定关系);
  • 在客户端声明一个 ServiceConnection对象,在ServiceConnection对象的 onServiceConnected(),这个回调方法传到客户端一个IBinder对象,通过这个对象我们就和一获得与其联系的Messenger;
  • 最后我们可以把要传递的数据和指令保存在Message对象中,调用Messenger.send(msg)方法将消息发送出去,因为我们的服务的Handler和这里的额Messenger是相互关联的,因此,服务中的Handler可以收到并处理这些消息。
  • 此外,客户端也可以声明一个Handler对象用来处理服务传过来的消息
Service相关代码:
public class MessengerService extends Service { 


/** * 用于接收从客户端传递过来的数据 */
class IncomingHandler extends Handler
{
@Override 
public void handleMessage(Message msg) { 
switch (msg.what) { 

}
}
} 
/** * 创建Messenger并传入Handler实例对象 */ 
final Messenger mMessenger = new Messenger(new IncomingHandler()); 
/** * 当绑定Service时,该方法被调用,将通过mMessenger返回一个实现 * IBinder接口的实例对象 */
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "Service is invoke onBind"); 
return mMessenger.getBinder();
}
}

 

客户端主要代码:
/** * 与服务端交互的Messenger */ 
Messenger mService = null; 
boolean mBound;
bindService(new Intent(ActivityMessenger.this, MessengerService.class), mConnection, Context.BIND_AUTO_CREATE);
/** * 实现与服务端链接的对象 */ 
private ServiceConnection mConnection = new ServiceConnection() { 
public void onServiceConnected(ComponentName className, IBinder service) { /** * 通过服务端传递的IBinder对象,创建相应的Messenger * 通过该Messenger对象与服务端进行交互 */ 
mService = new Messenger(service);
mBound = true;
}
public void onServiceDisconnected(ComponentName className) {
mService = null;
mBound = false;
}
};
public void sayHello(View v) {
if (!mBound) return; 
// 创建与服务交互的消息实体Message 
Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0);
try {
//发送消息
mService.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}

 

参考文章: 关于Android Service真正的完全详解,你需要知道的一切 http://blog.csdn.net/javazejian/article/details/52709857   出自 【zejian的博客】
 
 

 

  • 16
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一拳小和尚LXY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值