Service

作者: 瑟闻风倾 | 来源:发表于2019-11-05 14:28 被阅读0次

1. Service应用场景及 Service和Thread的区别

(1) what is Service(应用场景): 在后台长时间运行而没有与用户界面的应用组件
(2) Service和Thread的区别:

  • Thread:通过开启子线程来执行超时操作
  • Service:service和broadcast一样运行在主线程(UI线程),不能做耗时操作;但可在service中创建子线程来执行耗时操作

2. 开启service的两种方式及区别

说明:service可由activity或broadcast启动并一直运行在后台,但activity和broadcast的销毁不影响service的存活。
(1) startService:activity开启service后,service会一直运行到后台;activity的销毁不能自动关闭service,需手动停止service

  • a. 自定义服务类:创建一个类(如:MyService)继承自Service
  • b. 注册服务:在manifest.xml中注册MyService
  • c. 开启服务:通过startService(intent)方法来开启服务
  • d. 关闭服务:通过stopService(intent)方法来关闭服务

(2) bindService:service和activity进行绑定,绑定取消后service自动被销毁

  • a. 自定义服务类:创建一个类(如:MyService)继承自Service;在MyService中定义内部类MyBinder继承自Binder,并提供返回MyService实例的方法
  • b. 实例化ServiceConnection接口并重写相关方法:在activity中实例化ServiceConnection接口并重写onServiceConnected()和onServiceDisconnected()方法
  • c. 绑定服务:在activity的onCreat()方法中新建intent并绑定服务
  • d. 解绑服务:在activity的onDistory()方法中解绑服务(服务会自动销毁)

bindService开启服务程序执行过程

bindService开启服务程序执行过程.png

服务示例:
(1) MyService.java:

package comi.example.liy.mytestdemo;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

/**
 * Created by liy on 2019-11-04 14:00
 *  1. 通过startService来启动服务:
 *    (1-1)自定义服务类:创建一个类(如:MyService)继承自Service
 *    (1-2)注册服务:在manifest.xml中注册MyService
 *    (1-3)开启服务:通过startService(intent)方法来开启服务
 *    (1-4)关闭服务:通过stopService(intent)方法来关闭服务
 *  2. 通过bindService来启动服务:
 *  (2-1)自定义服务类:创建一个类MyService并继承自Service;在MyService中定义内部类MyBinder继承自Binder,并提供返回MyService实例的方法
 *  (2-2)在activity中实例化ServiceConnection接口,并重写onServiceConnected()和onServiceDisconnected()方法
 *  (2-3)在activity的onCreat()方法中新建intent并绑定服务
 *  (2-4)在activity的onDistory()方法中解绑服务(服务会自动销毁)
 *   程序执行过程:Activity中bindService(intent,connection,flag) -> Service中onCreat() -> Service中onBind() -> Activity中onServiceConnected()
 */
public class MyService extends Service {
    private final IBinder binder = new MyBinder();

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

    @Override
    public void onDestroy() {
        // 当调用者退出(即使没有调用unbindService)或者主动停止服务时会调用
        super.onDestroy();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        // 当调用者退出(即使没有调用unbindService)或者主动停止服务时会调用
        System.out.println("调用者退出了");
        return super.onUnbind(intent);
    }

    //(2-1)在继承自Service的MyService类中:创建内部类MyBinder继承自Binder,并提供返回MyService实例的方法
    public class MyBinder extends Binder {
        MyService getService() {
            return MyService.this;//获取MyService的引用,从而可以引用其内部的方法和变量
        }
    }

    public void excute() {
        System.out.println("通过Binder得到Service的引用来调用Service内部的方法");
    }

}

(2) ServiceBindActivity.java:

package comi.example.liy.mytestdemo;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;

/**
 * Created by liy on 2019-11-04 14:01
 */
public class ServiceBindActivity extends Activity {

    private MyService myService;
  //(2-2)实例化ServiceConnection接口,并重写onServiceConnected()和onServiceDisconnected()方法
    private ServiceConnection connection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myService = ((MyService.MyBinder) service).getService();
            System.out.println("Service连接成功");
            //执行服务内部的方法
            myService.excute();
        }
        @Override
        public void onServiceDisconnected(ComponentName name) {
            myService = null;
        }
    };


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent intent = new Intent(this, MyService.class);
        bindService(intent, connection, Context.BIND_AUTO_CREATE);//(2-3)绑定服务
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(connection);//(2-4)解绑服务
    }

}

(3) ServiceStartActivity.java:

package comi.example.liy.mytestdemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

/**
 * Created by liy on 2019-11-04 14:22
 */
public class ServiceStartActivity extends Activity {
    private Intent intent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        intent = new Intent(ServiceStartActivity.this,MyService.class);//(1-3)启动服务
        startService(intent);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        stopService(intent);//(1-4)停止服务
    }
}

(4) Android.manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="comi.example.liy.mytestdemo">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".ServiceBindActivity"/>
        //(1-2)注册服务
        <service android:name=".MyService"/>
        <activity android:name=".ServiceStartActivity"/>
    </application>

</manifest>

相关文章

网友评论

    本文标题:Service

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