*在实际运行中同样的Service的确只能有一个。

Services有两种启动形式:

  • Started:其他组件调用startService()方法启动一个Service。一旦启动,Service将一直运行在后台(run in the background indefinitely)即便启动Service的组件已被destroy。通常,一个被start的Service会在后台执行单独的操作,也并不给启动它的组件返回结果。比如说,一个start的Service执行在后台下载或上传一个文件的操作,完成之后,Service应自己停止。

    • 开启方式 :startService()

      SwipeActivity.this.startService(new Intent(SwipeActivity.this, FindCardService.class));
    • 结束方式1:
      SwipeActivity.this.stopService(new Intent(SwipeActivity.this, FindCardService.class));
    • 结束方式2:
      stopSelf(); // 继承Service的子类内部调用
    • 生命周期:
      onCreate() --> onStartCommand() --> onDestroy()  // 如果Service已经启动,再次startService(),只会调用onStartCommand()方法,控件销毁时,记得解绑
  • Bound:其他组件调用bindService()方法绑定一个Service。通过绑定方式启动的Service是一个client-server结构,该Service可以与绑定它的组件进行交互。一个bound service仅在有组件与其绑定时才会运行(A bound service runs only as long as another application component is bound to it),多个组件可与一个service绑定,service不再与任何组件绑定时,该service会被destroy。

    • 开启方式:bindService()

      SwipeActivity.this.bindService(new Intent(SwipeActivity.this, FindCardService.class), connection, BIND_AUTO_CREATE);
    • 结束方式:unbindService()
      SwipeActivity.this.unbindService(connection);  // 解绑只能进行一次,不然会出现崩溃: Service not registered
    • 生命周期:
      onCreate() --> onBind() --> onDestroy();  // 如果Service已经启动,再次bindService(),没效果
    • 使用如下:
    private FindCardService.FindCardBinder mFindCardBinder;
private boolean mBound; // 防止调用unbindService崩溃
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
CoreLog.d(TAG, "ServiceConnection -- onServiceConnected()");
mFindCardBinder = (FindCardService.FindCardBinder) service;
mBound = true;
} // 只有在service因异常而断开连接的时候,这个方法才会用到
@Override
public void onServiceDisconnected(ComponentName name) {
CoreLog.d(TAG, "ServiceConnection -- onServiceDisconnected()");
mBound = false;
}
};

绑定:

findViewById(R.id.bangding).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SwipeActivity.this.bindService(new Intent(SwipeActivity.this, FindCardService.class), connection, BIND_AUTO_CREATE);
}
});

解绑:

 @Override
protected void onDestroy() {
super.onDestroy();
if (mBound) {
SwipeActivity.this.unbindService(connection);
}
}

Service:

    @Nullable
@Override
public IBinder onBind(Intent intent) {
CoreLog.d(TAG, "FindCardService -- onBind()");
return mFindCardBinder;
} private FindCardBinder mFindCardBinder = new FindCardBinder(); public class FindCardBinder extends Binder { public void startFindCard() { } }

额外情况:

如果使用了bindService和startService混合使用会是什么情况?

1.stopService()会失效,即使使用了stopService(),不会调用onDestory()方法。

其他的,会按照各自的生命周期来走。

2.当控件都解绑了,才会调用onDestory()方法。

3.在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。也就是说Activity A 在onCreate()方法中bindService,正常调用onBind(),但没有在onDestory()方法中unbindService。Activity B在onCreate()方法中bindService,但没有调用onBind()方法了。

Services的更多相关文章

  1. Fedora 22中的Services and Daemons

    Introduction Maintaining security on your system is extremely important, and one approach for this t ...

  2. ABP(现代ASP.NET样板开发框架)系列之15、ABP应用层——应用服务(Application services)

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之15.ABP应用层——应用服务(Application services) ABP是“ASP.NET Boiler ...

  3. .NET RESTful Web Services入门

    很早之前看到过RESTful Web Services,并未在意,也没找相关资料进行学习.今天偶尔有一机会,就找了点资料进行研究,发现RESTful真是“简约而不简单”.下面用示例来说明: 1 项目结 ...

  4. 分分钟带你玩转 Web Services

    当大型需求被数个公司分割开来,各公司系统相互交换数据的问题就会接踵而来. 毕竟是多家不同的公司的产品,研发开发语言.采用技术框架基本上是百花齐放. 怎样让自家系统提供的服务具有跨平台.跨语言.跨各种防 ...

  5. 如何用Azure Web App Services接入微信公众号

    注:本文提到的代码示例下载地址>如何用Azure Web App Services接入微信公众号 如何用Azure Web App Services接入微信公众号 简介 此示例演示如何创建Azu ...

  6. 用C#创建Windows服务(Windows Services)

    用C#创建Windows服务(Windows Services) 学习:  第一步:创建服务框架 创建一个新的 Windows 服务项目,可以从Visual C# 工程中选取 Windows 服务(W ...

  7. Windows HTTP Services

    原文:https://msdn.microsoft.com/zh-cn/library/windows/desktop/aa384273(v=vs.85).aspx Purpose (目的) Micr ...

  8. 单例模式和angular的services的使用方法

    在现实生活中存在着有这样的特点的一些类: A.这些类只能有一个实例: B.这些能够自动实例化: C.这个类对整个系统可见,即必须向整个系统提供这个实例. 不妨举一个具体的单例模式的例子:比如教室里面的 ...

  9. Apache许可协议Open RIA Services

    Jeff Handley's进行了多年的项目--基于一份开源许可发布WCF RIA Services.遵循Apache 2许可,捐赠给Outercurve基金会的ASP.NET Open Source ...

  10. 当程序以Windows Services形式启动时当前路径不对

    当程序以Windows Services形式启动时当前路径不对 @(操作系统)[博客|dotNet] 很多时候我们需要将我们的程序写成利用Windows服务的形式来让它能够自启动.今天遇到一个问题,当 ...

随机推荐

  1. The 'brew link' step did not complete successfully

    在mac 上更新node时遇到了一系列的问题: 卸载node重新安装之后提示: The 'brew link' step did not complete successfully 其实这里已经给出了 ...

  2. MySQL实现分页查询

    imit 基本实现方式 一般情况下,客户端通过传递 pageNo(页码).pageSize(每页条数)两个参数去分页查询数据库中的数据,在数据量较小(元组百/千级)时使用 MySQL自带的 limit ...

  3. [HNOI2015]部分题解

    Day1 T2 [HNOI2015]接水果 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black,  她觉得这个游戏太简单了, ...

  4. 【洛谷 P3805】 【模板】manacher算法

    题目链接 manacher算法:在线性时间内求一个字符串中所有/最长回文串的算法. 先来考虑一下暴力的算法,枚举每个中点,向两边扩展,时间复杂度\(O(n^2)\). 来分析下此算法的缺点. 1.因为 ...

  5. bzoj 3190 维护栈

    我们可以将每一辆赛车看成一条直线,斜率为速度,纵截距为初始位置,那么问题就转化为求这n条直线处于最上面的直线.最上面是指在坐标系中,假设从x轴向下看,能看到的直线,只露一个点也算能看见.那么就类似水平 ...

  6. HBase表操作

    相对于0.9.X版本,在HBase1.X版本对内部API改动比较大,例如连接部分类库变更,如下: 连接获取:org.apache.hadoop.hbase.HBaseConfiguration.cre ...

  7. Django-models,继承AbstractUser类

    1.UserInfo类继承了Django模型自带的User类,需要导入AbstractUser   2.然后在settings.py中配置

  8. OC的UUID生成

    NSString *uuidStr = [[NSUUID UUID] UUIDString];

  9. __rb_tree_rebalance

    Inline void __rb_tree_rebalance(__rb_tree_node_base* x, __rb_tree_node_base*& root) //当前节点,根 { x ...

  10. docker从零开始 存储(五)存储驱动介绍

    关于存储驱动程序 要有效地使用存储驱动程序,了解Docker如何构建和存储镜像以及容器如何使用这些镜像非常重要.您可以使用此信息做出明智的选择,以确定从应用程序中保留数据的最佳方法,并避免在此过程中出 ...