Service的使用

Service写起来步骤有些多,而且有的写错了就不会有效果,所以我整理一下,以后自己看着能好想起来

   Service是Android四大组件之一,主要为了程序退出后仍然可以存在.但是Service实际运行在主线程,请不要做太耗时的操作,有耗时操作可以在Service中再建一个子线程来完成

那么来写一下Service的基本使用方法吧

        首先我们需要新建一个类来继承Service     然后必须在AndroidManifest中注册,与activity同级

public class NewService extends Service{
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}
写完直接复写出来的方法是onBind(),这个方法很重要,不过返回值暂时为null

在这时我们就要了解一下Service的生命周期了,Service的生命周期有两种,而这是由它的启动方式决定的.

两种启动方式分别为.context.startService()和  context.bindService()第一种是直接开始,这一种服务可以在程序结束后继续运行

第二种是将服务与组件(比如Activity)绑定,程序结束时必须解除绑定,不然会报错,单纯被绑定的服务在绑定的组件结束时也会结束,但是绑定的服务可以获得一个binder对象,以此来调用服务中的方法,对服务进行操作,如音乐播放器     不过Service是可以同时被start和bind的

 那么我们绑定服务时获取的Ibinder对象就是我们复写的onBind方法的返回值,但是服务中现在没有Ibinder对象,我们需要在服务中创建一个类继承自Binder

并且在这个类中写我们希望操作服务做的方法   比如我这里传入了发短信的数据,在send==true的时候,我会在onCreate中进行发短信的操作(我要做的是延时发送,所以没有把所有操作放在Binder中)

public class MyBinder extends Binder {
    public void sendmsg(int time, String content, String num) {
        time1 = time;
        content1 = content;
        num1 = num;
        send = true;
    }
}
这时候我们有了一个MyBinder内部类,但是还没有一个对象 so我们要实例化一个对象
private MyBinder myBinder;

       然后我们要复写onCreate方法 onCreate方法是Service的两种生命周期的第一个方法,一定会执行,并且只执行一次

会变化的变量初始化操作不要写在上面,写在生命周期中

  然后我们在onCreate中初始化对象  并且将onBind方法中的返回值改为这个对象(这一步一定不要忘)

@Override
public void onCreate() {
    super.onCreate();
    myBinder = new MyBinder();
这时我们有了binder对象,有了binder类中我们要做的操作,并且已经注册了,那么我们服务这个类的所有操作就完成了,接下来我们要找到组件来绑定和使用它.

首先我们需要一个连接服务的对象  和一个对服务进行操作的binder对象(这个对象由Service提供)   还有一个Intent(用于启动服务,两种启动方式都需要)

private ServiceConnection serviceConnection;	

private MyService.MyBind myBind;

private Intent start;

start = new Intent(this, NewService.class);

在onCreate中初始化的时候会直接复写两个方法

serviceConnection = new ServiceConnection() {
    /**
     * 当服务连接成功的时候会回调--有坑    Secveice中的bind返回值为空时不调用此方法
     * @param componentName
     * @param iBinder
     */
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        Log.e(TAG, "onServiceConnected:-------- ");
        //将onbind方法的返回值,赋值到myBinder上
        myBind = (NewService.MyBind) iBinder;
    }
    /**
     * 当服务,被杀死时会回调,例如,内存不够被干掉
     * @param componentName
     */
    @Override
    public void onServiceDisconnected(ComponentName componentName) {
        Log.e(TAG, "onServiceDisconnected:--------------------- ");
    }
};


这时候我们还没有启动Service

Service 的startService和stopService需要一个Intent       绑定服务需要一个Intent ,一个连接服务对象,还有一个flags(这个我一直是选Service.BIND_AUTO_CREATE)

服务解除绑定需要 一个连接服务对象(只要绑定过,那么这个Activity退出时必须做的)          当既Start又bind的时候我们需要既stop又unbind

startService(start);

stopService(start);
//绑定服务
bindService(start, serviceConnection, Service.BIND_AUTO_CREATE);
//解绑服务
unbindService(serviceConnection);

我们只有在绑定服务后才可以使用binder

使用很简单

myBind.sendmsg(1,"这是一条延时发送的短信,延时一秒","88888");

这样我们就可以与Service进行交互了

-------------------------------------------------------------------底下有的是别的网站摘下来的--------------------------------------------------------------------------------------------------------

  1. 重写生命周期的回调方法

    1. onCreate()
      • 何时:首次创建服务时。
      • 注意:若服务已在运行,则不会调用此方法。
    2. onDestroy()
      • 何时:当服务不再使用且将被销毁时。
      • 作用:清理所有资源,如线程、注册的侦听器、接收器等。 
      • 注意:这是服务接收的最后一个调用。
    3. int onStartCommand(Intent intent, int flags, int startId)
      • 何时:当另一个组件调用startService()请求启动服务时。
      • 参数:
        1. intent:startService()启动服务时传入的Intent;
        2. startId:唯一id标识此次服务的启动请求。
      • 返回值:描述系统应该如何在服务终止的情况下继续运行服务。
    4. IBinder onBind(Intent it)
      • 何时:当另一个组件调用bindService()与服务绑定时。
      • 返回值:供客户端与服务进行通信。
/**
 * Created by dllo on 17/1/16.
 * 要使用服务,需要先建立一个类,继承Service抽象类
 * 实现方法
 * 还要去Manifest文件中注册一下
 */
/**
 * 如何与服务进行交换
 * 推荐使用Binder形式
 * 如何使用Binder
 * 第一步: 建立一个MyService的内部类Mybinder类,继承Binder
 * 第二步: 声明一个成员的MyBinder对象,在服务的onCreate方法中
 *                                对MyBinder初始化
 * 第三步: 将这个MyBinder对象,作为OnBind方法的返回值返回
 * 第四步: 在与服务绑定的类中声明一个MyBinder的成员变量
 *    在OnServiceConnected回调中对该成员变量进行赋值(ServiceConnection 中的复写方法)
 * 这样,服务中的myBinder对象就被传递到了绑定服务的泪中
 * 通过操作该myBinder对象,调用该MyBinder类中的各种方法
 *  就可以操作MyService中的各种属性
 */



   当Service已经被一个Activity绑定时,另一个Activity绑定时不会走onBind方法,但会获得一个binder,这个binder是最开始绑定时返回的binder,存在第三方中,再有绑定的就直接把binder塞给它

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值