service基础

问题:

1 一般来说bindService会导致onServiceConnected被调用,unbindService会导致onServiceDisconnected被调用,对吗?

2一般service所在进程被杀死了之后会怎么处理?

首先启动service的方式有2种,startSerice和bindService,这是context的方法,不仅仅activity的context可以调用,application的context也可以调用


startService启动Service

  1. 当启动一个Service的时候,会调用该Service中的onCreate()和onStartCommand()方法。
  2. 如果当前Service已经被创建过了,不管怎样调用startService()方法,onCreate()方法都不会再执行,onStartCommand()会执行。
  3. startService可以被调用很多次,但是调了无论多少次startService,只要一次stopService就可以结束此Service,通过多次startService,传入不同的intent,可以控制service的行为,可见Android Service 服务(一)—— Service文中的例子(核心代码是  Bundle bundle = new Bundle();  
            bundle.putInt("op", op);  
            intent.putExtras(bundle); )

bindServiece启动Service

以BIND_AUTO_CREATE方式bindService会调用onCreate()和onBind()方法,再一次bindService的话,不会发生任何事

如果一个activity bind了service之后,直接退出界面,会出现leaked ServiceConnection的error

startService和bindService共用

这2种模式不是完全分离的。你可以可以绑定到一个通过startService()启动的服务。如一个intent想要播放音乐,通过startService() 方法启动后台播放音乐的service。然后,也许用户想要操作播放器或者获取当前正在播放的乐曲的信息,一个activity就会通过bindService()建立一个到此service的连接. 这种情况下 要unbindService且stopService()(2者顺序无所谓) 才会真正停止service。


远程service和process指定

远程service是指运行在其他进程中的service,一般在manifest中指定process,如果没有指定,那service就是运行在主进程之中。指定process的时候,如果以冒号开头的就是私有进程,其他程序无法访问,否则就是全局进程,一般我们都使用私有进程,避免其他程序访问。
远程service可以直接被start,但无法被bind,可参考http://blog.csdn.net/guolin_blog/article/details/9797169

远程service命名问题

远程service,而且非私有的service进程,命名必须有小数点
android:process="myservice"会出现INSTALL_PARSE_FAILED_MANIFEST_MALFORMED错误,必须有小数点
          android:process="com.myservice"就可以了


onBind null

Service.onBind如果返回null,则调用 bindService 会启动 Service,但不会连接上 Service,因此 ServiceConnection.onServiceConnected 不会被调用,但你任然需要使用 unbindService 函数断开它,这样 Service 才会停止。

bindService启动service流程

如果以bind方式启动service,那么一般情况下调用流程是:service.onCreate --> service.onBind --> onServiceConnected. 
这个过程中,如果onBind返回了null,那么onServiceConnected不会被调用。

unbindService与onServiceDisconnected

unbindService与bindService对应,但是注意unbindService会导致service.onUnbind被调用,但是不会导致onServiceDisconnected方法被调用。onServiceDisconnected只有在service所在进程崩溃或者被杀死时才会调用,一般来说,如果service正常退出时不会调用onServiceDisconnected的。

onStartCommand与onStart区别

很久很久以前只有onStart没有onStartCommand,后来出现了onStartCommand
    public int onStartCommand(Intent intent, int flags, int startId) {
        onStart(intent, startId);
        return mStartCompatibility ? START_STICKY_COMPATIBILITY : START_STICKY;
    }
看代码onStartCommand还是调用了onStart,但是他有个int返回值

这个方法需要返回一个整型值。这个整型代表系统应该怎么样处理这个Service:

  • START_STICKY:使用这个返回值,如果系统杀死我们的Service将会重新创建。但是,发送给Service的Intent不会再投递。这样Service是一直运行的。
  • START_NOT_STICKY:如果系统杀死了Service,不会重新创建,除非客户端显式地调用了onStart命令。
  • START_REDELIVER_INTENT:功能与START_STICKY类似。另外,在这种情况下Intent会重新传递给Service。
  • START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
看源码    mStartCompatibility = getApplicationInfo().targetSdkVersion
                < Build.VERSION_CODES.ECLAIR;
可知我们的应用程序 targetSdkVersion 小于 2.0那么就返回 START_STICKY_COMPATIBILITY,否则返回 START_STICKY

问题答案:

1 bindService之后,如果onBind不返回null,那的却会导致onServiceConnected被调用。unbindService不会导致onServiceDisconnected被调用,只有service所在进程被杀死或者崩溃的时候,onServiceDisconnected才会被调用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值