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 Service全面解析

  • 2016年10月16日 14:02
  • 3.24MB
  • 下载

Android Service深入解析Demo

  • 2015年11月10日 10:15
  • 5.07MB
  • 下载

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

最重要的一个service是zygote,之后的博文均以zygote为例讲解service。   上篇讲到init_parser.c中parse_new_section函数中根据关键字servic...

Android中Service完全解析(上)

  • 2015年04月20日 09:29
  • 2.67MB
  • 下载

Android Service完全解析,关于服务你所需知道的一切(上)

出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的And...

Android四大组件之Service解析

Android四大组件之Service解析学习Android这么久,也没有对Service进行深入全面的学习,所以这篇文章的出发点就是全面的解析下Service。我们知道,service在我们项目中主...
  • Mr_dsw
  • Mr_dsw
  • 2015年10月14日 15:21
  • 989

Android Service完全解析,关于服务你所需知道的一切(下)-进程间通信

转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许...

Android Service完全解析,关于服务你所需知道的一切(上)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老...

Android Service完全解析,关于服务你所需知道的一切(下)

出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要内容...

Android基础--Service完全解析

 富貴必從勤苦得,男兒須讀五車書。唐.杜甫《柏學士茅屋》 作为程序员的我们,须知富贵是要通过勤苦努力才能得到的,要想在行业内有所建树,就必须刻苦学习和钻研。 今天我们来讲一下Android中...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android Service解析
举报原因:
原因补充:

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