Service的简介和启动方式

一.Service的简介****
1.Service****介绍和作用
Service是Android系统中的四大组件之一,它是一种长生命周期的,没有可视化界面,运行于后台的一种服务程序。比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当退出播放音乐的应用,如果不用Service,我 们就听不到歌了,所以这时候就得用到Service了。

2.Service生命周期****
Service的生命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法。

二.Service的启动方式****
Service的有两种启动方式:Context.startService()和Context.bindService(),这两种方式对Service生命周期的影响是不同的。

1.Context.startService()方式启动

**①Context.startService()方式的生命周期: **启动时,startService –> onCreate() –> onStart()停止时,stopService –> onDestroy()
如果调用者直接退出而没有停止Service,则Service 会一直在后台运行

Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。

②Context.startService()方式启动 Service的方法:

下面是具体例子:

MainActivity.java

package com.android.service.activity;  
 
import android.app.Activity;  
import android.content.Intent;  
import android.os.Bundle;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
 
public class MainActivity extends Activity  
{  
private Button startBtn;  
private Button stopBtn;  
@Override 
public void onCreate(Bundle savedInstanceState)  
{  
super.onCreate(savedInstanceState);  
setContentView(R.layout.main);  
startBtn = (Button) findViewById(R.id.startBtn);  
stopBtn = (Button) findViewById(R.id.stopBtn);  
//添加监听器  
startBtn.setOnClickListener(listener);  
stopBtn.setOnClickListener(listener);  
}  
  
//启动监听器  
private OnClickListener listener=new OnClickListener()  
{ 
@Override 
public void onClick(View v)  
{  
Intent intent=new Intent(MainActivity.this, ServiceDemo.class);  
switch (v.getId())  
{  
case R.id.startBtn:  
startService(intent);  
break;  
case R.id.stopBtn:  
stopService(intent);  
break;  
default:  
break;  
} 
}  
};  
} 

ServiceDemo.java

package com.android.service.activity;  
 
import android.app.Service;  
import android.content.Intent;  
import android.os.IBinder;  
import android.util.Log;  
 
public class ServiceDemo extends Service  
{  
private static final String TAG="Test";  
  
@Override 
//Service时被调用  
public void onCreate()  
{  
Log.i(TAG, "Service onCreate--->");  
super.onCreate();  
}  
 
@Override 
//当调用者使用startService()方法启动Service时,该方法被调用  
public void onStart(Intent intent, int startId)  
{  
Log.i(TAG, "Service onStart--->");  
super.onStart(intent, startId);  
}  
 
@Override 
//当Service不在使用时调用  
public void onDestroy()  
{  
Log.i(TAG, "Service onDestroy--->");  
super.onDestroy();  
}  
 
@Override 
//当使用startService()方法启动Service时,方法体内只需写return null  
public IBinder onBind(Intent intent)  
{  
return null;  
}  
}  

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<Button 
android:id="@+id/startBtn" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:text="启动 Service" 
/> 
<Button 
android:id="@+id/stopBtn" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:text="停止 Service" 
/> 
</LinearLayout> 

在AndroidManifest.xml文件中添加16~21行的声明

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  package="com.android.service.activity" 
  android:versionCode="1" 
  android:versionName="1.0"> 
<uses-sdk android:minSdkVersion="10" /> 
 
<application android:icon="@drawable/icon" android:label="@string/app_name"> 
<activity android:name=".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> 
<service android:name=".ServiceDemo" >
 <intent-filter> 
<action android:name="android.intent.action.MAIN" /> 
<category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 
</service>
</application> 
</manifest> 

效果图:


当点击
按钮时,先后执行了Service中onCreate()->onStart()这两个方法,LogCat显示如下:

当点击
按钮时,Service则执行了onDestroy()方法,LogCat显示如下:

当点击
按钮,进入Settings(设置)->Applications(应用)->Running Services(正在运行的服务)看一下我们新启动了的服务,效果图如下:

2****.Context.bindService()****方式启动:

**①Context.bindService()方式的生命周期: **绑定时,bindService -> onCreate() –> onBind()
调用者退出了,即解绑定时,Srevice就会unbindService –>onUnbind() –> onDestory()

用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。

②Context.bindService()方式启动 Service的方法:
绑定Service需要三个参数:bindService(intent, conn, Service.BIND_AUTO_CREATE);
第一个:Intent对象
第二个:ServiceConnection对象,创建该对象要实现它的onServiceConnected()和 onServiceDisconnected()来判断连接成功或者是断开连接
第三个:如何创建Service,一般指定绑定的时候自动创建
下面是具体的例子:
MainActivity.java

package com.android.bindservice.activity;  
 
import android.app.Activity;  
import android.app.Service;  
import android.content.ComponentName;  
import android.content.Intent;  
import android.content.ServiceConnection;  
import android.os.Bundle;  
import android.os.IBinder;  
import android.util.Log;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
 
public class MainActivity extends Activity {  
// 声明Button  
private Button startBtn,stopBtn,bindBtn,unbindBtn;  
@Override 
public void onCreate(Bundle savedInstanceState) {  
super.onCreate(savedInstanceState);  
// 设置当前布局视图  
setContentView(R.layout.main);  
// 实例化Button  
startBtn = (Button)findViewById(R.id.startBtn1);  
stopBtn = (Button)findViewById(R.id.stopBtn2);  
bindBtn = (Button)findViewById(R.id.bindBtn3);  
unbindBtn = (Button)findViewById(R.id.unbindBtn4);  
  
// 添加监听器  
startBtn.setOnClickListener(startListener);  
stopBtn.setOnClickListener(stopListener);  
bindBtn.setOnClickListener(bindListener);  
unbindBtn.setOnClickListener(unBindListener);  
  
}  
// 启动Service监听器  
private OnClickListener startListener = new OnClickListener() {  
@Override 
public void onClick(View v) {  
// 创建Intent  
Intent intent = new Intent();  
// 设置Class属性  
intent.setClass(MainActivity.this, BindService.class);  
// 启动该Service  
startService(intent);  
}  
};  
  
// 停止Service监听器  
private OnClickListener stopListener = new OnClickListener() {  
@Override 
public void onClick(View v) {  
// 创建Intent  
Intent intent = new Intent();  
// 设置Class属性  
intent.setClass(MainActivity.this, BindService.class);  
// 启动该Service  
stopService(intent);  
}  
};  
  
   // 连接对象  
   private ServiceConnection conn = new ServiceConnection() {  
@Override 
public void onServiceConnected(ComponentName name, IBinder service) {  
Log.i("Service", "连接成功!");  
}  
@Override 
public void onServiceDisconnected(ComponentName name) {  
Log.i("Service", "断开连接!");  
}  
};  
  
// 綁定Service监听器  
private OnClickListener bindListener = new OnClickListener() {  
@Override 
public void onClick(View v) {  
// 创建Intent  
Intent intent = new Intent();  
// 设置Class属性  
intent.setClass(MainActivity.this, BindService.class);  
   
// 绑定Service  
bindService(intent, conn, Service.BIND_AUTO_CREATE);  
}  
};  
  
// 解除绑定Service监听器  
private OnClickListener unBindListener = new OnClickListener() {  
@Override 
public void onClick(View v) {  
// 创建Intent  
Intent intent = new Intent();  
// 设置Class属性  
intent.setClass(MainActivity.this, BindService.class);  
// 解除绑定Service  
unbindService(conn);  
}  
};
} 

BindService.java

package com.android.bindservice.activity;  
 
import android.app.Service;  
import android.content.Intent;  
import android.os.IBinder;  
import android.util.Log;  
 
public class BindService extends Service{  
  
private static final String TAG="Test";  
  
//返回null  
public IBinder onBind(Intent intent) {  
Log.i(TAG, "Service onBind--->");  
return null;  
}  
// Service创建时调用  
public void onCreate() {  
Log.i(TAG, "Service onCreate--->");  
}  
// 当客户端调用startService()方法启动Service时,该方法被调用  
public void onStart(Intent intent, int startId) {  
Log.i(TAG, "Service onStart--->");  
}  
// 当Service不再使用时调用  
public void onDestroy() {  
Log.i(TAG, "Service onDestroy--->");  
}  
// 当解除绑定时调用  
public boolean onUnbind(Intent intent) {
Log.i(TAG, "Service onUnbind--->");
return super.onUnbind(intent);
}
}  

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<Button   
android:text="启动Service"   
android:id="@+id/startBtn1"   
android:layout_width="match_parent"   
android:layout_height="wrap_content" 
/>
<Button   
android:text="停止Service"   
android:id="@+id/stopBtn2"   
android:layout_width="match_parent"   
android:layout_height="wrap_content" 
/>
<Button   
android:text="绑定Service"   
android:id="@+id/bindBtn3"   
android:layout_width="match_parent"   
android:layout_height="wrap_content" 
/> 
<Button   
android:text="解除绑定"   
android:id="@+id/unbindBtn4"   
android:layout_width="match_parent"   
android:layout_height="wrap_content" 
/> 
</LinearLayout> 

在AndroidManifest.xml文件中添加16~21行的声明

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  package="com.android.bindservice.activity" 
  android:versionCode="1" 
  android:versionName="1.0"> 
<uses-sdk android:minSdkVersion="10" /> 
 
<application android:icon="@drawable/icon" android:label="@string/app_name"> 
<activity android:name=".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> 
<service android:name=".BindService" >
 <intent-filter> 
<action android:name="android.intent.action.MAIN" /> 
<category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 
</service> 
</application> 
</manifest> 

效果图:


当点击
按钮时,先后执行了Service中onCreate()->onStart()这两个方法,LogCat显示如下:

当点击
按钮,则Service执行了onUnbind()方法,LogCat显示如下:

当点击
按钮,则Service执行了onUnbind()方法,LogCat显示如下:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

  • 引言: 毕业之后,我开始从事IT行业,从一个什么都不懂的小子,变成现在技术算中等的IT人员。Android 工程师...
    IT码哥阅读 635评论 0 2
  • Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发...
    mm_cuckoo阅读 2,503评论 1 3
  • Service 理解 Service是什么? Service 作为android系统的四大组件之一,是一种可以在后...
    johnnycmj阅读 9,290评论 0 7
  • 2015年4月16号,小外甥Joey与这个世界见面了,我成了真正的小阿姨,第一次见到他的时候那种神奇的感觉...
    娄二喜阅读 201评论 4 3
  • 参考为什么说读书量计划是一种不聪明且勤奋的行为? - 简书SQ3R阅读 - 简书拒绝一心多用的学习工作方式
    鸭梨山大哎阅读 289评论 2 5