service入门

1,service属于后台服务,无界面,其生命周期是:

使用context.startService() 启动Service

其生命周期为context.startService() ->onCreate()- >onStart()->Service running-->context.stopService() | ->onDestroy() ->Service stop 
如果Service还没有运行,则android先调用onCreate()然后调用onStart();
如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。 

stopService的时候直接onDestroy,
如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。
service属于单例模式,多次启动仅仅需要一次关闭即可,也就是只需要调用一次stopService操作。
所以调用startService的生命周期为:onCreate --> onStart(可多次调用) --> onDestroy

对于bindService()启动Service会经历:
(如果服务没有被创建,那么:)context.bindService()->onCreate()->onBind()->Service running-->onUnbind() -> onDestroy() ->Service stop

onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。
这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,
Srevice就会调用onUnbind->onDestroy相应退出。 

所以调用bindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。
一但销毁activity它就结束,如果按home把它放到后台,那他就不退出。

如果是两种模式的混合,用户可以使用startService启动一个服务,在其他的activiy里调用bindservice进行绑定,使用unbindService取消绑定,在这种情况下,直到执行stopService才会真正的终止服务。

在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),
其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。

配置activity的时候,android:process=":remote"代表在应用程序中,需要该service的时候,会启动新的进程。如果是android:process="remote"那么会创建全局进程,不同的应用程序共享该进程。

 

2,组件之间以及(activiy和service)之间的通信

组件之间通信的核心是intent,显式的intent可以实现同一进程之间不同组件的通信,隐式的intent可以实现跨进程的通信。

在activity和service之间,如果简单的intent不能满足要求,可以采用binder机制。

任何service都需要重写一个IBinder接口,在onconnection方法中通过该参数的传递可以在activity和service之间传递数据。

android自身没有提供判断当前的service是否已经绑定的函数,然而在连接关闭之前,必须首先判断service是否已经绑定,解决方法是可以为binder类实现一个标记性的接口,在连接的时候将binder变量赋予该接口对应的成员变量,关闭之前判断此接口是否为空。

 

3,系统提供的相关service

系统也提供了大量的service,如activity管理,重力感应,位置服务,wifi等等,这些服务对应的常量可以在android.content.Context中查看,用户通过getSystemService(String name)的方法来获得对应的系统服务对象。

诸如:1,获取屏幕的分辨率

        WindowManager manager=(WindowManager)MyActivity.this.getSystemService(Context.WINDOW_SERVICE);

            manager.getDefaultDisplay().getWidth();

            manager.getDefaultDisplay().getHeight();

2,获取系统剪贴板服务

        ClipboardManager manager=(ClipboardManager) MyActivity.this.getSystemService(Context.CLIPBOARD_SERVICE);

            //设置剪贴板里的内容

            manager.setText("我是剪贴板里的内容");

            //取出剪贴板里面的内容

            manager.getText();

其他还有系统的电话服务,闹铃服务,音频服务(控制音量、震动等等),传感器服务,位置服务等等

 

你可能感兴趣的:(service)