Android Service解析

原创 2016年08月29日 17:18:20
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将通信的方式进行封装,使得程序显示的更加简洁和方便。
版权声明:本文为博主原创文章,未经博主允许不得转载。

Android启动流程分析(九) 解析init.rc的service

在分析完解析init.rc的action之后,剩下的一部分就是解析service了。 而解析service还是需要回到parse_config里面来。根据前面的知识,我们也可以很容易的知道在关键字为s...
  • ChaoY1116
  • ChaoY1116
  • 2015年03月30日 14:39
  • 1738

Android Service最全面的解析

刘明渊 的博客地址:http://blog.csdn.net/vanpersie_9987 Service Service是Android中一个类,它是Android四大组件之一,使用S...
  • scott2017
  • scott2017
  • 2016年05月26日 11:41
  • 29038

android启动过程详解(二)——解析service

最重要的一个service是zygote,之后的博文均以zygote为例讲解service。   上篇讲到init_parser.c中parse_new_section函数中根据关键字servic...
  • huxueyan521
  • huxueyan521
  • 2012年07月25日 20:17
  • 2871

Android服务之bindService源码分析

上一篇分析startService时没有画出调用ActivityManagerService之前的时序图,这里画出bindService的时序图,它们的调用流程是一致的。 先看ContextWrap...
  • zhangyongfeiyong
  • zhangyongfeiyong
  • 2016年07月19日 10:38
  • 2731

Android6.0 init 深入分析

之前写过一篇关于android5.0 init的介绍,这篇博客是介绍android6.0init,之前有的代码介绍不详细。而且分析 解析init.rc那块代码也没有结合init.rc介绍。 一、 ma...
  • kc58236582
  • kc58236582
  • 2016年08月20日 10:46
  • 3475

Android service解析(一)

转载自: http://blog.csdn.net/guolin_blog/article/details/11952435       Service作为Android四大组件之一,在每一个应...
  • jxf_access
  • jxf_access
  • 2017年05月18日 10:57
  • 138

Android Service全面解析

Service概念及用途A service is an application component that can perform long-running operations in the ba...
  • huaxun66
  • huaxun66
  • 2016年10月13日 20:50
  • 839

Android Service完全解析

本博客为作者原创,若要转载请注明出处,谢谢。 我们知道Activity,ContentProvider,Service,Broadcast为android四大组件,主要用来做一些后台的操作,执行些...
  • zhonglunshun
  • zhonglunshun
  • 2015年05月31日 12:29
  • 295

Android Service解析

Android Service解析 在android中,我们使用startService启动服务。在Service的派生类里,会调用onStartCommand(Intent,int,i...
  • gerryzhu
  • gerryzhu
  • 2013年03月25日 16:36
  • 2206

Android Service 全解析

Service的种类    按运行地点分类: 类别 区别 优点 缺点 应用 本地服务(L...
  • DLUTBruceZhang
  • DLUTBruceZhang
  • 2013年05月20日 14:28
  • 2136
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android Service解析
举报原因:
原因补充:

(最多只允许输入30个字)