美文网首页Android Zone
Android Service基本使用

Android Service基本使用

作者: 翻译不了的声响 | 来源:发表于2018-06-11 15:22 被阅读0次

Service 是 Android系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),与Activity的不同是Service只能运行在后台,Service没有界面并且生命周期也与Activity不同。一个Service是一个可以长期运行在后台的应用程序组件,不提供用户界面。此外,一个组件可以绑定到一个服务与之交互,甚至执行进程间通信(IPC)。 例如一个服务可以在后台处理网络交易、播放音乐、执行文件 I/O,或与内容提供者交互等。

Service生命周期图
1. Service启动方式

1)启动服务方式

  • startService方式
    onCreate():服务创建时调用
    onStartCommand():服务被调用开启方法时调用
    onDestroy():服务销毁时调用

当一个Service在被使用 startService方法启动,不管是否调用了 bindService(绑定服务)或 unbindService(解除绑定服务)到该Service,该Service都会在后台运行并不受影响。一个Service被使用 startService方法启动多少次,onCreate方法只会调用一次,onStartCommand方法将会被调用多次(与 startService的次数一致),且系统只会创建一个Service实例(结束该Service也只需要调用一次 stopService),该Service会一直在后台运行直至调用 stopService或调用自身的 stopSelf方法。

  • bindService方式
    onCreate():服务创建时调用
    onBind():服务被绑定时调用
    onServiceConnected():服务连接时调用
    onUnbind():服务被解绑时调用
    onDestroy():服务销毁时调用

当一个Service在被使用 bindService方法启动,不论 bindService被调用几次,Service的 onCreate方法只会执行一次,同时 onStartCommand方法始终不会调用。

  • 混合方式
    onCreate():服务创建时调用
    onStartCommand():服务被调用开启方法时调用
    onBind():服务被绑定时调用
    onServiceConnected():服务连接时调用
    onUnbind():服务被解绑时调用
    onDestroy():服务销毁时调用

当一个Service在被启动(startService的同时又被绑定 bindService),该Service将会一直在后台运行,并且不管调用几次,onCreate方法始终只会调用一次,onStartCommand的调用次数与 startService调用的次数一致(使用 bindService方法不会调用 onStartCommand)。同时,调用 unBindService将不会停止Service,必须调用 stopService或 Service自身的 stopSelf来停止服务。

2)启动服务区别
startService:
(1) 调用者退出后,Service仍然存在;
(2) startService()stopService()只能开启和关闭Service,无法操作Service
bindService:
(1) 调用者退出后,Service随着调用者销毁;
(2) bindService()unbindService()可以操作Service

2. Service基本用法
  • startService方式启动服务
    1) 继承 Service
    (1) 新建一个MyService继承自Service,并重写父类方法;
public class MyService extends Service {
    
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();       
    }
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {      
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onStart(Intent intent, int startId) {      
        super.onStart(intent, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

(2) 在AndroidManifest.xml中注册,如需访问网络,还需要添加网络请求权限;

<manifest ... >
  ...
  <application ... >    
     <service android:name=".MyService"/>        
     ...
  </application/>
</manifest>

(3) 通过startService()启动,stopService()停止服务。

Intent intent = new Intent(this, MyService.class);
//开启服务
startService(intent);

//停止服务
stopService(intent);

2)继承 IntentService
因为Service中几个方法的回调都是在主线程中,如果使用Service执行特别耗时的操作,建议单独新建线程去操作,避免阻塞主线程(UI线程)。IntentService在内部帮我们新建的线程,执行完毕任务后会自动关闭,无需手动结束它。

(1) 新建一个MyService继承自IntentService,并重写父类方法;

public class MyService extends IntentService {
    public MyService() {
        super("MyService");
    }
    
    @Override
    protected void onHandleIntent(Intent intent) {      
    }
    
    @Override
    public void onCreate() {
        super.onCreate();       
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {      
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
    }

    @Override
    public void onDestroy() {       
        super.onDestroy();
    }
}

(2) 在AndroidManifest.xml中注册,如需访问网络,还需要添加网络请求权限;

<manifest ... >
  ...
  <application ... >    
     <service android:name=".MyService"/>        
     ...
  </application/>
</manifest>

(3) 通过startService()启动服务

Intent intent = new Intent(this, MyService.class);
//开启服务
startService(intent);
  • bindService方式启动服务
    1)新建一个MyService继承自Service,在MyService中增加了一个内部类MyBinder,并重写父类方法;
public class MyService extends Service {
    
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {      
        return new MyBinder();
    }

    @Override
    public void onCreate() {
        super.onCreate();       
    }

    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    class MyBinder extends Binder {
        public MyService getService() {
            return MyService.this;
        }
    }
}

2)通过bindService()绑定服务,通过unbindService()解绑服务。

MyService myService;
ServiceConnection mConnection = ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        MyService.MyBinder binder = (MyService.MyBinder) service;
        mService = binder.getService();
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        myService = null;
    }
};

Intent intent = new Intent(this, MyService.class);
// 绑定服务
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

// 解绑服务
unbindService(mConnection);
  • 混合方式启动服务
    1)新建一个MyService继承自Service,在MyService中增加了一个内部类MyBinder,并重写父类方法;
public class MyService extends Service {
    
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new MyBinder();
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }
    
    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    class MyBinder extends Binder {
        public MyService getService() {
            return MyService.this;
        }
    }
}

2)在AndroidManifest.xml中注册,如需访问网络,还需要添加网络请求权限;

<manifest ... >
  ...
  <application ... >    
     <service android:name=".MyService"/>        
     ...
  </application/>
</manifest>

3)通过startService()启动,stopService()停止服务。

MyService myService;
ServiceConnection mConnection = ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        MyService.MyBinder binder = (MyService.MyBinder) service;
        mService = binder.getService();
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        myService = null;
    }
};

Intent intent = new Intent(this, MyService.class);
//开启并绑定服务
startService(intent);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

// 解绑服务
unbindService(mConnection);

//停止服务
stopService(intent);
3. Service生命周期

Android Service生命周期浅析

参考

官方文档
https://developer.android.google.cn/reference/android/app/Service

相关文章

  • Android Service基本使用

    Service 是 Android系统中的四大组件之一(Activity、Service、BroadcastRec...

  • Android Service基本使用

    对于多数朋友来说Service都不会陌生,大名鼎鼎的安卓四大组件,主要在后台操作一些耗时的逻辑,或者去执行某些长期...

  • 四大组件 - Service服务

    一、Service基本使用 Service是Android中实现程序后台运行的解决方案。 适用:长期需要执行,且不...

  • 再忆Service(一)

    Service基本使用 Service是长时间驻留在Android中的一种后台服务, 主要用于消息处理, 跨进程之...

  • Service(服务)

    Service为Android四大组件之一 目录 什么是Service? 服务的基本用法 Android-8.0的...

  • Android 时间到了需要不同的界面都要显示抢红包

    参考文章 Android 8.0以后使用后台Service服务JobIntentService的使用Android...

  • Service基本使用

    Service是android中实现程序后台运行的解决方案,适合去执行那些不需要和用户交互且长期运行的任务。服务的...

  • 深入理解相机五(硬件抽象层HAL)

    一、Android 基础学习 Activity 使用详解 Service 使用详解 Broadcast 使用详解 ...

  • Android日记之Service的基本使用

    前言 上回小米面试问到Servic的时候懵了一下,因为基本很少用到,现在就再次来复习一下。 正文 Service的...

  • Android service使用

    Service是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。服务可由其他应用组件启动,而且即使用户...

网友评论

    本文标题:Android Service基本使用

    本文链接:https://www.haomeiwen.com/subject/ottbsftx.html