Android中bindService的使用方法

Android中bindService的使用方法bindService用于绑定一个服务。这样当bindService(intent,conn,flags)后,就会绑定一个服务。这样做可以获得这个服务对象本身,而用startService(intent)的方法只能启动服务。   bindService方式的一般过程:①新建Service类BindService。在BindService类里新建内部类MyBinder,继承自Bind

大家好,又见面了,我是你们的朋友全栈君。

一、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方法不会调用。

  1. </pre><pre name=“code” class=“java”>  
  2. import android.app.Activity;  
  3. import android.content.ComponentName;  
  4. import android.content.Intent;  
  5. import android.content.ServiceConnection;  
  6. import android.os.Bundle;  
  7. import android.os.IBinder;  
  8. import android.view.View;  
  9. import android.view.View.OnClickListener;  
  10. import android.widget.Button;  
  11. import android.widget.Toast;  
  12.   
  13. public class ServiceActivity extends Activity {  
  14.     /** Called when the activity is first created. */  
  15.     private Button start;  
  16.     private Button stop;  
  17.     private Button bind;  
  18.     private Button unbind;  
  19.       
  20.     @Override  
  21.     public void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.         setContentView(R.layout.main);  
  24.         start  =(Button) findViewById(R.id.start);  
  25.         stop = (Button) findViewById(R.id.stop);  
  26.         bind  = (Button) findViewById(R.id.bind);  
  27.         unbind  = (Button) findViewById(R.id.unbind);  
  28.         //启动一个service   
  29.         start.setOnClickListener(new OnClickListener() {  
  30.               
  31.             @Override  
  32.             public void onClick(View arg0) {  
  33.                 // TODO Auto-generated method stub  
  34.             Intent intent = new Intent();  
  35.             System.out.println(“start….”);  
  36.             intent.setAction(“com.shao.service.action.MyService”);  
  37.             startService(intent);  
  38.             }  
  39.         });  
  40.         //结束一个service    
  41.         stop.setOnClickListener(new OnClickListener() {  
  42.               
  43.             @Override  
  44.             public void onClick(View arg0) {  
  45.                 // TODO Auto-generated method stub  
  46.             Intent intent = new Intent();  
  47.             System.out.println(“stop….”);  
  48.             intent.setAction(“com.shao.service.action.MyService”);  
  49.             stopService(intent);  
  50.             }  
  51.         });  
  52.           
  53.       //绑定一个service  
  54.      bind.setOnClickListener(new OnClickListener() {  
  55.               
  56.             @Override  
  57.             public void onClick(View arg0) {  
  58.                 // TODO Auto-generated method stub  
  59.             Intent intent = new Intent();  
  60.             System.out.println(“bind..”);  
  61.             intent.setAction(“com.shao.service.action.MyService”);  
  62.             bindService(intent, conn, BIND_AUTO_CREATE);  
  63.             }  
  64.         });  
  65.      //解除绑定的service  
  66.      unbind.setOnClickListener(new OnClickListener() {  
  67.               
  68.             @Override  
  69.             public void onClick(View arg0) {  
  70.                 // TODO Auto-generated method stub  
  71.             Intent intent = new Intent();  
  72.             System.out.println(“unbind..”);  
  73.             intent.setAction(“com.shao.service.action.MyService”);  
  74.             unbindService(conn);  
  75.             }  
  76.         });  
  77.     }  
  78.       
  79.     private ServiceConnection conn = new ServiceConnection() {  
  80.           
  81.         @Override  
  82.         public void onServiceDisconnected(ComponentName arg0) {  
  83.             // TODO Auto-generated method stub  
  84.             Toast.makeText(ServiceActivity.this,“disconn successful” ,Toast.LENGTH_LONG);  
  85.         }  
  86.           
  87.         @Override  
  88.         public void onServiceConnected(ComponentName name, IBinder service) {  
  89.             // TODO Auto-generated method stub  
  90.             Toast.makeText(ServiceActivity.this,“conn successful” ,Toast.LENGTH_LONG);  
  91.         }  
  92.     };  
  93. }  

  1. </pre><p></p><p>MyService文件:</p><p></p><pre name=“code” class=“java”>  

  1. import android.app.Service;  
  2. import android.content.Intent;  
  3. import android.os.Binder;  
  4. import android.os.IBinder;  
  5. import android.os.Parcel;  
  6. import android.widget.Toast;  
  7.   
  8. public class MyService extends Service {  
  9.     @Override  
  10.     public IBinder onBind(Intent intent) {  
  11.         // TODO Auto-generated method stub  
  12.         System.out.println(“onBind…..”);  
  13.          IBinder result = null;    
  14.             if ( null == result ) result = new MyBinder() ;  
  15.         Toast.makeText(this“onBind”,Toast.LENGTH_LONG);  
  16.         return result;  
  17.     }  
  18.   
  19.     @Override  
  20.     public void onCreate() {  
  21.         // TODO Auto-generated method stub  
  22.         super.onCreate();  
  23.         System.out.println(“onCreate…..”);  
  24.         Toast.makeText(this“onCreate”,Toast.LENGTH_LONG);  
  25.     }  
  26.   
  27.     @Override  
  28.     public void onDestroy() {  
  29.         // TODO Auto-generated method stub  
  30.         super.onDestroy();  
  31.         System.out.println(“onDestory…..”);  
  32.         Toast.makeText(this“onDestroy”,Toast.LENGTH_LONG);  
  33.     }  
  34.   
  35.     @Override  
  36.     public void onStart(Intent intent, int startId) {  
  37.         // TODO Auto-generated method stub  
  38.         super.onStart(intent, startId);  
  39.         System.out.println(“onStart…”);  
  40.         Toast.makeText(this“onStart”,Toast.LENGTH_LONG);  
  41.     }  
  42.     public class MyBinder extends Binder {    
  43.         //此方法是为了可以在Acitity中获得服务的实例    
  44.             public MyService getService() {    
  45.                 return MyService.this;    
  46.             }    
  47.            
  48.         }  
  49. }  

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账号...

(0)


相关推荐

  • tar压缩/解压、加密压缩/解密解压「建议收藏」

    tar压缩/解压、加密压缩/解密解压「建议收藏」压缩tar-czvf/path/to/file.tar.gzfile解压tar-xzvf/path/to/file.tar.gz/path/to加密压缩tar-czvf-file|openssldes3-salt-kpassword-out/path/to/file.tar.gz解密解压openssldes3-d-kpassword-salt-in/p

  • 走进音视频的世界——Matroska封装格式的介绍(二)「建议收藏」

    走进音视频的世界——Matroska封装格式的介绍(二)「建议收藏」Matroska封装格式非常灵活、兼容性好,既适用于本地文件存储又可以进行实时流传输。本篇文章主要探讨Matroska的编解码器映射,如何封装视频流、音频流、字幕流。如果要Matroska的介绍、功能和基本结构,请查看上一篇文章:走进音视频的世界——Matroska封装格式的介绍(一)。一、Matroska流Matroska有两种传输流:文件访问(存储)和实时流传输(直播)。1.文件存储Matroska是一种容器,支持把多媒体流封装成为文件,存储于本地。Matroska的开销很小,非常适合

  • js换行符转换html换行

    js换行符转换html换行js换行符转换html换行在标签中加入:dangerouslySetInnerHTML={{__html:有换行符的数据?.replace(/[\n]/g,“”)}}<divstyle={{float:’right’,width:316,fontSize:14}}dangerouslySetInnerHTML={{__html:有换行符的数据?.replace(/[\n]/g,”<br/>

  • 一份简短又全面的数学建模技能图谱:常用模型&算法总结

    本文总结了常用的数学模型方法和它们的主要用途,主要包括数学和统计上的建模方法,关于在数学建模中也挺常用的机器学习算法暂时不作补充,以后有时间就补。至于究竟哪个模型更好,需要用数据来验证,还有求解方法也不唯一,比如指派问题,你可以用线性规划OR动态规划OR整数规划OR图与网络方法来解。总的来说,常用主成分分析来降维,综合评价的方法有因子分析法、层次分析法、….,用蒙特卡罗方法来随机模拟求解;…

  • sklearn库安装_sklearn简介[通俗易懂]

    sklearn库安装_sklearn简介[通俗易懂]Scikitlearn也简称sklearn,是机器学习领域当中最知名的python模块之一。sklearn包含了很多机器学习的方式:Classification分类Regression回归Clustering非监督分类Dimensionalityreduction数据降维ModelSelection模型选择Preprocessing数据与处理使用sklea…

  • sg90舵机工作原理_舵机跑舵?锲而不舍终除隐患![通俗易懂]

    sg90舵机工作原理_舵机跑舵?锲而不舍终除隐患![通俗易懂]因为专注才更专业,快快关注吧!欢迎投稿:sea@shipmg.com正文开始一、前言某司二条姐妹船采用SSP5型360º全回转电力推进器,左右两台中压永磁电机推进船舶行驶,另外两面分别由两台P14S金杯油泵驱动三台CA210型赫格隆内曲线液压油马达360º控制船舶回转方向。在机动航行时使用港口模式,推进器可以360º全回转,正常航行时使用海上模式,推进器只能在左右35º…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号