Android Service 入门
说明
Service 工作在主进程上。生命周期图

两种状态
Started
比如Activity通过调用startService 方法。一旦被启动(Started),服务就永久在后台运行,即使创建他的Activity被销毁。
Bound
当一个Component通过调用bindService方法来绑定该服务。服务提供接口让组件和服务交互。
回调方法说明
onStartCommand 其他组件通过调用startService时,被调用,如果实现该方法,需要调用stopSelf或者stopService来结束服务。
onBind 其他组件通过调用bindService时,被调用。需要实现接口,返回IBinder对象,让Client和服务交互。如果不绑定服务,返回null
onUnbind 所有已经绑定的组件断开
onCreate创建服务只有一次。
onDestroy服务被销毁时调用,这里应该清理相应资源。
例子1:
主界面两个按钮

Activity对应的两个方法
public void startService(View view)
{ startService(new Intent(getBaseContext(), MyService.class));
}
public void stopService(View view)
{
stopService(new Intent(getBaseContext(), MyService.class));
}
服务类的内容
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Servcie Started", Toast.LENGTH_LONG).show();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service Destroyed", Toast.LENGTH_SHORT).show();
}
}
然后在AndroidManifest.xml中添加

运行效果
点击启动服务

点击停止服务

例子2:使用绑定服务,并且在Activity中调用Service的内部类的方法
在例子1的基础上
public class MyService extends Service {
public static final String SERVICE_LOG = "service_LOG";
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.d(SERVICE_LOG, "MyServic Bound");
return new Mybind();
}
@Override
public boolean onUnbind(Intent intent) {
Log.d(SERVICE_LOG, "MyService Unbound");
return super.onUnbind(intent);
}
@Override
public void onCreate() {
super.onCreate();
Log.d(SERVICE_LOG, "Myservice created");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(SERVICE_LOG, "Myservice Started");
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(SERVICE_LOG, "MyService destroyed");
}
public class Mybind extends Binder
{
public void getString() {
Log.d(SERVICE_LOG, "============> get a string");
}
}
}
主要变化,新增内部类Mybind,并且在onBind返回Mybind对象。
Activity中新增

.
新增代码
private MyService.Mybind mybind;
private ServiceConnection connection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
mybind = (MyService.Mybind) iBinder;
mybind.getString();
} @Override
public void onServiceDisconnected(ComponentName componentName) { }
};
public void BindService(View view) {
Intent bindIntent = new Intent(LoginActivity.this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE);
} public void UnbindService(View view) {
unbindService(connection);
}
全部代码
public class LoginActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_login);
}
public void startService(View view)
{startService(new Intent(getBaseContext(), MyService.class));
}
public void stopService(View view)
{
stopService(new Intent(getBaseContext(), MyService.class));
}
private MyService.Mybind mybind;
private ServiceConnection connection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
mybind = (MyService.Mybind) iBinder;
mybind.getString();
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};
public void BindService(View view) {
Intent bindIntent = new Intent(LoginActivity.this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE);
}
public void UnbindService(View view) {
unbindService(connection);
}
}
运行效果
A测试
点击绑定服务,此时创建服务,然后绑定服务,
Myservice created
MyService Bound
============> get a string
点击解除绑定(解绑之后,再点击解绑,程序会崩溃)
MyService Unbound
MyService destroyed
如果Activity销毁,服务同样自动解绑,销毁。
B测试
点击启动服务
Myservice created
Myservice Started
点击绑定服务
MyServic Bound
============> get a string
点击解除绑定
MyService Unbound
因为是通过startService创建的后台Service,不会销毁。
如果有client绑定,点击“停止服务”,service 不会停止,一旦所有client解除绑定,因为已经点击过“停止服务”,此时服务停止。
Android Service 入门的更多相关文章
- [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解
原文链接:Hello, Android Multiscreen_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android Multiscreen深入理解. 本 ...
- android service 本地 远程 总结
android编写Service入门 android SDK提供了Service,用于类似*nix守护进程或者windows的服务. Service有两种类型: 本地服务(Local Service) ...
- Android开发入门要点记录:四大组件
cocos2dx跨平台开发中需要了解android开发,昨天快速的浏览了一本Android开发入门教程,因为之前也似懂非懂的写过Activity,Intent,XML文件,还有里面许多控件甚至编程思想 ...
- [译]:Xamarin.Android开发入门——Hello,Android深入理解
返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...
- [译]:Xamarin.Android开发入门——Hello,Android快速上手
返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...
- android service两种启动方式
android service的启动方式有以下两种: 1.Context.startService()方式启动,生命周期如下所示,启动时,startService->onCreate()-> ...
- 1、Android Studio集成极光推送(Jpush) 报错 java.lang.UnsatisfiedLinkError: cn.jpush.android.service.PushProtoco
Android studio 集成极光推送(Jpush) (华为手机)报错, E/JPush: [JPushGlobal] Get sdk version fail![获取sdk版本失败!] W/Sy ...
- Android Service完全解析,关于服务你所需知道的一切(下)
转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要 ...
- Android Service完全解析,关于服务你所需知道的一切(上)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的A ...
随机推荐
- springboot2.0入门(四)----mock模拟测试+单元测试
一.本节主要记录模拟测试.单元测试: 二.mock 测试 1.1什么是Mock? 在面向对象程序设计中,模拟对象(英语:mock object,也译作模仿对象)是以可控的方式模拟真实对象行为的假的对象 ...
- [ERROR ] The Salt Master has cached the public key for this node, this salt minion will wait for 10 seconds before attempting to re-authenticate
2.salt master已缓存此节点的公钥,此salt minion将等待10秒,然后再尝试重新验证. [ERROR ] The Salt Master has cached the public ...
- Vue : Select
<template> <div> <select v-model="mychoice"> <option value="html ...
- Java项目出现的问题--实际项目01
1 从Excel中导入指纹图谱数据异常 在导入指纹图谱时对Excel的规范是有限制的,有时候报空指针异常是因为虽然有些地方看起来没有内容但是可能有空格键:解决方法是新建一个Excel表,把要用到的 ...
- Codeforces Round #580 (Div. 2)
这次比上次多A了一道,但做得太慢,rating还是降了. Problem A Choose Two Numbers 题意:给出两个集合A,B,从A,B中分别选出元素a,b使得a+b既不属于集合A,又不 ...
- pyqt5的简单进度条程序
# -*- coding: utf-8 -*- # @Author : FELIX # @Date : 2018/5/17 16:43 from PyQt5.QtCore import QBasicT ...
- git避免提交本地配置文件-来自同事的分享
在项目协作中,对于已经更改的文件,不同的开发者常常需要根据自己的需要对文件进行更改已满足本地开发环境的需求(这种情况很常见,一般是对项目相关的配置项的更改,对业务逻辑代码的更改一般都是正常的协作编码过 ...
- codeforces555E
Case of Computer Network CodeForces - 555E Andrewid the Android is a galaxy-known detective. Now he ...
- windows下安装MongoDB服务
1,参考:https://www.cnblogs.com/lecaf/p/mongodb.html 2,要设置环境变量 3,设置用户 use admin 注:MongoDB安装好以后由默认的admi ...
- 黑马vue---16、vue中通过属性绑定为元素设置class类样式
黑马vue---16.vue中通过属性绑定为元素设置class类样式 一.总结 一句话总结: 这里就是为元素绑定class样式,和后面的style样式区别一下 vue中class样式绑定方式的相对于原 ...