AndroidStudio-3.2.1(五)四大组件入门之Service

时间:2024-03-21 09:03:56

本篇介绍Android四大组件之Service基本知识和常用操作。

Android四大组件分别为activity、service、content provider、broadcast receiver。

Service

Service是运行在手机后台的服务,没有界面,属于系统组件。service的创建和销毁是由操作系统控制,不能通过代码控制,即不能通过new来实例化service。但是可以通过代码进行服务状态的启动、停止及通信。
启动服务有两种方式:startService和bindService。区别如下:

  • startService()启动服务,导致服务的onStartCommand()方法被调用。当服务是started状态时,其生命周期与启动它的组件无关,并且可以在后台无限期运行,即使启动服务的组件已经被销毁。因此,服务需要在完成任务后调用stopSelf()方法停止,或者由其他组件调用stopService()方法停止。
  • bindService()启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。对应使用unbindService()来停止服务。

下面通过一个示例来演示service的基本操作:

1、添加一个service

在项目文件夹上右键选择Service添加到项目中。与Activity一样,也会在AndroidManifest.xml中增加一个service的配置项。
AndroidStudio-3.2.1(五)四大组件入门之Service

       <service
            android:name=".service.MyService"   android:enabled="true"
            android:exported="true" />
2、在service里重写方法

为了演示启动和停止服务的操作,我们需要重写如下4个方法。
当使用onBind方式启动服务时,需要一个Binder对象,通过该对象实现调用者与服务之间的通信。

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

    private MyServiceBinder myBinder = new MyServiceBinder();

    @Override
    public IBinder onBind(Intent intent) {
        System.out.println("服务onBind");
        return myBinder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        System.out.println("创建服务");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println("销毁服务");
        stopTimer();
    }

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

3、在activity里添加4个按钮控制service状态

添加的4个按钮分别为启动服务、停止服务、绑定服务、解绑服务。点击不同按钮,可在Logcat中查看服务状态的变化。
AndroidStudio-3.2.1(五)四大组件入门之Service
需要注意的是,只用使用bindService()启动服务时才能实现与service的通信,具体在
onServiceConnected函数中,通过binder类来获取运行中的service实例,再通过service内部公开的方法进行通信。

public class HelloActivity extends AppCompatActivity {
    private Button btnStartService;
    private Button btnStopService;
    private Button btnBindService;
    private Button btnUnbindService;
    private MyService myService = null;

    private ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder binder) {
            System.out.println("服务连接onServiceConnected");
            myService = ((MyService.MyServiceBinder) binder).getService();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hello);
        btnStartService = findViewById(R.id.btnStartService);
        btnStopService = findViewById(R.id.btnStopService);
        btnBindService = findViewById(R.id.btnBindService);
        btnUnbindService = findViewById(R.id.btnUnbindService);

        btnStartService.setOnClickListener(listener);
        btnStopService.setOnClickListener(listener);
        btnBindService.setOnClickListener(listener);
        btnUnbindService.setOnClickListener(listener);
    }

    OnClickListener listener = new OnClickListener() {
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btnStartService:
                    startService(serviceIntent);
                    break;
                case R.id.btnStopService:
                    stopService((serviceIntent));
                    break;
                case R.id.btnBindService:
                    bindService(serviceIntent, conn, Context.BIND_AUTO_CREATE);
                    break;
                case R.id.btnUnbindService:
                    unbindService(conn);
                    myService = null;
                    break;
            }
        }
    };
}