Android学习笔记 —— 十四、关于Service的基础使用

一、创建Service

自定义类继承Service类,并在AndroidManifest中注册:

<application >
        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true" />
application>

自定义Service常用的重写方法以及作用:

方法名 作用
onCreate 服务创建时调用
onStartCommand 服务启动时调用
onDestory 服务销毁时调用
onBind 用于Service和Activity之间的通信,让Activity可以控制运行中的Service

启动和停止Service:

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

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

或者可以在Service中通过调用stopSelf();方法来停止该服务


二、Activity和Service进行通信的方法

虽然说onBind方法用于和service进行通信,但是单纯只是onBind方法是无法完成这个功能的。

基本的通信构建过程:

  1. 在自定义的Service类中自定义一个Binder内部类,并获取一个自定义内部类的对象。自定义类中的方法将会在Activity中调用,即这个Service提供给Activity的控制方法都需要在这里书写。而在这里获取到的自定义类对象将作为onBind方法的返回值,在Activity和Service绑定时作为参数之一传入到onServiceConnected方法中。
    //获取一个自定义类对象作为oonBind方法的返回值
    private DownloadBinder mBinder = new DownloadBinder();
    
    //自定义Binder类,类中方法将在Activiy中调用
    class DownloadBinder extends Binder {
        public void startDownload() {
            Log.d(TAG, "StartDownload!");
        }

        public int getProgress() {
            Log.d(TAG, "getProgress. ");
            return 0;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        //返回Binder对象使Activity可以调用方法来执行相应操作
        return mBinder;
    }
  1. 在Activity中也需要重写ServiceConnection中的方法并获取一个ServiceConnection对象,这个对象将会作为绑定Activity和Service方法的参数。
  • onServiceConnected:Activity和Service绑定时调用这个方法,在这里就可以获取到onBind方法返回的自定义Binder对象
  • onServiceDisconnected:连接断开时将会调用这个方法。

ServiceConnection常用的重写方法:

    private ServiceConnection connection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            MyService.DownloadBinder downloadBinder = (MyService.DownloadBinder) service;
            downloadBinder.startDownload();
            downloadBinder.getProgress();
        }

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

Activity和Service的绑定:
使用bindService方法将Activity和Service绑定。这里如果绑定时服务没有启动,那么执行这个方法之前系统将会先启动服务。

	//绑定
	Intent bindIntent = new Intent(this, MyService.class);
	bindService(bindIntent, connection, BIND_AUTO_CREATE);
	//解绑
	unbindService(connection);

这里需要注意的是,如果Service和Activity绑定之后,使用stopService是无法停止服务的,必须调用unbind方法断开连接之后才可以通过stopService停止。

三、前台服务

服务都是在后台运行,而且其系统优先级也比较低。所以如果系统出现内存不足的情况时就有可能出现系统回收掉正在运行的服务,而前台服务正是解决这种问题的办法。

前台服务与后台服务的区别会有一个通知常驻于通知栏。
使用方法:
其实很简单,只需要在onCreate方法中添加一点东西就行了

    @Override
    public void onCreate() {
        super.onCreate();
        Intent intent = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
        Notification notification = new Notification.Builder(this)
                .setContentTitle("前台服务")
                .setContentText("This is a Service")
                .setSmallIcon(R.mipmap.ic_launcher)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                .setContentIntent(pendingIntent)
                .setWhen(System.currentTimeMillis())
                .build();
        //使用startForeground方法来启动
        startForeground(1, notification);
    }

四、使用IntentService来创建服务

IntentService是Android专门提供的一个用于创建服务的类,其优点在于:

  • 会自动开启线程
  • 在执行完毕后自动结束服务

这个类很好的解决了忘记开启线程执行耗时操作或者在服务执行完毕后没有及时关闭服务的问题,而且相比较自行创建服务,使用IntentService更为简单快捷。

其使用方法也很简单,直接自定义一个IntentService类来继承它就可以了:

public class MyIntentService extends IntentService {

    public MyIntentService() {
        //此处的name参数仅用于调试时用来区别服务,可以自行设定
        super("MyIntentService");
    }

   //服务需要执行的耗时操作或者服务需要执行的逻辑操作
    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        Log.d("MyService", "Thread id is "+Thread.currentThread().getId());
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("MyService", "Service Stop");
    }
}

启动和正常服务的启动方法一样

	Intent intentService = new Intent(this, MyIntentService.class);
	startService(intentService);

另外不能忘的是,它是个服务,也是需要在AndroidManifest中注册的:

        <service
            android:name=".MyIntentService"
            android:enabled="true"
            android:exported="true" />

你可能感兴趣的:(Android学习笔记)