服务

服务的生命周期

---
  1 开启服务的生命周期
完整的生命周期:onCreate()-->onStartCommand()-->onDestroy()

* 开启服务:onCreate()-->onStartCommand()
* 停止服务:onDestroy()

* 特点:
        1. 服务可以被多次开启,每次开启都执行onStartCommand()方法
        2. 服务只能被停止一次,多次停止服务
        3. 长期运行在后台

  2 bind绑定服务的生命周期
完整的生命周期:onCreate()-->onBind()-->onUnbind()-->onDestroy()

* 绑定服务:onCreate()-->onBind()
* 解绑服务:onUnbind()-->onDestroy()

* 特点:
        1. 服务只能被绑定一次,多次绑定无效
        2. 服务只能被解绑一次,多次解绑会抛出异常
        3. 不可以长期运行在后台
        4. Activity和绑定他的服务同生共死
        5. 可以调用服务里的方法

* 区别: 1. 能不能长期运行在后台
        2.  能不能调用服务里的方法

绑定服务调用方法

---
  3 绑定服务调用服务里的方法
服务被绑定成功后,拿到服务返回的中间人,用中间人间接调用服务里的方法

Activity:

 /**
* bind方式绑定服务
*/
public void bind(View v) {
/**
* service :意图 ServiceConnection:Activity和service连接通道
* BIND_AUTO_CREATE:绑定服务时,如果服务不存在,则创建
*/
Log.d(TAG, "bind:1. 绑定服务");
conn = new MyConn();
bindService(intent, conn, BIND_AUTO_CREATE);
} /**
* 解绑服务
*/
public void unbind(View v) { Log.d(TAG, "unbind:服务被解绑啦。。。");
unbindService(conn);
} /**
* 调用服务里的方法
*
*/
public void diao(View v) { xiaowu.qianShouMM(99999);
Log.d(TAG, "diao:6. 用服务的内部类间接调用服务里的方法");
} class MyConn implements ServiceConnection { // Activity和service已经连接成功喽
@Override
public void onServiceConnected(ComponentName name, IBinder service) { Log.d(TAG, "onServiceConnected:4. 服务连接成功了");
xiaowu = (WuMiShu) service;
Log.d(TAG, "onServiceConnected:5. 在Activity中拿到了服务里的内部类");
} // 失去连接了
@Override
public void onServiceDisconnected(ComponentName name) { Log.d(TAG, "onServiceDisconnected: 失去连接了...");
}
} @Override
protected void onDestroy() { unbindService(conn);
super.onDestroy();
}

Service:

 /**
* 服务里的方法
*/
public void methodInService() { Toast.makeText(this, "我是服务里的方法,来吊我啊。。。", 0).show();
} @Override
public IBinder onBind(Intent intent) { Log.d(TAG, "onBind:2. 服务被绑定成功喽");
Log.d(TAG, "onBind 3. 服务绑定成功后,返回WuMiShu");
return new WuMiShu();
} /**
* 服务里的内部类, 内部类调用外部类的方法 中间人 小蜜
*/
public class WuMiShu extends Binder { /**
* 调用外部类的方法
*
* @param money
*/
public void qianShouMM(int money) { if (money > 5000) {
methodInService();
} else {
Toast.makeText(MyService.this, "屌丝注定单身", 0)
.show();
}
}
} @Override
public boolean onUnbind(Intent intent) { Log.d(TAG, "onUnbind:");
return super.onUnbind(intent);
} @Override
public void onCreate() { super.onCreate();
Log.d(TAG, "onCreate:");
} @Override
public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG, "onStartCommand:");
return super.onStartCommand(intent, flags, startId);
} @Override
public void onDestroy() { super.onDestroy();
Log.d(TAG, "onDestroy:");
}

  

  4 绑定服务抽取接口
隐藏具体的实现细节,只暴露程序员想暴露的方法

1. 写一个接口,接口里写一个方法
2. 让服务的内部类ChenMiShu实现IService接口
3. 当Activity这边连接成功后,Binder强转成IService接口类型
4. 用IService接口间接调用服务里的方法

  5 混合方式开启服务
为什么要用混合方式启动服务:即想服务长期运行在后台,又想调用服务里的方法

开发中推荐的步骤:startService()保证服务长期运行在后台
                 bindService()可以调用服务里的方法
                 unBindService()解除绑定服务
                stopService()后台就没有这个服务了
远程服务

---
  6 本地服务和远程服务
* 本地服务:服务组件在自己的应用程序里
* 远程服务:服务组件不在自己的应用程序里

  7 本地应用调用远程服务中的方法
AIDL:android interface defination language 安卓接口定义语言

编写步骤:
        远程服务工程:
            1. 把IService.java改成.aidl文件
            2. 去掉public 修饰符
            3. 让服务里的内部类继承IService.Stub

  Service:

 

 @Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind");
return new ChenMiShu();
}
/**
* 陈秘书
*/
class ChenMiShu extends IService.Stub{ @Override
public void callMethodInRemoteService() {
qianShouYangNiu();
} } /**
* 远程服务里的方法
*/
public void qianShouYangNiu(){
Log.e(TAG, "qianShouYangNiu:我来了,你在哪?我在美国,咱们中间隔着一个太平洋....");
}

  IService.aidl

  interface IService {

     /**
* 调用远程服务里 的方法
*/
void callMethodInRemoteService();
}

本地应用:
            4. 创建一个和远程服务.aidl文件所在的一样包
            5. 吧06工程里的IService.aidl文件复制到这个包里
            6. 用IService.Stub.asInterface(service)强转成IService
            7. 间接调用远程服务了的方法,处理RemoteException

  

  Activity:

 /**
* start开启服务
*
* @param v
*/
public void start(View v) {
intent = new Intent();
// 设置动作
intent.setAction("wo.kan.dai.ma.ru.chu.lian");
// 可选,设置数据
// 默认是DEFAULT,可以不写
startService(intent);
} /**
* stop停止服务
*
* @param v
*/
public void stop(View v) {
stopService(intent);
} /**
* bind绑定服务
*
* @param v
*/
public void bind(View v) {
Intent service = new Intent();
// 设置动作
service.setAction("wo.kan.dai.ma.ru.chu.lian"); mConn = new MyConn();
bindService(service, mConn, BIND_AUTO_CREATE);
} /**
* Activity和远程服务里的连接通道
*/
class MyConn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG, "onServiceConnected:连接成功");
// service强转成 IService接口类型
mService = IService.Stub.asInterface(service);
} @Override
public void onServiceDisconnected(ComponentName name) {
} } /**
* 解绑服务
*
* @param v
*/
public void unbind(View v) {
unbindService(mConn);
} /**
* 调用远程服务里的方法
*/
public void callremotemethod(View view) {
try {
mService.callMethodInRemoteService();
} catch (RemoteException e) {
e.printStackTrace();
}
}

  IService.aidl

1  interface IService {
2
3 /**
4 * 调用远程服务里 的方法
5 */
6 void callMethodInRemoteService();
7 }

  清单代码:

  

  <activity
android:name="cn.zxr.local.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

android 四大组件之---Service的更多相关文章

  1. Android四大组件之Service

    Android四大组件之Service Android支持服务的概念,服务是在后台运行的组件,没有用户界面,Android服务可用有与活动独立的生命周期.Android支持两种类型的服务: 本地服务: ...

  2. 【Android开发日记】之入门篇(五)——Android四大组件之Service

    这几天忙着驾校考试,连电脑都碰不到了,今天总算告一段落了~~Service作为Android的服务组件,默默地在后台为整个程序服务,辅助应用与系统中的其他组件或系统服务进行沟通.它跟Activity的 ...

  3. Android成长日记-Android四大组件之Service组件的学习

    1.什么是Service? Service是Android四大组件中与Activity最相似的组件,它们都代表可执行的程序,Service与Activity的区别在于:Service一直在后台运行,它 ...

  4. Android 四大组件之service与Broadcast

    Android 四大组件之一:service: Service有五个生命周期:onCreat,onStartCommand, onBind,onUnbind, onDestroy 主要有绑定和非绑定两 ...

  5. Android四大组件之一Service介绍-android学习之旅(十二)

    基本概念: service是android四大组件之一,运行在后台执行耗时操作,并不提供用户界面.其他组件如acticity可以通过startService启动该组件,也可以通过bindService ...

  6. Android四大组件之一 -- Service详解

    相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了.Service作为Android四大组件之一,在每一个应用程序 ...

  7. Android四大组件:Service

    前言 Service作为Android四大组件之一,应用非常广泛 本文将介绍对Service进行全面介绍(基础认识.生命周期.使用和应用场景) 目录 目录 1. 基础知识 定义:服务,属于Androi ...

  8. Android四大组件之Service浅见

    Service 是Android四大组件之一,可以在不显示界面的情况下在后台运行.还有一个作用是通过AIDL来实现进程间通信. Service的启动方式 Service的启动方式有两种,startSe ...

  9. Android 四大组件之Service

    ---恢复内容开始--- 1,Service的生命周期

  10. 谈Android四大组件之Service篇

    Service简介 Service是Android系统中的四大组件之一,它是一种长生命周期的,没有可视化界面,运行于后台的一种服务程序.Service必须在AndroidManifest.xml中声明 ...

随机推荐

  1. ORA-00257 archiver error 处理思路

    1.首先查下oerr给出的简要说明 2.查询V$RECOVERY_AREA_USAGE信息 3.根据实际空间剩余情况先适当增加归档目录的大小,保证先恢复业务 4.查看备份是否存在问题 1.首先查下oe ...

  2. java多线程--几个多线程面试题小结

    自学了一段时间的多线程知识,尝试了做了几个编程题,发现想象中很简单的功能,自己真写起来要花费远超自己想象的功夫,知识点易学,不易用啊. 面试题1:编写程序实现,子线程循环10次,接着主线程循环20次, ...

  3. 淘宝web前端开发岗面试经历及感悟

    今天下午四点接到淘宝UED的面试电话,很突然,很激动.现在怀着淡淡的忧伤为之文以志一下. 1.自我介绍一下. 我xx时候毕业,在xx公司任xx职务,主要负责xx balabala.(怕公司同事听到,接 ...

  4. (十)WebGIS中地理坐标与屏幕坐标间的转换原理

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 地图本身是拥有坐标的,一般可以大致分为平面坐标和经纬度坐标, ...

  5. PHP中的__toString方法(实现JS里的链式操作)

    _toString方法是在打印对象时自动调用的魔术方法,如果不声明会报以下错 Catchable fatal error: Object of class String could not be co ...

  6. 史上最全的Ajax基础详解

    同步请求和异步请求 先解释一下同步和异步的概念: 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式. 异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯 ...

  7. 【Win10开发】如何在页面之间传值

    我们知道UWP是通过不同的页面来展示不同的内容的,那么我们该怎么进行页面之间的传值呢? 首先我们在MainPage里面写一个ListView来展示一些英文单词. List<English> ...

  8. jquery easyui使用(二)······可折叠面板动态加载无效果

    先上代码: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"& ...

  9. B/S工作原理

    B/S疑问 先对比C/S,在C/S中我们开发时怎么做的,是不是这样:拖控件,写方法,所有的功能基本就是这样,就像我们的机房收费系统,C/S学习完之后,我们开始B/S学习,这里我们接触的是ASP.NET ...

  10. JS进阶之原型

    之前有在自己的文章中谈到对象,而说到对象我们就不可避免的要扯到原型,并且原型也是我们必须得理解到位的一个点,那接下来我们就来聊一聊js的原型吧. JS中一切皆为对象,那么原型也是一种对象.所以它有对象 ...