大家好,又见面了,我是你们的朋友全栈君。
一、android service简介
1、Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。
2、在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务。例如,一个从service播放音乐的音乐播放器,应被设置为前台运行,因为用户会明确地注意它的运行.在状态栏中的通知可能会显示当前的歌曲并且允许用户启动一个activity来与音乐播放器交互。
3、在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activity中启动后台Service,通过Intent来启动,Intent中我们可以传递数据给Service,而当我们Service执行某些操作之后想要更新UI线程,我们应该怎么做呢?接下来我就介绍两种方式来实现Service与Activity之间的通信问题。
二.Android Service的实现
服务主要有以下两种形式:
1. Start
通过调用应用程序组件(例如Activity)的startService()方法来启动一个服务.一旦启动,服务就会在后台一直运行,即使应用程序组件此时被关闭.通常,已经启动的服务会处理一些单一功能,并且也不需要返回结果给调用者.例如,在网络上下载或上传文件.当服务的工作处理结束,才会自己关闭服务.
2. Bound
通过调用应用程序组件的bindService()方法来绑定一个服务.已绑定的服务会提供一个客户端-服务端交互接口.该接口主要用来与应用程序交互,发送请求,获取结果,甚至通过IPC来访问进程.只要一个程序组件绑定服务就会运行绑定服务,多个应用程序组件可以同时时间绑定一个服务.当所有的应用程序组件都解除绑定,该绑定服务器就会被销毁.
下面我们分别对”Started Service”和”Bound Servie”作一个介绍.
三、创建和配置service
1、要创建一个service,你必须创建一个Service类(或某个已存在的子类)的子类.在你的实现中,你应覆写一些处理有关service生命期的关键方面的回调方法并且提供一个能让组件绑定到service的机制(如果需要).你应覆写的最重要的回调方法是:
onStartCommand()
系统在其它组件比如activity通过调用startService()请求service启动时调用这个方法.一旦这个方法执行,service就启动并且在后台长期运行.如果你实现了它,你需要负责在service完成任务时停止它,通过调用stopSelf()或stopService().(如果你只想提供绑定,你不需实现此方法).
OnBind()
当组件调用bindService()想要绑定到service时(比如想要执行进程间通讯)系统调用此方法.在你的实现中,你必须提供一个返回一个IBinder来以使客户端能够使用它与service通讯,你必须总是实现这个方法,但是如果你不允许绑定,那么你应返回null.
OnCreate()
系统在service第一次创建时执行此方法,来执行只运行一次的初始化工作(在调用它方法如onStartCommand()或onBind()之前).如果service已经运行,这个方法不会被调用.
OnDestroy()
系统在service不再被使用并要销毁时调用此方法.你的service应在此方法中释放资源,比如线程,已注册的侦听器,接收器等等.这是service收到的最后一个调用.
如果一个组件通过调用startService()启动一个service(最终导致onStartCommand()被调用),之后service会保持运行,直到它通过stopSelf()停止自己或另外的组件调用stopService()停止它.
如果一个组件调用bindService()来创建service(onStartCommand()不会被调用),那么service只是运行在绑定期间.一旦service从所有的客户端解除绑定,系统就会杀了它.
2、在manifest中声明一个service
跟activity以及其它组件一样,你必须在你的应用的manifest文件中声明所有的service.
要声明你的service,添加一个元素作为元素的儿子.例如:
1 2 3 4 5 6 7 8 9 10 |
<MANIFEST ...> ... <SERVICE android:name= ".ExampleService" /> <INTENT-FILTER> </ACTION> </INTENT-FILTER> </APPLICATION> </MANIFEST> |
PS:
就像一个activity,一个service可以定义intent过滤器来使得其它组件使用明确的intent调用自己.通过声明intent过滤器,你设备上的任意应用中的组件都可以通过给startService()传递匹配的intent来启动你的sevice.
如果你打算只在本应用内使用自己的service,那么你不需指定任何intent过滤器.不使用intent过滤器,你必须使用一个明确指定service的类名的intent来启动你的service.
3、开始一个Service
服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。
使用startService()方法启用服务,访问者与服务之间没有关连,即使访问者退出了,服务仍然运行。
使用bindService()方法启用服务,访问者与服务绑定在了一起,访问者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。
采用Context.startService()方法启动服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
如果service没有提供绑定功能,传给startService()的intent是应用组件与service之间唯一的通讯方式.然而,如果你希望service回发一个结果,那么启动这个service的客户端可以创建一个用于广播(使用getBroadcast())的PendingIntent然后放在intent中传给service,service然后就可以使用广播来回送结果.
PS:两种方式启动服务的区别:
通过startService()和stopService()启动关闭服务。适用于服务和访问者之间没有交互的情况。如果服务和访问者之间需要方法调用或者传递参数,侧需要使用bindService()和unbindService()方法启动关闭服务。
采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法,这个时候访问者和服务绑定在一起。
如果访问者要与服务进行通信,那么,onBind()方法必须返回Ibinder对象。如果访问者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果访问者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()–>onDestroy()方法。
4、停止一个service
一个"启动的"service必须管理其自己的生命期.这表示,系统不会停止或销毁这种service,除非内存不够用了并且service在onStartCommand()返回后会继续运行.所以,service必须调用stopSelf()停止自己或由另一个组件调用stopService()来停止它.
一旦通过stopSelf()或stopService()发出了停止请求,系统就会尽可能快地销毁service.
然而,同时使用 startService 与 bindService 要注意到,Service 的终止,需要unbindService与stopService同时调用,才能终止 Service,不管 startService 与 bindService 的调用顺序,如果先调用 unbindService 此时服务不会自动终止,再调用 stopService 之后服务才会停止,如果先调用 stopService 此时服务也不会终止,而再调用 unbindService 或者 之前调用 bindService 的 Context 不存在了(如Activity 被 finish 的时候)之后服务才会自动停止;
注意:你的应用在完成工作后停止它所有的service是非常重要的.这可以避免浪费系统资源和消耗电量.如果需要,其它的组件可以调用stopService()停止service.即使你为service启用了绑定,你也必须自己停止service,甚至它收到了对onStartCommand()的调用也这样.
四、服务的生命周期回调方法
服务的生命周期跟启动服务的方法有关:
1、当采用Context.startService()方法启动服务,与之有关的生命周期方法
onCreate()–> onStart()–> onDestroy()
onCreate()该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,服务也只被创建一次。
onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方法尽管不会多次创建服务,但onStart() 方法会被多次调用。
onDestroy()该方法在服务被终止时调用。
2、 当采用Context.bindService()方法启动服务,与之有关的生命周期方法
onCreate()–> onBind() –> onUnbind() –> onDestroy()
onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。
onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。
如果先采用startService()方法启动服务,然后调用bindService()方法绑定到服务,再调用unbindService()方法解除绑定,最后调用bindService()方法再次绑定到服务,触发的生命周期方法如下:
onCreate()–>onStart()–>onBind()–>onUnbind()[重载后的方法需返回true–>onRebind()
下面这张流程图很好的诠释了”startService()”和”bindService()”两个方法调用的生命周期。
PS:
一个service的生命期比一个activity要简单得多.然而,你依然需要密切关注你的service是如何被创建又是如何被销毁的,因为一个service可以运行于后台而用户看不到它.
service的生命期—从它被创建到它被销毁—有两条路可走:
一个"启动的"service
在其它组件调用startService()时创建.然后service就长期运行并且必须调用stopSelf()自己停止自己.另一个组件也可以调用stZ喎�”http://www.2cto.com/kf/ware/vc/” target=”_blank” class=”keylink”>vcFNlcnZpY2UoKcC0zaPWucv8o661sXNlcnZpY2XNo9a5uvOjrM+1zbO+zc/6u9nL/KOuPGJyPgo8YnI+CtK7uPaw87aotcRzZXJ2aWNlPGJyPgqhoaGhtbHB7dK7uPbX6bz+KNK7uPa/zbuntssptffTw2JpbmRTZXJ2aWNlKCnKsbS0vaijrsi7uvO/zbuntsvNqLn90ru49klCaW5kZXK907/a0+tzZXJ2aWNlzajQxaOuv827p7bLv8nS1LX308N1bmJpbmRTZXJ2aWNlKCnNo9a5zajQxaOutuC49r/Nu6e2y7/J0tSw87aotb3NrNK7uPZzZXJ2aWNlsqLH0rWxy/nT0LXEv827p7bLtry94rP9sPO2qLrzo6zPtc2zvs3P+rvZtfTV4rj2c2VydmljZaOuKHNlcnZpY2Wyu9DozaPWudfUvLqjrik8YnI+Cjxicj4KoaGhodXiwb3M9cK3sqKyu8rHzerIq7fWwOu1xKOu0rK+zcrHo6zE48rHv8nS1LDztqi1vdPDc3RhcnRTZXJ2aWNlKCnG9LavtcRzZXJ2aWNltcSjrsD9yOejrNK7uPa688yo0vTA1nNlcnZpY2XU2s2ouf20q8jr1rjD99KqsqW3xbXE0vTA1rXEaW50ZW50wLS199PDc3RhcnRTZXJ2aWNlKCm688b0tq+jrtauuvOjrLWx08O7p8/rttSypbfFxve9+NDQ0rvQqbLZ1/e78tKqu/HIobWxx7C46Mf6tcTQxc+iyrGjrNK7uPZhY3Rpdml0eb/J0tTNqLn9tffTw2JpbmRTZXJ2aWNlKCmw87aotb1zZXJ2aWNlo67U2rTLx+m/9s/Co6xzdG9wU2VydmljZSgpu/JzdG9wU2VsZigpsru74dXm1f21xM2j1rlzZXJ2aWNlo6yz/bfHy/nT0LXEv827p7bLtrzIoc/7sPO2qMHLo648YnI+CjwvcD4KPHA+PGJyPgo8L3A+CjxwPjxzdHJvbmc+zuWhorS0vajSu7j2sPO2qLXEU2VydmljZTwvc3Ryb25nPjwvcD4KPHA+MaGi0qq0tL2o0ru49rDztqi1xHNlcnZpY2WjrMTjsdjQ68q1z9a72LX3t723qG9uQmluZCgpo6y7udKq1NrG5NbQt7W72NK7uPZJQmluZGVyo6zV4rj2SUJpbmRlcrao0uXBy9Prc2VydmljZc2o0ba1xL3Tv9qjrsbky/zTptPD1+m8/r7Nv8nS1NTa1q6687X308NiaW5kU2VydmljZSgpwLS908rV1eK49r3Tv9qyor+qyry199PDc2VydmljZbXEt723qKOuc2VydmljZda71NrT0NOm08PX6bz+sPO2qLW9y/zKsbLFu+7XxaOsy/nS1LWxw7vT0NfpvP6w87aotb3L/Mqxo6zPtc2zvs274WtpbGzL/CjE47K70OjIpc2j1rnSu7j2sPO2qLXEc2VydmljZaOsuPrTw29uU3RhcnRDb21tYW5kKCnG9LavtcRzZXJ2aWNlsrvSu9H5KaOuPGJyPgoyoaLSqrS0vajSu7j2sPO2qLXEc2VydmljZaOsytfPyNKq1/a1xL7Nyse2qNLlv827p7bLyOe6ztPrc2VydmljZc2o0ba1xL3Tv9qjrtXiuPa907/asdjQ68rHSUJpbmRlcrXE0ru49sq1z9ajrLKix9Kx2NDrsbu72LX3t723qG9uQmluZCgpt7W72KOu0ru1qb/Nu6e2y73TytW1vUlCaW5kZXKjrMv8vs2/ydLUv6rKvNPrc2VydmljZb340NC9u7ulo648YnI+CjOhorbguPa/zbuntsu/ydLU0rvG8LDztqi1vdK7uPZzZXJ2aWNlo661sdK7uPa/zbuntsvN6rPJ0+tzZXJ2aWNltcS9u7ulo6zL/LX308N1bmJpbmRTZXJ2aWNlKCnAtL3is/2w87aoo67Su7WpsrvU2dPQyM66zr/Nu6e2y7Dztqi1vXNlcnZpY2WjrM+1zbO+zWtpbGzV4rj2c2VydmljZaOuPC9wPgo8cD7PwsPmysfI57rOvajBosv8o7o8YnI+Cjxicj4KMaGi1NrE47XEc2VydmljZdbQo6y0tL2o0ru49kJpbmRlcsq1wP2jrMzhuanS1M/CyP3W1rmmxNzWrtK7o7o8YnI+Cjxicj4KICAgQmluZGVysPy6rNK70Km/ybmpv827p7bLtffTw7XEuau/qre9t6ijrjxicj4KPGJyPgogICC3tbvYtbHHsLXEU2VydmljZcq1wP2jrMv8vt/T0NK70Km/zbuntsu/ydLUtffTw7XEuau/qre9t6ijrjxicj4KPGJyPgogICC78tXfo6y3tbvYwe3Su7j2wOC1xMq1wP2jrNXiuPbA4L7f09C/zbuntsu/ybX308O1xLmrv6q3vbeosqLN0Lnc09pzZXJ2aWNlo648YnI+Cjxicj4KMqGi1Nq72LX3t723qG9uQmluZCgp1tC3tbvY1eK49kJpbmRlcrXEyrXA/aOuPGJyPgo8YnI+CjOhotTav827p7bLo6y007vYtfe3vbeob25TZXJ2aWNlQ29ubmVjdGVkKCnW0L3TytXV4rj2QmluZGVysqLKudPDo7HW0Mv5yva1xLmrv6q3vbeotffTw7DztqhzZXJ2aWNlo648YnI+CjwvcD4KPHA+PGJyPgo8L3A+CjxwPsD9yOejus/Cw+bV4rj2c2VydmljZczhuanIw7/Nu6e2y82ouf3Su7j2QmluZGVyyrXP1rX308NzZXJ2aWNl1tC1xLe9t6i1xLmmxNyjujwvcD4KPHByZSBjbGFzcz0=”brush:java;”>public class LocalService extends Service { // Binder given to clients private final IBinder mBinder = new LocalBinder(); // Random number generator private final Random mGenerator = new Random(); /** * 这里定义吧一个Binder类,用在onBind()有方法里,这样Activity那边可以获取到 * 在 Local Service 中我们直接继承 Binder 而不是 IBinder,因为 Binder 实现了 IBinder 接口,这样我们可以少做很多工作。 */ public class LocalBinder extends Binder { LocalService getService() { // 返回本service的实例到客户端,于是客户端可以调用本service的公开方法 return LocalService.this; } } @Override public IBinder onBind(Intent intent) { return mBinder; } /**客户端所要调用的方法*/ public int getRandomNumber() { return mGenerator.nextInt(100); } }
下面是一个绑定到LocalService并且在按钮按下时调用getRandomNumber()的actvity的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
public class BindingActivity extends Activity { LocalService mService; boolean mBound = false ; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); } @Override protected void onStart() { super .onStart(); // 绑定到类LocalService的实例 Intent intent = new Intent( this , LocalService. class ); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); } @Override protected void onStop() { super .onStop(); // 从service解除绑定 if (mBound) { unbindService(mConnection); mBound = false ; } } /** 当按钮按下时调用(在layout文件中定义的button并用android:onClick 属性指定响应到本方法) */ public void onButtonClick(View v) { if (mBound) { // 调用LocalService的一个方法 // 然而,如果这个调用中有挂起操作,那么这个请求应发 // 生在另一个线程来避免拉低activity的性能. int num = mService.getRandomNumber(); Toast.makeText( this , "number: " + num, Toast.LENGTH_SHORT).show(); } } /** 定义service绑定的回调,传给bindService() 的*/ private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { //我们已经绑定到了LocalService,把IBinder进行强制类型转换并且获取LocalService实例. LocalBinder binder = (LocalBinder) service; mService = binder.getService(); mBound = true ; } @Override public void onServiceDisconnected(ComponentName arg0) { mBound = false ; } }; } |
上面的例子展示了客户端如何使用一个ServiceConnection的实例和onServiceConnected()方法绑定到service.
PS:
1、应用组件(客户端)可以调用bindService()绑定到一个service.Android系统之后调用service的onBind()方法,它返回一个用来与service交互的IBinder.
2、绑定是异步的.bindService()会立即返回,它不会返回IBinder给客户端.要接收IBinder,客户端必须创建一个ServiceConnection的实例并传给bindService().ServiceConnection包含一个回调方法,系统调用这个方法来传递要返回的IBinder.
3、从你的客户端绑定到一个service,你必须:
1)实现ServiceConnection.
你的实现必须重写两个回调方法:
onServiceConnected()
系统调用这个来传送在service的onBind()中返回的IBinder.
OnServiceDisconnected()
Android系统在同service的连接意外丢失时调用这个.比如当service崩溃了或被强杀了.当客户端解除绑定时,这个方法不会被调用.
2)调用bindService(),传给它ServiceConnection的实现.
3)当系统调用你的onServiceConnected()方法时,你就可以使用接口定义的方法们开始调用service了.
4)要与service断开连接,调用unbindService().
当你的客户端被销毁,它将从service解除绑定,但是你必须总是在你完成与service的交互时或当你的activity暂停于是service在不被使用时可以关闭此两种情况下解除绑定.(下面会讨论更多在适当的时候绑定和解除绑定的问题.
4、使用这个ServiceConnection,客户端可以绑定到一个service,通过把它传给bindService().例如:
Intentintent = new Intent(this, LocalService.class);
bindService(intent,mConnection, Context.BIND_AUTO_CREATE);
第一个bindService()的参数是一个明确指定了要绑定的service的Intent.
第二个参数是ServiceConnection对象.
第三个参数是一个标志,它表明绑定中的操作.它一般应是BIND_AUTO_CREATE,这样就会在service不存在时创建一个.其它可选的值是BIND_DEBUG_UNBIND和BIND_NOT_FOREGROUND,不想指定时设为0即可.
bindService用于绑定一个服务。这样当bindService(intent,conn,flags)后,就会绑定一个服务。这样做可以获得这个服务对象本身,而用startService(intent)的方法只能启动服务。
bindService方式的一般过程:
①新建Service类BindService。在BindService类里新建内部类MyBinder,继承自Binder(Binder实现IBinder接口)。MyBinder提供方法返回BindService实例。
public class MyBinderextends Binder{
public BindService getService(){
return BindService.this;
}
}
实例化MyBinder得到mybinder对象;
重写onBind()方法:
@Override
public IBinder onBind(Intent intent) {
return mybinder;
}
②在Activity里,实例化ServiceConnection接口的实现类,重写onServiceConnected()和onServiceDisconnected()方法
ServiceConnection conn=new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
③在Activity的onCreate()方法里,新建Intent,并绑定服务
Intent intent=new Intent(MainActivity.this,BindService.class);
bindService(intent, conn,BIND_AUTO_CREATE);
④在Activity的onDestroy里面,添加
unbindService(conn);
如果不加这一步,就会报android.app.ServiceConnectionLeaked: ******.MainActivity has leaked ServiceConnection的异常。
bindService()的执行过程如下:
bindService(intent,conn,flag)->Service:onCreate()->Service:onBind()->Activity:onServiceConnected()
Service的onServiceConnected没有被调用
Service是一种运行在后台的服务,一般很少与用户交互,所以没有可视化界面。
我们可以通过startService() 或者使用bindService()方法来绑定一个存在的service。
bindService是异步调用和Service进行绑定, 如果绑定成功, 则会调用ServiceConnection的onServiceConnected
当调用bindService方法后就会回调Activity的onServiceConnected,在这个方法中会向Activity中传递一个IBinder的实例,Acitity需要保存这个实例
在Service中需要创建一个实现IBinder的内部类(这个内部类不一定在Service中实现,但必须在Service中创建它)。
在OnBind()方法中需返回一个IBinder实例,不然onServiceConnected方法不会调用。
- </pre><pre name=“code” class=“java”>
- import android.app.Activity;
- import android.content.ComponentName;
- import android.content.Intent;
- import android.content.ServiceConnection;
- import android.os.Bundle;
- import android.os.IBinder;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.Toast;
- public class ServiceActivity extends Activity {
- /** Called when the activity is first created. */
- private Button start;
- private Button stop;
- private Button bind;
- private Button unbind;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- start =(Button) findViewById(R.id.start);
- stop = (Button) findViewById(R.id.stop);
- bind = (Button) findViewById(R.id.bind);
- unbind = (Button) findViewById(R.id.unbind);
- //启动一个service
- start.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- Intent intent = new Intent();
- System.out.println(“start….”);
- intent.setAction(“com.shao.service.action.MyService”);
- startService(intent);
- }
- });
- //结束一个service
- stop.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- Intent intent = new Intent();
- System.out.println(“stop….”);
- intent.setAction(“com.shao.service.action.MyService”);
- stopService(intent);
- }
- });
- //绑定一个service
- bind.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- Intent intent = new Intent();
- System.out.println(“bind..”);
- intent.setAction(“com.shao.service.action.MyService”);
- bindService(intent, conn, BIND_AUTO_CREATE);
- }
- });
- //解除绑定的service
- unbind.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- Intent intent = new Intent();
- System.out.println(“unbind..”);
- intent.setAction(“com.shao.service.action.MyService”);
- unbindService(conn);
- }
- });
- }
- private ServiceConnection conn = new ServiceConnection() {
- @Override
- public void onServiceDisconnected(ComponentName arg0) {
- // TODO Auto-generated method stub
- Toast.makeText(ServiceActivity.this,“disconn successful” ,Toast.LENGTH_LONG);
- }
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- // TODO Auto-generated method stub
- Toast.makeText(ServiceActivity.this,“conn successful” ,Toast.LENGTH_LONG);
- }
- };
- }
public class ServiceActivity extends Activity {
/** Called when the activity is first created. */
private Button start;
private Button stop;
private Button bind;
private Button unbind;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
start =(Button) findViewById(R.id.start);
stop = (Button) findViewById(R.id.stop);
bind = (Button) findViewById(R.id.bind);
unbind = (Button) findViewById(R.id.unbind);
//启动一个service
start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent();
System.out.println(“start….”);
intent.setAction(“com.shao.service.action.MyService”);
startService(intent);
}
});
//结束一个service
stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent();
System.out.println(“stop….”);
intent.setAction(“com.shao.service.action.MyService”);
stopService(intent);
}
});
//绑定一个service
bind.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent();
System.out.println(“bind..”);
intent.setAction(“com.shao.service.action.MyService”);
bindService(intent, conn, BIND_AUTO_CREATE);
}
});
//解除绑定的service
unbind.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent();
System.out.println(“unbind..”);
intent.setAction(“com.shao.service.action.MyService”);
unbindService(conn);
}
});
}
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
Toast.makeText(ServiceActivity.this,”disconn successful” ,Toast.LENGTH_LONG);
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
Toast.makeText(ServiceActivity.this,”conn successful” ,Toast.LENGTH_LONG);
}
};
}
- </pre><p></p><p>MyService文件:</p><p></p><pre name=“code” class=“java”>
- import android.app.Service;
- import android.content.Intent;
- import android.os.Binder;
- import android.os.IBinder;
- import android.os.Parcel;
- import android.widget.Toast;
- public class MyService extends Service {
- @Override
- public IBinder onBind(Intent intent) {
- // TODO Auto-generated method stub
- System.out.println(“onBind…..”);
- IBinder result = null;
- if ( null == result ) result = new MyBinder() ;
- Toast.makeText(this, “onBind”,Toast.LENGTH_LONG);
- return result;
- }
- @Override
- public void onCreate() {
- // TODO Auto-generated method stub
- super.onCreate();
- System.out.println(“onCreate…..”);
- Toast.makeText(this, “onCreate”,Toast.LENGTH_LONG);
- }
- @Override
- public void onDestroy() {
- // TODO Auto-generated method stub
- super.onDestroy();
- System.out.println(“onDestory…..”);
- Toast.makeText(this, “onDestroy”,Toast.LENGTH_LONG);
- }
- @Override
- public void onStart(Intent intent, int startId) {
- // TODO Auto-generated method stub
- super.onStart(intent, startId);
- System.out.println(“onStart…”);
- Toast.makeText(this, “onStart”,Toast.LENGTH_LONG);
- }
- public class MyBinder extends Binder {
- //此方法是为了可以在Acitity中获得服务的实例
- public MyService getService() {
- return MyService.this;
- }
- }
- }
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
System.out.println(“onBind…..”);
IBinder result = null;
if ( null == result ) result = new MyBinder() ;
Toast.makeText(this, “onBind”,Toast.LENGTH_LONG);
return result;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
System.out.println(“onCreate…..”);
Toast.makeText(this, “onCreate”,Toast.LENGTH_LONG);
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
System.out.println(“onDestory…..”);
Toast.makeText(this, “onDestroy”,Toast.LENGTH_LONG);
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
System.out.println(“onStart…”);
Toast.makeText(this, “onStart”,Toast.LENGTH_LONG);
}
public class MyBinder extends Binder {
//此方法是为了可以在Acitity中获得服务的实例
public MyService getService() {
return MyService.this;
}
}
}
Service需在mainifest文件中声明:
<service android:name=”MyService”>
<intent-filter>
<action android:name=”com.shao.service.action.MyService”/>
</intent-filter>
</service>
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/134551.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...