一、Service(服务)
Service是Android程序中四大基础组件之一,它和Activity一样都是Context的子类,区别在于它没有UI界面,是在后台运行的组件。
public abstract class
Service
extends ContextWrapper
implements ComponentCallbacks
java.lang.Object
↳ android.content.Context
↳ android.content.ContextWrapper
↳ android.app.Service
二、Service启动方法+相应的生命周期
Service的生命周期并不是固定的,而是要看启动Service的方式。
而启动Service的方式又分为两种startService和bindService
1、 StartService(启动运行在后台的服务,所谓后台即没有界页;作为四大组件之一,其是运行在主线程中的)
启动时:
Context.startService(intent)-->onCreate()àonStartCommand ()
停止时:
Context_stopService(intent)-->onDestroy()
使用方法:
(1)、创建一个自定义服务类继承Service,实现抽象方法
(2)、清单文件中注册自定义的服务类
(3)、在activity中通过startService和 stopService()
看一个Demo
1 package com.example.demo01;
2
3 import android.app.Activity;
4 import android.content.Intent;
5 import android.os.Bundle;
6 import android.util.Log;
7 import android.view.View;
8
9 public class MainActivity extends Activity {
10 @Override
11 protected void onCreate(Bundle savedInstanceState) {
12 // TODO Auto-generated method stub
13 super.onCreate(savedInstanceState);
14 setContentView(R.layout.activity_main);
15
16 }
17
18 public void btn_startService(View view)
19 {
20 Intent intent = new Intent(this,MyService.class);
21 intent.putExtra("info", "这里是传送的数据");
22 startService(intent);
23 Log.i("activity", "开启服务");
24
25 }
26 public void btn_closeService(View view)
27 {
28 Intent intent = new Intent(this,MyService.class);
29 Log.i("activity", "关闭服务");
30 stopService(intent);
31 }
32 }
1 package com.example.demo01;
2
3 import android.app.Service;
4 import android.content.Intent;
5 import android.os.IBinder;
6 import android.util.Log;
7
8 public class MyService extends Service{
9
10 @Override
11 public void onCreate() {
12 // TODO Auto-generated method stub
13 super.onCreate();
14 Log.i("MyService", "--->onCreate");
15
16 }
17
18 @Override
19 public IBinder onBind(Intent intent) {
20 // TODO Auto-generated method stub
21 Log.i("MyService", "--->onBind");
22
23 return null;
24 }
25
26 @Override
27 public int onStartCommand(Intent intent, int flags, int startId) {
28 // TODO Auto-generated method stub
29 Log.i("MyService", "--->onStartCommand");
30
31 String str = intent.getStringExtra("info");
32 Log.i("MyService", "自定义服务MyService被activity启动并收到了activity发送过来信息:"+str);
33
34 return super.onStartCommand(intent, flags, startId);
35 }
36
37 @Override
38 public void onDestroy() {
39 // TODO Auto-generated method stub
40 super.onDestroy();
41 Log.i("MyService", "--->onDestroy");
42 }
43
44
45 }
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:orientation="vertical"
6 >
7
8 <Button
9 android:onClick="btn_startService"
10 android:text="开启服务并发送消息"
11 android:layout_width="wrap_content"
12 android:layout_height="wrap_content">
13
14
15 </Button>
16 <Button
17 android:onClick="btn_closeService"
18 android:text="关闭服务"
19 android:layout_width="wrap_content"
20 android:layout_height="wrap_content">
21
22
23 </Button>
24 </LinearLayout>
清单文件注册自定义的服务类
1 <service android:name="com.example.demo01.MyService"></service>
点击两次开启服务按钮,然后点击一次关闭服务按钮,
可见第一次开启服务的时候执行onCreate()服务, 再执行onStartCommand()方法,
当第二次开启服务的时候,则不再执行onCreate()方法,直接执行onStartCommand
当关闭服务的时候,执行onDestroy()方法
2、BindService(基于IBinder方式将两个组件进行绑定,然后相互传值,如果以绑定的方式启动的服务,在解除绑定时也会自动停止服务)
绑定时:
bindService-->onCreate()-->onBind()
解绑时:
unbindService-->onUnbind()-->onDestory()
使用方法:
(1)、创建一个自定义服务类继承Service,实现onBind()方法
(2)、创建Bindler的子类
(3)、在onBind()方法中返回自定义Bindler子类的对象
(4)、清单文件中组册自定义服务
(5)、创建ServiceConnection接口对象,实现 onServiceConnected()方法和 onServiceDisconnected方法
(6)、在activity中绑定bindService和解绑服务unbindService
Demo
1 package com.example.demo02;
2
3 import android.app.Service;
4 import android.content.Intent;
5 import android.os.Binder;
6 import android.os.IBinder;
7 import android.util.Log;
8
9 public class MyService extends Service{
10
11 private MyBinder binder ;
12
13
14 @Override
15 public IBinder onBind(Intent intent) {
16 // TODO Auto-generated method stub
17 Log.i("service", "-->onBind");
18 return new MyBinder();
19 }
20
21 @Override
22 public void onCreate() {
23 // TODO Auto-generated method stub
24 Log.i("service", "-->onCreate");
25 super.onCreate();
26 }
27
28 @Override
29 public int onStartCommand(Intent intent, int flags, int startId) {
30 // TODO Auto-generated method stub
31 Log.i("service", "-->onStartCommand");
32 return super.onStartCommand(intent, flags, startId);
33 }
34
35 @Override
36 public void onDestroy() {
37 // TODO Auto-generated method stub
38 Log.i("service", "-->onDestroy");
39 super.onDestroy();
40 }
41
42 class MyBinder extends Binder{
43 public void function(){
44 Log.i("service", "Binder-->function");
45
46 }
47
48 }
49
50 }
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:orientation="vertical"
6 >
7
8 <Button
9 android:layout_width="wrap_content"
10 android:layout_height="wrap_content"
11 android:text="绑定服务"
12 android:onClick="btn_bindService"
13 />
14 <Button
15 android:layout_width="wrap_content"
16 android:layout_height="wrap_content"
17 android:text="解绑服务"
18 android:onClick="btn_unbindService"
19 />
20 <Button
21 android:layout_width="wrap_content"
22 android:layout_height="wrap_content"
23 android:text="执行自定义Binder子类的function方法"
24 android:onClick="btn_Binder"
25 />
26
27
28 </LinearLayout>
清单文件注册:
<service android:name="com.example.demo02.MyService"></service>
一共三个按钮
当点击“绑定服务”按钮时 执行
当点击“执行自定义Binder子类的function方法”按钮时 执行
当点击“解绑服务”按钮时 执行
BIND_AUTO_CREATE标识表示:绑定的服务组件如果不存,则会自动创建, 由bindService方式启动的Service,其生命周期会受到绑定组件的影响,即当绑定组件Activity销毁时,Service也会停止