Android必读之Service基础

简介

与Activity相对应的就是Service(服务)了,Activity在明,Service在暗。
Service 是一个可以在后台执行长时间运行的服务,对用户不可见。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行(注意:对于国内手机厂商来说,有可能切换到后台后立即就被kill,特别被压倒后台并且手机熄屏后)。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可以处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行。
看这里《Android必读之手机为什么会卡顿》

Service 声明

使用Service之前需要在AdnroidManifest.xml文件以<service>元素注册service。

<manifest ... >
  ...
  <application ... >
     <service android:description="string resource"          
     android:directBootAware=["true" | "false"]        
     android:enabled=["true" | "false"]          
     android:exported=["true" | "false"]          
     android:icon="drawable resource"          
     android:isolatedProcess=["true" | "false"]          
     android:label="string resource"          
     android:name="string"          
     android:permission="string"          
     android:process="string" >  
     . . .
  </service>
</application>
 </manifest>

 

  • android:enabled service能否被系统实例化,默认为true
  • android:exported service能否被隐式调用 默认为true
  • android:permission 权限声明,如果要启动此Service必须要具备的权限
  • android:process 是否在单独的进程中,
    • 如果没有设置值,则表明此service与UI线程在同一个进程中,并且是在主线程中。
    • 如果设置值以冒号“:”开头,则表明此service是App私有的,不能被共享;
    • 如果设置的值以小写字母开头,则表明此service是可以被系统共享的。

关于process,请看:

<service android:name=".ServiceA" />
<service android:name=".ServiceB"
               android:process=":other" />

启动之后可以看到App有两个进程《Android必读之Service基础》
other process是一个完整的应用程序,会初始化一个全新的application,里面的数据都是新初始化的,所以要注意App与other process的数据同步和共享问题。

启动方式

Service启动方式有两种,分别是startService和bindService

  1. startService 通过调用 context.startService() 启动服务。一旦启动,服务即可在后台运行,即使启动服务的组件(比如Activity、Fragment等)已被销毁也不受影响。已启动的服务通常是执行单一操作,而且不会将结果返回给调用方。例如,它可能通过网络下载或上传文件。 操作完成后,服务会自行停止运行。
  2. bindService 通过调用 context.bindService()  绑定到服务时,服务即处于“绑定”状态。绑定服务提供了一个客户端-服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。

Service生命周期

服务的生命周期比 Activity 的生命周期要简单得多。但是,密切关注如何创建和销毁服务反而更加重要,因为服务可以在用户没有意识到的情况下运行于后台。
与 Activity 类似,服务也拥有生命周期回调方法,您可以实现这些方法来监控服务状态的变化并适时执行工作。 以下框架服务展示了每种生命周期方法:

public class ExampleService extends Service {
    int mStartMode;       // indicates how to behave if the service is killed
    IBinder mBinder;      // interface for clients that bind
    boolean mAllowRebind; // indicates whether onRebind should be used
    @Override
    public void onCreate() {
        // 只在service初始化时执行一次
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // startService会回调此方法,会被重复调用
        return mStartMode;
    }
    @Override
    public IBinder onBind(Intent intent) {
        // bindService()回调此方法
        return mBinder;
    }
    @Override
    public boolean onUnbind(Intent intent) {
        // 解绑unbindService()回调此方法
        return mAllowRebind;
    }
    @Override
    public void onRebind(Intent intent) {
        // 重复绑定回调
        // after onUnbind() has already been called
    }
    @Override
    public void onDestroy() {
        // Service被stop,国内手机被强制删除是不会回调这个方法的,所以不要指望在这
          //个方法里面做保活
    }
}

《Android必读之Service基础》
服务生命周期。左图显示了使用 startService() 所创建的服务的生命周期,右图显示了使用bindService() 所创建的服务的生命周期。
通过实现这些方法,您可以监控服务生命周期的两个嵌套循环:

 

点赞

发表评论