Android Service详解

Service

服务是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务

服务并不是运行在一个独立的进程当中,而是依赖于创建服务时所在的应用程序进程。当某个应用程序被杀掉时,所有依赖于该进程的服务也会停止执行(服务运行于宿主进程的主线程中,既不创建自己的线程也不运行在单独的进程中

服务并不会自动开启线程,所有的代码都是运行在主线程当中。因此,我们需要在服务的内部手动创建子线程,并在这里执行具体的任务,否则就有可能出现主线程被阻塞的情况。服务需要在AndroidManifest.xml里注册

四个手动调用方法:

startService()

stopService();

bindService();

unbindService();

五个自调用方法:

onCreate();//创建服务,创建时调用

onStartCommand();//启动服务,每次服务启动时调用

onDestroy;//销毁服务,服务销毁时调用

onBind();//绑定服务,服务绑定时调用

onUnBind();//解除绑定

服务的启动方式:

  • startService
  • bindService
startService

首先在AndroidManifest.xml中注册

<service android:name=".MyService"
     android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="com.gww.myservice"/>
    </intent-filter>
</service>

java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.gww.myservice },可以将隐式改为显示

intent = new Intent(MainActivity.this,MyService.class);
//intent = new Intent("com.gww.myservice");
startService(intent);
public class MyService extends Service {
    Thread thread;
    @Override
    public IBinder onBind(Intent intent) {
        Log.d("gwwservice","onBind");
        return null;
    }

    @Override
    public void onDestroy() {
        Log.d("gwwservice","onDestroy");
    }

    @Override
    public void onCreate() {
        Log.d("gwwservice","onCreate");
        thread = new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0; i < 10; i++){
                    try {
                        Log.d("gwwservice",i+"----->");
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        thread.start();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("gwwservice","onStartCommand");

        return super.onStartCommand(intent, flags, startId);
    }
}

启动服务时调用onCreate,onStartCommand,关闭时onDestory();

BindService
  • 在AndroidManifest.xml中注册服务

    <service android:name=".MyBindService"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="com.gww.mybindservice"/>
        </intent-filter>
    </service>
    
  • 创建Service实现对对应方法,创建内部类LocalBinder,返回本服务

    package com.example.servicestudent;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.Binder;
    import android.os.IBinder;
    import android.util.Log;
    
    import androidx.annotation.Nullable;
    
    public class MyBindService extends Service {
        public final IBinder mBinder = new LocalBinder();
        @Override
        public IBinder onBind(Intent intent) {
            Log.d("gwwbindservice","onBind");
            return null;
        }
        public class LocalBinder extends Binder {
            public MyBindService getService(){
                return MyBindService.this;
            }
        }
        @Override
        public void onDestroy() {
            Log.d("gwwbindservice","onDestroy");
        }
    
        @Override
        public void onCreate() {
            Log.d("gwwbindservice","onCreate");
        }
    
        @Override
        public boolean onUnbind(Intent intent) {
            Log.d("gwwbindservice","onUnbind");
            return super.onUnbind(intent);
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Log.d("gwwbindservice","onStartCommand");
            return super.onStartCommand(intent, flags, startId);
        }
    }
    
  • 在Activity中创建serviceConnection对象并实现对应方法,在onServiceConnected中获得服务

    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            bindService = ((MyBindService.LocalBinder) service).getService();
            Log.e("gwwbindservice","onServiceConnected");
        }
    
        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.e("gwwbindservice","onServiceDisconnected");
            bindService = null;
        }
    };
    
  • 启动

    intent = new Intent(MainActivity.this,MyBindService.class);
    //intent = new Intent("com.gww.myservice");
    bindService(intent,serviceConnection, Context.BIND_AUTO_CREATE);
    

startService启动的生命周期

onCreate() 当Service第一次被创建时,由系统调用。

onStartCommand() 当startService方法启动Service时,该方法被调用。

onDestroy() 当Service不再使用时,由系统调用。

注意:一个startService只会创建一次,销毁一次,但可以开始多次,因此,onCreate()和onDestroy()方法只会被调用一次,而onStart()方法会被调用多次。

bindService启动的生命周期

onCreate() 当Service被创建时,由系统调用。

onBind() 当bindService方法启动Service时,该方法被调用。

onUnbind() 当unbindService方法解除绑定时,该方法被调用。

onDestroy() 当Service不再使用时,由系统调用。

1)当Service组件处于启动状态时,这个时候Service内部可以做一些后台计算,并且不需要和外界有直接的交互。

2)当Service组件处于绑定状态时,这个时候Service内部同样可以进行后台计算,但是处于这种状态时,外界可以很方便地和Service组件进行通信。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rZvSY0Xz-1660023921970)(https://upload-images.jianshu.io/upload_images/8498518-b4a1b458507d1fcb.png?imageMogr2/auto-orient/strip|imageView2/2/w/406/format/webp)]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值