Service
- java.lang.Object
- android.content.Context
- android.content.ContextWrapper
- android.app.Service
- android.content.ContextWrapper
- android.content.Context
2.1 Service简介
Service是一种与Activity级别差不地的组件,同样属于Android的四大组件(Activity、Service、BroadcastReceiver、ContentProvider);Service是一种不能自己运行的只能后台运行,而且Service不能直接跟用户交互,但是Service可以跟其他组件进行交互,比如启动后的播放器,后台记录地理信息等,总之Service都是在后台服务。
2.2 Service启动方式
服务的启动方式:
- 1)context.startService()
- 2 )context.bindService()
服务的启动流程:
1)context.startService()->onCreate()->onStart()->Service running->context.stopService()->onDestroy()->Service stop
开启服务首先调用onCreate(),然后调用onStart() 运行服务。开发人员通过调用stopService()停止服务,假如开发人员没用调用stopService()而退出程序,则服务会在后台继续运行,但我们再次打开程序时会调用onStart(),而并不会调用onCreate(),也就是说onStart()可多次调用。这时我们调用stopService()才能停止服务。
所以调用startService的生命周期为:onCreate –> onStart (可多次调用) –> onDestroy
2)context.bindService() -> onCreate() -> onBind() -> Service running -> onUnbind() -> onDestroy() -> Service stop
onBind()将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service的实例、运行状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。
所以调用bindService的生命周期为:onCreate –> onBind(只一次,不可多次绑定) –> onUnbind –> onDestory。
2.3 Service生命周期
Service的生命周期比起Activity简单很多,因为Service就继承了onCreate()、onStart()、onDestroy()三个方法。
但我们启动服务是我们会调用onCreate()、onStart()。停止服务时调用onDestroy();这样一个服务就结束了。
2.4 Service实际例子
startService方式:
Service代码
package com.maple.servicedemo;
import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
public class MainService extends Service {
private static final String TAG = "com.maple.servicedemo.mainservice";
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Log.d(TAG, "onCreate");
}
@Override
public void onDestroy() {
Log.d(TAG, "服务停止成功!");
}
@Override
public void onStart(Intent intent, int startId) {
Log.d(TAG, "onStart");
if(intent != null) {
Bundle bundle = intent.getExtras();
if(bundle != null){
int op = bundle.getInt("op");
switch (op) {
case 1:
Log.d(TAG, "服务启动成功!");
break;
default:
break;
}
}
}
}
}
Activity代码:
package com.maple.servicedemo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
private static final String TAG = "com.maple.servicedemo";
private Button mButton = null;
private Button mButtonStop = null;
private int op = -1;
private Intent intent = new Intent("com.maple.servicedemo.MainService");
private void startServices(int op) {
Bundle bundle = new Bundle();
bundle.putInt("op", op);
intent.putExtras(bundle);
startService(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button) findViewById(R.id.start_service);
mButtonStop = (Button) findViewById(R.id.stop_service);
mButton.setOnClickListener(new myButtonListener());
mButtonStop.setOnClickListener(new myButtonListener());
}
// @Override
// protected void onDestroy() {
// super.onDestroy();
//
// if(intent != null) {
// stopService(intent);
// }
// }
private class myButtonListener implements OnClickListener {
@Override
public void onClick(View v) {
if(v.getId() == R.id.start_service) {
startServices(1);
}else if (v.getId() == R.id.stop_service) {
stopService(intent);
}
}
}
}
bindService方式:
Service代码:
private static final String TAG = "com.maple.servicedemo.mainservice";
private final IBinder binder = new MyBinder();
//此方法是为了可以在Acitity中获得服务的实例
public class MyBinder extends Binder {
MainService getService() {
return MainService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind");
return binder;
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "启动服务");
Toast.makeText(this, "启动服务", Toast.LENGTH_SHORT).show();
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "服务停止");
Toast.makeText(this, "服务停止", Toast.LENGTH_SHORT);
}
Activity代码:
package com.maple.servicedemo;
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;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private static final String TAG = "com.maple.servicedemo";
private Button mButton = null;
private Button mButtonStop = null;
private MainService mService = null;
private void bindServices() {
//进入Activity开始服务
Intent intent = new Intent(MainActivity.this, MainService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
}
private ServiceConnection conn = new ServiceConnection() {
//无法获取到服务对象时的操作
@Override
public void onServiceDisconnected(ComponentName name) {
mService = null;
}
//获取服务对象时的操作
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = ((MainService.MyBinder) service).getService();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindServices();
}
@Override
protected void onDestroy() {
super.onDestroy();
//退出服务
this.unbindService(conn);
}
}
记得要在AndroidManifest.xml注册下
<service
android:enabled="true"
android:name=".MainService">
<intent-filter>
<action android:name="com.maple.servicedemo.MainService" />
</intent-filter>
</service>