Service 需要在manifest.xml中注册,Service运行于主线程,和Thread没有任何关系,耗时操作需要再开线程
startService
start 方式开启一个Service
- 创建Service
Service 是一个抽象类,需要创建一个子类,并重新相关生命周期的方法
public class TestService extends Service {
public static final String TAG = "TestService";
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
- 配置Service
- 开启/关闭Service
Intent serviceIntent = new Intent(this, TestService.class);
startService(serviceIntent);
//stopService(serviceIntent);
调用了stop后Service会执行onDestory方法
- onStartCommand()的返回值:
在系统因资源不足时杀死这个service,之后以何种方式restart与这里的返回值有关
START_NOT_STICKY:被杀后不会重启
START_STICKY:会重启,除非系统有pending的intent,否则会丢给onstartCommand()一个null的intent。这适合于media player一类的service。
START_REDELIVER_INTENT: 适合于下载等需要立即恢复的工作。
当启动一个Service的时候,会调用该Service中的onCreate()和onStartCommand()方法,当字词启动同一个Service是不会再次调用onCreate,而是直接调用onStartCommand
bindService
- Service 中onBind返回一个Binder实例
private TestBinder mBinder = new TestBinder();
@Override
public IBinder onBind(Intent intent) { return mBinder ;}
public class TestBinder extends Binder {
public void show(){
Log.d("bind service", "show");
}
}
- Activity中创建ServiceConnection进行教会
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
TestService.TestBinder binder = (TestBinder) service;
binder.show();
}
};
- 绑定/解绑Service
bindService(serviceIntent, connection, BIND_AUTO_CREATE);
//unbindService(connection);
解除绑定后Service会执行onDestoty方法
**如果既 start 又bind 则需要stop unbind 才能销毁Service **
IntentService
它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。
创建了一个工作队列,来逐个发送intent给onHandleIntent()。
不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。
默认实现的onBind()返回null
默认实现的onStartCommand()的目的是将intent插入到工作队列中
- 创建IntentService的子类
public class TestIntentService extends IntentService {
public TestIntentService() {
super("TestIntentService");
}
@Override
public void onCreate() {
super.onCreate();
Log.d("TestIntentService", "onCreate");
}
@Override
public void onDestroy() {
Log.i("TestIntentService", "onDestroy");
super.onDestroy();
}
@Override
protected void onHandleIntent(Intent intent) {
getBaiduData();
}
private void getBaiduData() {
try {
URL imageUrl = new URL("https://www.baidu.com/");
HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();
conn.setConnectTimeout(10000);
conn.setRequestMethod("GET");
if(conn.getResponseCode() == 200) {
InputStream is = conn.getInputStream();
Log.d("TestIntentService", readInputStream(is));
}
} catch (IOException e) {
e.printStackTrace();
}
}
private String readInputStream(InputStream is) {
InputStreamReader isReader = new InputStreamReader(is);
BufferedReader bufferReader = new BufferedReader(isReader);
String inputLine = null;
StringBuffer result = new StringBuffer();
try {
while ((inputLine = bufferReader.readLine()) != null) {
result.append(inputLine);
}
} catch (IOException e) {
e.printStackTrace();
}
return result.toString();
}
- 声明Service
- 启动, 无需Stop
Intent intServiceIntent = new Intent(this, TestIntentService.class);
startService(intServiceIntent);
Service 和 Thread 的区别
二者没有什么关系,Service是没有界面的后台服务,不能执行耗时操作,在Activity开启的子线程并不会自动随Activity的destroy而关闭。