欢迎转载,转载请标明出处,谢谢^_^

Service是Android四大组件之一(其它三个:Activity,Content Provider内容提供者,BroadcastReceiver广播接收器)。接下来仔细介绍下Service的理论及使用。
1、Service的种类:

  • a:本地服务(Local) :该服务依附在主进程上
  • b:远程服务(Remote):该服务是独立的进程

也分前台服务(会在通知一栏显示 ONGOING 的 Notification)和后台服务(默认的服务即为后台服务,即不会在通知一栏显示 ONGOING 的 Notification)

2、Service的生命周期

  • 当采用startService方式启动Service时,生命周期方法执行的顺序为:onCreate()–>onStartCommand()–>onDestory()。
  • 当采用bindService方式启动Service时,生命周期方法执行的顺序为:onCreate()–>onBind()–>onUnBind()–>onDestory()。

3、Service的启动

1:想要用启动服务,首先得在 Androidmanifest.xml 中注册 service。即在<application></application> 节点中添加(由于要填写用户自定义的Service所在位置,可在创建完Service后再配置,提前写出来只是提醒,免得忘记):

<service android:name=".service.MyService"/>

Service其它基本项的配置:

android:name  ————-  服务类名

android:label  ————–  服务的名字,如果此项不设置,那么默认显示的服务名则为类名

android:icon  ————–  服务的图标

android:permission  ——-  申明此服务的权限,这意味着只有提供了该权限的应用才能控制或连接此服务

android:process  ———-  表示该服务是否运行在另外一个进程,如果设置了此项,那么将会在包名后面加上这段字符串表示另一进程的名字

android:enabled  ———-  如果此项设置为 true,那么 Service
将会默认被系统启动,不设置默认此项为 false

android:exported  ———  表示该服务是否能够被其他应用程序所控制或连接,不设置默认此项为 false

2:创建Service:
启动Service有两种方式:startService()bindService() ,两种方法都有对应自己的停止服务的方法:stopService()unbindService() 。不管使用哪种方式,创建Service时都需要重写相同的方法,只不过bind方式需要返回IBinder 对象用来与activity的通信,如果只是通过startService() 的话,就无需返回,系统默认返回null
如果开启服务既用了startService() 也用了bindService() (即在接下来的例子中即点击了”开启service”按钮,又点击了”绑定activity”按钮),那么想要停止服务的话需要同时执行:stopService()unbindService() (即既要点击”解除绑定activity”按钮,也要点击”关闭service”按钮)不然将无法停止服务。

接下来的例子综合两种方式。
启动Service的方法和启动Activity很类似,都需要借助Intent来实现,并且需要重写onCreate等方法,看一下具体的例子:

4、Service的实例

新建项目,自定义类MyService继承 Service ,并重写方法:

public class MyService extends Service {

    //自定义的内部类,实现绑定后要执行的操作,例如:后台下载等
    private MyBinder myBinder = new MyBinder();

    //重写方法,用于与activity之间的通信,默认返回null
    @Override
    public IBinder onBind(Intent intent) {
        return myBinder;
    }

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

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("MyService", "创建");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("MyService","启动了");
        return super.onStartCommand(intent, flags, startId);
    }

    //实现内部类,后台要执行的具体的方法
    public class MyBinder extends Binder{
        public void download(){
            Log.d("MyService","执行操作");
            //具体的后台下载操作
        }
    }
}

现在可以按照开始位置处配置Androidmanifest.xml 了,完成之后,
接下来实现activity中的方法:

public class MainActivity extends AppCompatActivity {

    private Button button1,button2,button3,button4;

    //首先创建了一个ServiceConnection的匿名类,在里面重写了onServiceConnected()方法和onServiceDisconnected()方法,这两个方法分别会在Activity与Service建立关联和解除关联的时候调用。
    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //通过向下转型得到了MyBinder的实例,及MyService中内部类的实例
            MyService.MyBinder myBinder = (MyService.MyBinder) service;
            myBinder.download();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d("MyService","解除绑定");
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();//获取组件
        listeners();//监听组件
    }
    private void init(){
        button1 = (Button)findViewById(R.id.start);
        button2 = (Button)findViewById(R.id.stop);
        button3 = (Button)findViewById(R.id.bind);
        button4 = (Button)findViewById(R.id.unbind);
    }
    private void listeners(){
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //通过startService()开启服务
                startService(new Intent(getBaseContext(), MyService.class));
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            //通过stopService()停止服务
                stopService(new Intent(getBaseContext(), MyService.class));
            }
        });
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            //通过bindService()绑定服务
                bindService(new Intent(getBaseContext(), MyService.class),connection,BIND_AUTO_CREATE);
            }
        });
        button4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            //通过bindService()解除服务
                unbindService(connection);
            }
        });
    }
}

xml布局文件中就四个按钮:

<Button
        android:id="@+id/start"
        android:text="开启service"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/stop"
        android:text="关闭service"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/bind"
        android:text="绑定activity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/unbind"
        android:text="解除绑定activity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />