Android Service介绍和使用

什么是Service

Service服务是Android四大组件之一,是一种程序后台运行的方案,用于不需要用户交互,长期运行的任务

Service并不是在单独进程中运行,也是运行在应用程序进程的主线程中,在执行具体耗时任务过程中要手动开启子线程,应用程序进程被杀死,所有依赖该进程的服务也会停止运行

 

创建Service

右键包名,new→Service→Service,然后finish就会完成创建并且在AndroidManifest.xml中自动注册该Service

Android Service介绍和使用

或者new→Class,然后extend Service,然后手动在AndroidManifest.xml中注册该Service

enable表示允许Service运行,exported表示允许其他应用隐式调用该服务

Android Service介绍和使用

public class MyService extends Service {
    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @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 onDestroy() {
        super.onDestroy();
    }
}

 

Service启动方式

Service启动分为普通启动和绑定启动:startService()和bindService()

 

普通启动服务和停止服务

先介绍普通启动,普通启动有三个回调方法:

onCreate()服务创建时调用

onStartCommand()服务启动时调用

onDestroy()服务销毁时调用

启动的代码:

Intent intent=new Intent(this,MyService.class);
startService(intent);

Intent intent2=new Intent(this,MyService.class);
stopService(intent2);

onCreate()只在服务创建时调用,服务只创建唯一实例,重复启动服务,只会调用 onStartCommand()

多次启动只需一次停止服务即可

下面我连续按了5下启动服务,然后停止服务,打印日志

Android Service介绍和使用

(服务自身stopSelf()方法也可以停止服务) 

 

绑定启动服务和解绑服务:

一种Activity和Service可以进行通信/交互的启动方式

Service还有一个回调方法用于绑定服务:

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

下面是绑定启动的代码例子:

Service代码:自定义了一个Binder内部类,包含具体执行操作(这里用打印日志代替),然后在onBind()中返回Binder对象

public class MyService extends Service {
    private static final String TAG = "MyService";

    //初始化自定义的Binder对象
    private MyCustomBinder mBinder=new MyCustomBinder();

    public MyService() {
    }
    //自定义的内部Binder类
    class MyCustomBinder extends Binder{
        public void startDoSomething(){
            Log.i(TAG, "startDoSomething: ");
        }
        public void getProgress(){
            Log.i(TAG, "getProgress: ");
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        Log.i(TAG, "onBind: ");
        return mBinder;
    }
}

 进行绑定操作的Activity中的代码:初始化MyService.MyCustomBinder对象和ServiceConnection对象,然后绑定启动.

ServiceConnection的onServiceConnected()在绑定Service时调用,在onBind()回调之后,onServiceDisconnected()只有在异常解绑停止服务时调用,正常解绑不会调用

BIND_AUTO_CREATE参数表示绑定Service时创建Service,解绑Service时停止Service

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private static final String TAG = "MainActivity";
    private MyService.MyCustomBinder myCustomBinder;
    private ServiceConnection serviceConnection=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.i(TAG, "onServiceConnected: ");
            myCustomBinder= (MyService.MyCustomBinder) service;
            myCustomBinder.startDoSomething();
            myCustomBinder.getProgress();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.i(TAG, "onServiceDisconnected: ");
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button3=findViewById(R.id.button3);
        Button button4=findViewById(R.id.button4);

        button3.setOnClickListener(this);
        button4.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        int id=v.getId();
        switch (id){
            case R.id.button3:
                //绑定启动Service
                Intent intent3=new Intent(MainActivity.this,MyService.class);
                bindService(intent3,serviceConnection,BIND_AUTO_CREATE);
                break;
            case R.id.button4:
                //解绑Service
                unbindService(serviceConnection);
                break;
        }
    }
}

 多次点击绑定,然后解绑,查看打印日志:

Android Service介绍和使用

绑定启动不会调用 onStartCommand(),而是调用onBind(),并且多次点击绑定并不会重复绑定也不会重复调用onBind()和onServiceConnected()

(与Service绑定的Activity出栈时(finish),Service自动解绑并且停止)

 

服务的生命周期

onCreate→onStartCommand()/onBind→onDestroy

创建,运行,停止

 

Service可以同时进行普通启动和绑定,启动和绑定的都是Service的唯一实例

在停止时要同时解绑和停止,才能使Service进入停止调用onDestroy

 

前台服务

服务在后台运行,优先级比较低,当内存不足时可以会被系统回收,可以使用前台服务

前台服务会在状态栏中显示图标,并且下拉状态栏,可以在通知栏中看到详细信息,类似于通知

(API26开始使用新的方法来实现前台服务startForegroundService(),还需要研究一下怎么用)

IntentService

我们使用Service往往需要手动开启子线程,执行耗时操作,执行完毕后可以选择stopSelf()停止服务

IntentService的作用就和上面一样,它的onHandleIntent()回调方法就是在子线程里面执行耗时操作,并且onHandleIntent()执行完毕之后会自动停止服务