zoukankan      html  css  js  c++  java
  • 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();

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

  • 相关阅读:
    .NET 2.0泛型集合类与.NET 1.1集合类的区别(二)
    关于插件的好文章
    MemberInfo.GetCustomAttributes和MemberDescriptor.Attributes获取特性的不同
    新一代编程语言
    .NET 2.0泛型集合类与.NET 1.1集合类的区别(一)
    发现一篇关于.NET 2.0中关于事务命名空间的好文章
    C# WinForm控件美化扩展系列之给TextBox加水印
    log4.net
    C# GDI+ 双缓冲
    C# WinForm控件美化扩展系列之ListBox
  • 原文地址:https://www.cnblogs.com/bobodeboke/p/3020226.html
Copyright © 2011-2022 走看看