Service是android四大組件之一氯檐,和Activity不同的是Service是一個(gè)低調(diào)的“后臺(tái)”工作者杆煞,臟活累活都是他干故硅,但是用戶(hù)卻從來(lái)不會(huì)感到他的存在爹橱,因?yàn)镾ervice沒(méi)有UI萨螺,就是沒(méi)有和用戶(hù)交互的入口,這里需要提醒的是Service依然運(yùn)行在主線(xiàn)程愧驱,如果沒(méi)有在AndroidManifest沒(méi)有配置process屬性慰技,默認(rèn)情況下是和Activity一樣都運(yùn)行在主線(xiàn)程。
首先我們先介紹Service的兩種用法组砚,一種是startService()啟動(dòng)Service吻商,另外一種是bindService()。
首先我們創(chuàng)建一個(gè)Service,當(dāng)然Service創(chuàng)建完后需要在AndroidManifest中配置糟红,不然不會(huì)啟動(dòng)艾帐。
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
public class MyService extends Service {
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
Log.e("SERVICE", "onBind");
return new MyBinder();
}
class MyBinder extends IMyAidlInterface.Stub {
@Override
public void hello(String name) throws RemoteException {
Log.e("SERVICE", name);
}
}
@Override
public boolean onUnbind(Intent intent) {
Log.e("SERVICE", "onUnbind");
return super.onUnbind(intent);
}
@Override
public void onCreate() {
super.onCreate();
Log.e("SERVICE", "onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("SERVICE", "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.e("SERVICE", "onDestroy");
super.onDestroy();
}
}
我們先看看兩種啟動(dòng)方式的生命周期乌叶。
1.startService的生命周如下
startService(new Intent(MainActivity.this, MyService.class));
啟動(dòng)
結(jié)束
2.bindService的生命周期如下
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
IMyAidlInterface myAidlInterface = IMyAidlInterface.Stub.asInterface(service);
try {
myAidlInterface.hello("Hello World");
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
//在Activity onCreate()的時(shí)候進(jìn)行bind
bindService(new Intent(MainActivity.this, MyService.class), connection, Context.BIND_AUTO_CREATE);
//在Activity onDestory()的時(shí)候進(jìn)行bind
unbindService(connection);
如果我們?cè)貯ctivity的時(shí)候不調(diào)用unbindService(connection);就會(huì)報(bào)錯(cuò)。
05-26 17:12:18.305 18979-18979/com.sundroid.helloworld E/ActivityThread: Activity com.sundroid.helloworld.MainActivity has leaked ServiceConnection com.sundroid.helloworld.MainActivity$1@6a9294e that was originally bound here
android.app.ServiceConnectionLeaked: Activity com.sundroid.helloworld.MainActivity has leaked ServiceConnection com.sundroid.helloworld.MainActivity$1@6a9294e that was originally bound here
at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:1092)
at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:986)
at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1303)
at android.app.ContextImpl.bindService(ContextImpl.java:1286)
at android.content.ContextWrapper.bindService(ContextWrapper.java:604)
at com.sundroid.helloworld.MainActivity$2.onClick(MainActivity.java:57)
at android.view.View.performClick(View.java:5226)
at android.view.View$PerformClick.run(View.java:21350)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5574)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
啟動(dòng)
結(jié)束
在測(cè)試過(guò)程中柒爸,發(fā)現(xiàn)一個(gè)現(xiàn)象准浴,就是如果我已經(jīng)啟動(dòng)了一個(gè)Service,那么我再去bind或者是start的時(shí)候就不會(huì)走onCrteate()揍鸟,這里的原因先不在本文進(jìn)行介紹兄裂。Service的啟動(dòng)我們需要了解的先介紹這么多句旱,如果有什么寫(xiě)的不妥的地方阳藻,歡迎讀者留言,謝謝谈撒。