服务,就是跑在后台的“程序”,不需要和用户进行交互。举个例子,当使用一款应用的时候,可能同时想在后台播放一些音乐。在这种情况下,后来播放音乐的代码不需要和用户进行交互,所以,它就可能被当成一个服务。当不需要给用户提供UI的时候,服务也是一种非常好的选择。

想要彻底的了解服务的工作原理,最好的办法就是去着手尝试一下。下面将会新建一个简单的服务,并且在其中添加一些方法。讲述如何开启和关闭一个服务。

1. 新建一个工程,Services。

2. 新建一个类,MyService。

public class MyService extends Service {

    @Override
public IBinder onBind(Intent arg0) {
return null;
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
return START_STICKY;
} @Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
}
}

3. 修改AndroidManifest.xml。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.manoel.Services"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" /> <application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".ServicesActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <service android:name=".MyService">
<intent-filter>
<action android:name="net.manoel.MyService" />
</intent-filter>
</service>
</application> </manifest>

4. 修改main.xml。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <Button android:id="@+id/btnStartService"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Start Service"
android:onClick="startService"/> <Button android:id="@+id/btnStopService"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Stop Service"
android:onClick="stopService" /> </LinearLayout>

5. 修改ServicesActivity.java。

public class ServicesActivity extends Activity {

    /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
} public void startService(View view) {
startService(new Intent(getBaseContext(), MyService.class));
} public void stopService(View view) {
stopService(new Intent(getBaseContext(), MyService.class));
} }

6. 调试

这个例子展示了最简单的服务。这个服务本身不会做什么有用的东西,只是显示服务创建的过程。

首先,定义一个Serivce基类的子类。所有的服务都继承Service基类。

public class MyService extends Service {

}

然后,实现3个方法。

    @Override
public IBinder onBind(Intent arg0) { ... } @Override
public int onStartCommand(Intent intent, int flags, int startId) { ... } @Override
public void onDestroy() { ... }

onBind()方法可以把一个activity绑定到一个service上面。这就是说,这个方法可以让一个activity去直接访问一个service里面的成员变量和方法。目前,仅仅返回一个null,后续再讨论这个方法。

onStartCommand()方法,在调用startService()的时候被调用。这个方法意味着service的开始,这里可以写一些自己的代码逻辑。这里,我返回了一个常量START_STICKY,这样的话,如果这个service不stop的话就会一直跑下去。

onDestroy()方法,在调用stopService()的时候被调用。这里可以清理service用到过的资源。

除了代码中的例子,也可以用另外一种方法去开启服务。

在AndroidManifest.xml中声明Action。

        <service android:name=".MyService">
<intent-filter>
<action android:name="net.manoel.MyService" />
</intent-filter>
</service>
startService(new Intent("net.manoel.MyService"));

想要停止一个服务,调用stopService():

stopService(new Intent(getBaseContext(), MyService.class));

Android 程式开发:(廿二)服务 —— 22.1 自定义服务的更多相关文章

  1. Linux中使用systemctl操作服务、新建自定义服务

    Linux有12种Unit,对于个人来讲,用的最多的是Service Unit,下面的Unit均指Service Unit(服务单元) # 启动Unit systemctl start appname ...

  2. Android系统在新进程中启动自定义服务过程(startService)的原理分析

    在编写Android应用程序时,我们一般将一些计算型的逻辑放在一个独立的进程来处理,这样主进程仍然可以流畅地响应界面事件,提高用户体验.Android系统为我们提供了一个Service类,我们可以实现 ...

  3. 【Android】16.0 第16章 自定义服务和系统服务—本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-03-01 一.简介 本章主要演示Started Service.带Intent过滤器的Started Service.IntentSe ...

  4. angularJs自定义服务(实现签名和加密)

    写在前面: angularJS是google公司主推的js开发优秀框架... 页面展示: 在应用中进行加密是普遍存在的,个人建议在前端实现加密签名(前端加密是否必要来自知乎:http://www.zh ...

  5. Android 综合揭秘 —— 全面剖释 Service 服务

    引言 Service 服务是 Android 系统最常用的四大部件之一,Android 支持 Service 服务的原因主要目的有两个,一是简化后台任务的实现,二是实现在同一台设备当中跨进程的远程信息 ...

  6. Angular JS 学习笔记(自定义服务:factory,Promise 模式异步请求查询:$http,过滤器用法filter,指令:directive)

    刚学没多久,作了一个小项目APP,微信企业号开发与微信服务号的开发,使用的是AngularJS开发,目前项目1.0版本已经完结,但是项目纯粹为了赶工,并没有发挥AngularJS的最大作用,这几天项目 ...

  7. JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

    JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接 ...

  8. 添加一个Android框架层的系统服务与实现服务的回调

    2017-10-09 概述 所谓Android系统服务其本质就是一个通过AIDL跨进程通信的小Demo的延伸而已.按照 AIDL 跨进程通信的标准创建一套程序,将服务端通过系统进程来运行实现永驻内存, ...

  9. Android Service总结03 之被启动的服务 -- Started Service

    Android Service总结03 之被启动的服务 -- Started Service 版本 版本说明 发布时间 发布人 V1.0 添加了Service的介绍和示例 2013-03-17 Sky ...

随机推荐

  1. dede修改移动文档的js

    dede后台弹框修改: 想做个类似文章列表的移动功能,弹框,然后修改成功到表 先在list.js里复制一份moveArc的方法,到archives_do.php里复制一份moveArchives的方法 ...

  2. grawlew 编译

    http://somefuture.iteye.com/blog/2002052 Gradlew behind a proxy systemProp.http.proxyHost=www.someho ...

  3. QT 遍历目录查找指定文件(比较简单)

    QString FindFile(const QString &strFilePath, const QString &strNameFilters){ if (strFilePath ...

  4. 设计模式总结1--observer pattern

    <!-- 设计模式 --><!--是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代 码可靠性 --&g ...

  5. Java学习之链表

    数据结构学了,java实现下 package com.gh.Link; /** * 链表的实现 * @author ganhang * */ public class Links { public s ...

  6. Java学习之IO之File类一

    File的操作 package com.gh.file; import java.io.File; import java.io.IOException; /** * File操作 * @author ...

  7. Buy Tickets(线段树)

    Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 16607   Accepted: 8275 Desc ...

  8. 请问set JAVA_OPTS的各项參数是什么意思?

    http://topic.csdn.net/u/20090910/10/20c6ba01-28ac-482e-94b2-bfce0a952f77.html 请问set JAVA_OPTS的各项參数是什 ...

  9. Python中函数式使用

    对于链表来讲,有三个内置函数非常有用: filter(),map() 以及 reduce(). filter(function, sequence) 返回一个 sequence(序列),包括了给定序列 ...

  10. spark sql 以JDBC为数据源

    一.环境准备: 安装mysql后,进入mysql命令行,创建测试表.数据: 将 mysql-connector-java 的jar文件拷贝到 \spark_home\lib\下,你可以使用最新版本,下 ...