【Android Develop Tips】BindService/StartService

Service 的生命周期只有onCreate, onStart, onDestroy,启动一个Service有两种方法:startService && bindService 。

1):startService
执行startService时,Service会经历onCreate->onStartCommand。当执行stopService时,直接调用onDestroy方法。调用者如果没有stopService,Service会一直在后台运行,下次调用者再起来仍然可以stopService.
多次调用startService,该Service只能被创建一次,即该Service的onCreate方法只会被调用一次。但是每次调用startService,onStartCommand方法都会被调用
2):执行bindService时,Service会经历onCreate->onBind。这个时候调用者和Service绑定在一起。调用者调用unbindService方法或者调用者Context不存在了(如Activity被finish了),Service就会调用onUnbind->onDestroy。
第一次执行bindService时,onCreate和onBind方法会被调用,但是多次执行bindService时,onCreate和onBind方法并不会被多次调用,即并不会多次创建服务和绑定服务
启动流程
3):bindService应用实例
bindService的使用方法
3.1:在Activity里,实例化ServiceConnection接口的实现类,重写onServiceConnected()和onServiceDisconnected()方法。

private void connectService() {
    Intent intent = new Intent("com.homer.bind.bindService");  
    bindService(intent, sc, Context.BIND_AUTO_CREATE);         
}

private ServiceConnection sc = new ServiceConnection() {    
    @Override  
    public void onServiceConnected(ComponentName name, IBinder service) {       //connect Service  
    musicService = ((BindMusicService.MyBinder) (service)).getService();  
    if (musicService != null) {  
        musicService.play();        // play music  
    }  
}  

@Override  
public void onServiceDisconnected(ComponentName name) {                   
    musicService = null;  
    }  
};  

Implement BindMusicService

public class BindMusicService extends Service {    
    private MediaPlayer mediaPlayer;  
    private final IBinder binder = new MyBinder();  

    public class MyBinder extends Binder {  
        BindMusicService getService() {  
            return BindMusicService.this;  
        }  
    }  

    @Override  
    public IBinder onBind(Intent intent) {  
        return binder;  
    }  
}

4):Remoteservice
通常每个应用程序都在它自己的进程内运行,但有时需要在进程之间传递对象(IPC通信),你可以通过应用程序UI的方式写个运行在一个不同的进程中的service。AIDL(android接口描述语言)是一个IDL语言,它可以生成一段代码,可以使在一个android设备上运行的两个进程使用内部通信进程进行交互。

要使用AIDL,Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的Java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了。
IMusicControlService.aidl

package com.homer.remote;  

interface IMusicControlService{  
        void play();   
        void stop();   
        void pause();  
}  

使用eclipse的Android插件,会根据这个aidl文件生成一个Java接口类,生成的接口类中会有一个内部类Stub类,Service来继承该Stub类:

public class RemoteMusicService extends Service {    
    private MediaPlayer mediaPlayer;  

    @Override  
    public IBinder onBind(Intent intent) {  
        return binder;  
    }  

    private final IMusicControlService.Stub binder = new IMusicControlService.Stub() {  

        @Override  
        public void play() throws RemoteException {  
            if (mediaPlayer == null) {  
                mediaPlayer = MediaPlayer.create(RemoteMusicService.this, R.raw.tmp);  
                mediaPlayer.setLooping(false);  
            }  
            if (!mediaPlayer.isPlaying()) {  
                mediaPlayer.start();  
            }  
        }  

        @Override  
        public void pause() throws RemoteException {  
            if (mediaPlayer!=null && mediaPlayer.isPlaying()) {  
                mediaPlayer.pause();  
            }             
        }  

        @Override  
        public void stop() throws RemoteException {  
            if (mediaPlayer != null) {  
                mediaPlayer.stop();  
                try {  
                    mediaPlayer.prepare();      // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数  
                } catch (IOException ex) {  
                    ex.printStackTrace();  
                }  
            }  
        }  
    };  
}

客户端(Activity)应用连接到这个Service时,onServiceConnected方法将被调用,客户端就可以获得IBinder对象。参看下面的客户端onServiceConnected方法

private IMusicControlService musicService; 

private void connection() {  
    Intent intent = new Intent("com.homer.remote.remoteMusicReceiver");  
    bindService(intent, sc, Context.BIND_AUTO_CREATE);                
}

private ServiceConnection sc = new ServiceConnection() {  
    @Override  
    public void onServiceConnected(ComponentName name, IBinder service) {       //connect Service  
        musicService = IMusicControlService.Stub.asInterface(service);  
    }  

    @Override  
    public void onServiceDisconnected(ComponentName name) {                 
        musicService = null;  
    }  
}; 

Reference:
http://blog.csdn.net/pi9nc/article/details/9354183
http://www.cnblogs.com/yejiurui/p/3429451.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值