Service详解
1.后台运行,没有界面与activity相对。
2.Service更不容被回收,相对于全局对象或后台activity来说。
Service生命周期:
使用startService启动服务
service没有启动时:
onCreate()- >onStartCommand()
service已经启动时:
onStartCommand()
对应使用stopService()结束服务:
1.只有在没有人连到该服务时才会执行。
onDestroy()
使用bindService连接服务:
service没有启动时:
onCreate()->onBind()
service已经启动时:
1.必须是第一连接此服务才
onbind
对应使用unbindService断开连接
onUnbind()
unbindService只有在,1.service不是startSevice启动的或者是startSevice启动已经调用了stopService,2.并且没人没有人连到该服务才会执行
ondestroy()
startService的目的是启动service
bindService目的获得service的引用。
starService代码
Intent startIntent = new Intent(this, MyService.class);
startService(startIntent);
bindService代码
Intent intent = new Intent(MainActivity.this, MyService.class);
bindService(intent, connection, BIND_AUTO_CREATE);
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e(TAG, "onServiceConnected()");
myBinder = (MyService.MyBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.e(TAG, "onServiceDisconnected()");
}
};
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
Log.e(TAG, "onBind()");
return new MyBinder();
}
public class MyBinder extends Binder {
}
}
aidl:Android Interface Definition Language
package com.lina.android.activitydemo;
interface MyAIDL {
void fun();
}
public class MyService extends Service {
public static final String TAG = "MyService";
@Override
public IBinder onBind(Intent intent) {
Log.e(TAG, "onBind()");
return new MyBinder();
}
public class MyBinder extends MyAIDL.Stub {
@Override
public void fun() throws RemoteException {
}
}
}
<service android:name=".MyService">
<intent-filter>
<action android:name="lina123" />
</intent-filter>
</service>
------------------------------------------------------------------
package com.lina.android.activitydemo;
interface MyAIDL {
void fun();
}
Intent intent = new Intent("lina123");
bindService(intent, connection, BIND_AUTO_CREATE);
public ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MyAIDL myAIDL = MyAIDL.Stub.asInterface(service);
try {
myAIDL.fun();
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
Activity与Service通讯
activty主动把数据传给service可以通过广播,重要是是bindservice。
service主动把数据传给activity可以通过广播。