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可以通过广播。