Android 程式开发:(廿二)服务 —— 22.1 自定义服务
服务,就是跑在后台的“程序”,不需要和用户进行交互。举个例子,当使用一款应用的时候,可能同时想在后台播放一些音乐。在这种情况下,后来播放音乐的代码不需要和用户进行交互,所以,它就可能被当成一个服务。当不需要给用户提供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 自定义服务的更多相关文章
- Linux中使用systemctl操作服务、新建自定义服务
Linux有12种Unit,对于个人来讲,用的最多的是Service Unit,下面的Unit均指Service Unit(服务单元) # 启动Unit systemctl start appname ...
- Android系统在新进程中启动自定义服务过程(startService)的原理分析
在编写Android应用程序时,我们一般将一些计算型的逻辑放在一个独立的进程来处理,这样主进程仍然可以流畅地响应界面事件,提高用户体验.Android系统为我们提供了一个Service类,我们可以实现 ...
- 【Android】16.0 第16章 自定义服务和系统服务—本章示例主界面
分类:C#.Android.VS2015: 创建日期:2016-03-01 一.简介 本章主要演示Started Service.带Intent过滤器的Started Service.IntentSe ...
- angularJs自定义服务(实现签名和加密)
写在前面: angularJS是google公司主推的js开发优秀框架... 页面展示: 在应用中进行加密是普遍存在的,个人建议在前端实现加密签名(前端加密是否必要来自知乎:http://www.zh ...
- Android 综合揭秘 —— 全面剖释 Service 服务
引言 Service 服务是 Android 系统最常用的四大部件之一,Android 支持 Service 服务的原因主要目的有两个,一是简化后台任务的实现,二是实现在同一台设备当中跨进程的远程信息 ...
- Angular JS 学习笔记(自定义服务:factory,Promise 模式异步请求查询:$http,过滤器用法filter,指令:directive)
刚学没多久,作了一个小项目APP,微信企业号开发与微信服务号的开发,使用的是AngularJS开发,目前项目1.0版本已经完结,但是项目纯粹为了赶工,并没有发挥AngularJS的最大作用,这几天项目 ...
- JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫
JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接 ...
- 添加一个Android框架层的系统服务与实现服务的回调
2017-10-09 概述 所谓Android系统服务其本质就是一个通过AIDL跨进程通信的小Demo的延伸而已.按照 AIDL 跨进程通信的标准创建一套程序,将服务端通过系统进程来运行实现永驻内存, ...
- Android Service总结03 之被启动的服务 -- Started Service
Android Service总结03 之被启动的服务 -- Started Service 版本 版本说明 发布时间 发布人 V1.0 添加了Service的介绍和示例 2013-03-17 Sky ...
随机推荐
- OC中的类型强制转换
在Objective-C中,以数字格式组成的字符串经常需要转换为NSNumber对象后再使用.例如有一个字符串对象@"111.22",需要转为NSNumber对象,最简单的方法就是 ...
- .NET通用权限系统快速开发框架源代码
有兴趣的朋友欢迎加群讨论:312677516 一.开发技术:B/S(.NET C# ) 1.Windows XP以上 (支援最新Win 8) 2.Microsoft Visual Studio 201 ...
- Linux下which、whereis、locate、find 区别
我们经常在linux要查找某个文件或命令,但不知道放在哪里了,可以使用下面的一些命令来搜索.which 查看可执行文件的位置 whereis 查看文件的位置 locate 配合 ...
- float 覆盖元素的问题
<span class="right-span"><a href="/xxx/" class="btn">增加Ser ...
- if语句之有房么?有钱么?有能力么?
思路:1.如果有房,可以谈谈 2.如果没有房,问第二个条件有钱么,如果有,可以谈谈 3.如果没有房没有钱,则问第三个条件有能力么,如果有,可以谈谈 4.如果以上三个条件都没有,则拜拜 Console. ...
- 【Eclipse】修改项目访问名称
Properties --> Web Project Settings --> Context root --> 输入想要用的名称(默认是项目名)
- Opencv2系列学习笔记2(图像的其它操作)
本节主要涉及到图像的领域.算术操作以及如何操作图像感兴趣的区域. 一:邻域操作 以下例子主要对图像进行锐化.基于拉普拉斯算子<后面讨论>.这幅图像的边缘部分将得到放大,细节部分将更加的锐利 ...
- Python 模块续和面向对象的介绍(六)
一.基本模块 shutil 文件.目录.压缩包的处理模块 shutil.copyfile(src, dst) 拷贝文件 >>> shutil.copyfile('a.log','b. ...
- ZOJ 1450 Minimal Circle 最小圆覆盖
套了个模板直接上,貌似没有随机化序列 QAQ //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #in ...
- POJ2728 最小比率生成树/0-1分数规划/二分/迭代(迭代不会)
用01分数规划 + prime + 二分 竟然2950MS惊险的过了QAQ 前提是在TLE了好几次下过的 = = 题目意思:有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水,只要两个村庄之间有一 ...