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开启服务程序执行过程:

服务示例
:
(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>
网友评论