关闭

Android Service解析

83人阅读 评论(0) 收藏 举报
分类:
Service的启动有两种方式:1)Started,也就是服务的启动,服务启动后,服务移动运行下去,及时启动他的服务已经被销毁。操作完成后,此服务自动销毁。服务可以做一些阻塞线程的工作,如网络下载、上传文件等。
BoundService是指应用程序组件通过BindService()绑定到服务上。服务声明后,任何服务器组件都能绑定该服务。
一个服务的生命周期包括Start、Create、Destory三个阶段,每个阶段有着相应的回调函数,onStartCommand()onBind()onCreate()onDestroy()。服务的声明需要在文件manifest中进行声明。服务的使用需要继承自service中。
<service android:name=".ExampleService" />
例如启动一个数据保存的服务,首先启动一个守护服务,通过startservice()启动服务,并且通过一个intent进行数据传递。该服务在onStartCommond()中接受intent,再进行数据库的事务处理。另外,需要注意的是启动服务的时候,需要重新的启动一个进程。因为服务都是一些耗时的操作。
绑定服务是一种应用程序和服务绑定的一种方式,它允许应用程序和服务进行绑定交互。客户端绑定服务的时候必须通过Intent和ServiceConnnection进行服务的绑定。服务绑定之后通过ServiceConnection进行服务的监控和互动。ServiceConnection链接后会调用OnServiceConnection回调函数,传入Ibind对象与服务器端进行交互。
绑定之前需要再服务器端首先准备一个支持Bind的服务,服务中必须实现Onbind方法,并且该方法必须要返回一个对象,客户端可以通过该对象调用服务的方法。该对象需要实现Ibind()接口,接口中定义服务实现的方法。
以上绑定服务用于同一进程中的操作,多线程的绑定需要通过Message和HandleMessage进行操作。Servcie中定义Handler,同时定义HandleMessage方法,该方法中处理相应的操作,onBind中返回相应的Message接口。客户端中,依然绑定服务,仍然需要传递ServiceConnection,并且通过他获取服务端的Message。另外,客户端,根据获取的Mesage,发送消息与服务器端进行操作。
例如:
public class MessengerService extends Service {
    /** 发送给服务的用于显示信息的指令*/
    static final int MSG_SAY_HELLO = 1;


    /**
     * 从客户端接收消息的Handler
     */
    class IncomingHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_SAY_HELLO:
                    Toast.makeText(getApplicationContext(), "hello!", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    super.handleMessage(msg);
            }
        }
    }


    /**
     * 向客户端公布的用于向IncomingHandler发送信息的Messager
     */
    final Messenger mMessenger = new Messenger(new IncomingHandler());


    /**
     * 当绑定到服务时,我们向Messager返回接口,
     * 用于向服务发送消息
     */
    @Override
    public IBinder onBind(Intent intent) {
        Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show();
        return mMessenger.getBinder();
    }
}
public class ActivityMessenger extends Activity {
    /** 用于和服务通信的Messenger*/
    Messenger mService = null;


    /** 标识我们是否已绑定服务的标志 */
    boolean mBound;


    /**
     * 与服务的主接口进行交互的类
     */
    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            // 与服务建立联接后将会调用本方法,
            // 给出用于和服务交互的对象。
            // 我们将用一个Messenger来与服务进行通信,
            // 因此这里我们获取到一个原始IBinder对象的客户端实例。
            mService = new Messenger(service);
            mBound = true;
        }


        public void onServiceDisconnected(ComponentName className) {
            // 当与服务的联接被意外中断时——也就是说服务的进程崩溃了,
            // 将会调用本方法。
            mService = null;
            mBound = false;
        }
    };


    public void sayHello(View v) {
        if (!mBound) return;
        // 创建并向服务发送一个消息,用到了已约定的'what'值
        Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0);
        try {
            mService.send(msg);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }


    @Override
    protected void onStart() {
        super.onStart();
        // Bind to the service
        bindService(new Intent(this, MessengerService.class), mConnection,
            Context.BIND_AUTO_CREATE);
    }


    @Override
    protected void onStop() {
        super.onStop();
        // Unbind from the service
        if (mBound) {
            unbindService(mConnection);
            mBound = false;
        }
    }
}
另,onBinde(Intent,ServiceConnection,服务标识),Intent即服务的意图,也就是要启动的服务。ServiceConnection标识进行交互的对象,第三个标识指的是服务的启动方式。
另外服务是可以跨进行进行通信的,通信的方式通过AIDL和RPC协议进行通信。AIDL定义了通信的接口,RPC将通信的方式进行封装,使得程序显示的更加简洁和方便。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7308次
    • 积分:327
    • 等级:
    • 排名:千里之外
    • 原创:25篇
    • 转载:2篇
    • 译文:0篇
    • 评论:2条