2019独角兽企业重金招聘Python工程师标准>>>

很多情况下,一些与用户很少需要产生交互的应用程序,我们一般让它们在后台运行就行了,而且在它们运行期间我们仍然能运行其他的应用。

为了处理这种后台进程,Android引入了Service的概念。Service在Android中是一种长生命周期的组件,它不实现任何用户界面。最常见的例子如:媒体播放器程序,它可以在转到后台运行的时候仍然能保持播放歌曲;或者如文件下载程序,它可以在后台执行文件的下载。

让我们来看下如何创建Service:
创建一个Service
Android中已经定义了一个 ‘Service’类,所有其他的Service都继承于该类。Service类中定义了一系列的生命周期相关的方法,如: onCreate(), onStart(), onDestroy()。参见下例:

package com.wissen.testApp.service;

public class MyService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

@Override
    public void onCreate() {
        super.onCreate();
        Toast.makeText(this, “Service created…”, Toast.LENGTH_LONG).show();
    }

@Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, “Service destroyed…”, Toast.LENGTH_LONG).show();
    }
}

上例中的这个Service主要做了这些事:当服务创建和销毁时通过界面消息提示用户。
如Android中的其它部件一样, Service也会和一系列Intent关联。Service的运行入口需要在AndroidManifest.xml中进行配置,如下:

之后我们的Service就可以被其他代码所使用了。

使用Service:
应用程序可以通过调用 Context.startService方法来启动Service。如果当前没有指定的Service实例被创建,则该方法会调用 Service的onCreate方法来创建一个实例;否则调用Service的onStart方法。参见下列代码:

..
Intent serviceIntent = new Intent();
serviceIntent.setAction(”com.wissen.testApp.service.MY_SERVICE”);
startService(serviceIntent);
..

以上代码调用了startService方法,Service会持续运行,直到调用stopService()或stopSelf()方法。
还有另一种绑定Service的方式:


ServiceConnection conn = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        Log.i(”INFO”, “Service bound “);
    }

@Override
    public void onServiceDisconnected(ComponentName arg0) {
         Log.i(”INFO”, “Service Unbound “);
    }
};

bindService(new Intent(”com.wissen.testApp.service.MY_SERVICE”), conn, Context.BIND_AUTO_CREATE);

当应用程序绑定一个Service后,该应用程序和Service之间就能进行互相通信,通常,这种通信的完成依靠于我们定义的一些接口,请看下例:

package com.wissen.testApp;

public interface IMyService {
    public int getStatusCode();
}

这里定义了一个方法来获取Service的状态,但是Service是如何来使它起作用的呢?之前我们看到Service中有个返回IBinder对象的onBind方法,这个方法会在Service被绑定到其他程序上时被调用,而这个IBinder对象和之前看到的onServiceConnected方法中传入的那个IBinder是同一个东西。应用和Service间就依靠这个IBinder对象进行通信:
public class MyService extends Service {
    private int statusCode;
    private MyServiceBinder myServiceBinder = new MyServiceBinder();
   
    @Override
    public IBinder onBind(Intent intent) {
        return myServiceBinder;
    }
public class MyServiceBinder extends Binder implements IMyService {
        public int getStatusCode() {
             return statusCode;
       }
    }
   
    …
}
下列代码是说明getStatusCode是如何被调用的:  
ServiceConnection conn = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        IMyService myService = (IMyService) service;
        statusCode = myService.getStatusCode();
        Log.i(”INFO”, “Service bound “);
    }
   
    …
};

或者,你也可以通过使用ServiceListener接口来达成相同的目的。

与远程Service通信(进程间Service通信):
如何两个进程间的Service需要进行通信,则需要把对象序列化后进行互相发送。
Android提供了一个 AIDL (Android接口定义语言)工具来处理序列化和通信。这种情况下Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个 stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了,参见下例:
先创建一个IMyRemoteService.aidl文件,内容如下:

package com.wissen.testApp;

interface IMyRemoteService {
    int getStatusCode();
}

如果你正在使用eclipse的 Android插件,则它会根据这个aidl文件生成一个Java接口类。生成的接口类中会有一个内部类Stub类,你要做的事就是去继承该Stub类:

package com.wissen.testApp;

class RemoteService implements Service {
    int statusCode;
   
    @Override
    public IBinder onBind(Intent arg0) {
        return myRemoteServiceStub;
    }

private IMyRemoteService.Stub myRemoteServiceStub = new IMyRemoteService.Stub() {
        public int getStatusCode() throws RemoteException {
            return 0;
        }
    };
   
    …
}

当客户端应用连接到这个Service时,onServiceConnected方法将被调用,客户端就可以获得IBinder对象。参看下面的客户端onServiceConnected方法:


ServiceConnection conn = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        IMyRemoteService myRemoteService = IMyRemoteService.Stub.asInterface(service);
        try {
            statusCode = myRemoteService.getStatusCode();
       } catch(RemoteException e) {
           // handle exception
       }
        Log.i(”INFO”, “Service bound “);
    }
   
    …
};

权限:
我们可以在AndroidManifest.xml文件中使用 标签来指定Service访问的权限:

之后应用程序要访问该Service的话就需要使用 标签来指定相应的权限:

原文:http://www.fulema.com/viewthread.php?tid=5&extra=page%3D1

转载于:https://my.oschina.net/kevin008/blog/2197

Android基础 : Android Service[转]相关推荐

  1. Android基础——Android系统概览

    1. Android系统架构 android大致可以分为四层架构:Linux内核层,系统运行库层.应用框架层和应用层 Linux内核层 android系统是基于Linux内核,这一层为android设 ...

  2. [Android 基础] -- Android 属性系统简介

    一.简介 在 android 系统中,为同一管理系统的属性,设计了一个统一的属性系统.每个属性都有一个名字和值,他们都是字符串格式.属性被大量使用在 Android 系统中,用来记录系统设置或进程之间 ...

  3. Android基础(八) – Service AIDL

    AIDL大多情况用于不同应用之间通信. (eg: A应用调用B应用的播放视频功能) 第一步:然后建立AIDL,通过点击建立AIDL文件,如图 第二步:在新建的AIDL文件里 写协议接口 interfa ...

  4. Android基础 - Android Studio 添加游戏音效

    一.资源添加 在资源文件夹res中,创建raw文件夹,放置音频(mp3.wav).视频文件:New-Folder-Raw Resource Folder 文件命名格式:开头不能是数字,不能为大写字母. ...

  5. Android基础再回首——四大组件之Activity、Service俩兄弟

    Android基础再回首--四大组件之Activity.Service俩兄弟 偶尔的回首过去,总是有不一样的收获.今天就来回顾下Activity和service吧,不用嫌弃太基础了,打好基础是取得成功 ...

  6. Android基础入门教程——4.2.3 Service精通

    Android基础入门教程--4.2.3 Service精通 标签(空格分隔): Android基础入门教程 本节引言: 本节,我们继续来研究Service(服务)组件,本节将会学习下Android中 ...

  7. Android Studio开发基础之Service

    1.Service的使用 Activity可以呈现一个用户界面,但是Service确实运行在后台,新建一个Myservice.java,会在AndroidManifest中自动配置<Servic ...

  8. android intent 源码,Android 基础之 IntentService 源码

    Android 基础之 IntentService 源码 Android,IntentService,源码 IntentService 位于 android.app 包下面,是 Service 的一个 ...

  9. 自动生成Android界面,面向Android的Web Service界面自动生成技术研究

    摘要: 据统计,开发人员在开发应用程序的过程中,接近一半的代码用于用户界面部分,大约一半的运行时间用于执行这一部分.所以,减少用户界面部分的开发代码和运行时间,能有效提高程序的运行效率.智能家居中,由 ...

最新文章

  1. 皮一皮:运气差,可能说的就是这个吧...
  2. Spring-AOP基础知识
  3. android应用兼容报告,手机资讯导报:华为发布国内首份Android7.0应用兼容报告
  4. Java多线程(二):Callable和FutureTask结合使用获取返回值
  5. MATLAB调用Python自定义函数(类、函数等) Python调用MATLAB
  6. 计算机鼠标装有,计算机鼠标装有传感器来监视鼠标的移动情况,如图
  7. 银行突发事件演练方案_【工作动态】准旗联社组织开展优质文明服务应急演练,为优质服务保驾护航!...
  8. 我的日常Vim使用--凌波微步
  9. 【原】设置iOS项目BuildVersion自动增加
  10. NekoHtml 解析内容时需要注意的地方
  11. MATLAB的WFDB软件下载及使用
  12. 百度指数和股票的相关性
  13. 玩聚榜单-仿照Technorati的Popular频道
  14. 支付宝 手机页面支付 集成 出现 “系统繁忙,请稍后再试”
  15. vue3之watch和watchEffect实战总结
  16. 现代OpenGL教程(六):鼠标和键盘(imgui+OpenGL3.3)
  17. 批量提取文件夹下同类型文件/批量提取文件夹下不同名称文件夹的同类型文件
  18. 【AI with ML】第 5 章 :自然语言处理简介
  19. C++实现员工工资管理系统
  20. PADS 原理图/PCB常见错误及DRC报告网络问题

热门文章

  1. 阿里云分析性数据库的发展历史
  2. 巧用Linux 架设TFTP Server备份路由器的配置文件
  3. 提高页面载入速度简单易行的四个办法。
  4. 为什么自动化对于IT工程师是必须的?
  5. 用jackson封装的JSON工具类
  6. thinkphp执行流程
  7. 苹果 开发者账号区别
  8. Python指南--深入流程控制
  9. 前端基础入门第一阶段-Web前端开发基础环境配置
  10. nginx自签SSL证书和Symantec签发证书使用