我在Service的onCreate方法中让线程sleep 10秒钟,Activity阻塞了!
我在Activity 中新建一子线程,在子线程中启动Service,Activity还是阻塞了!
在Service里面新建一线程,进行延时操作,Activity不再阻塞了!
Service的生命周期:
用startService(intent)启动Services,第一次运行执行onCreate---onStartCommand------onStart,之后再运行就不会执行onCreate了,其中onStart其实是被onStartCommand调用的,把onStartCommand的返回值改了,onStart就不会执行了。
用bindService(intent, conn, Context.BIND_AUTO_CREATE)启动Services。第一次运行执行onCreate----onBind。在unbindService(conn)之前再次执行bindService是没用的。其中Context.BIND_AUTO_CREATE==1;如果此参数填0,那么bindService后service里面的代码不会执行,bindService(intent, conn, 0)和startService(intent)一起执行,service里面的onBind会执行。
unbindService(conn)之后执行onUnbind-----onDestroy。
Activity与Service的一种通信方式:
通过bindService(intent, conn, Context.BIND_AUTO_CREATE)启动service,其中第二个参数是ServiceConnection的对象,需实现两个方法,第一个是public void onServiceDisconnected(ComponentName name),unbind时调用这方法,onServiceConnected(ComponentName name, IBinder service),当Service的onBind方法有返回时调用。第二个参数是onBind的返回值。
传递数据:
如果要从Service里往Activity传值,就定义一个类继承自IBinder的实现类Binder,比如命名为MyBinder,建议自定义的类MyBinder是Service的内部类,可以直接在MyBinder里面写带返回值的方法,返回要传的数据,也可以返回Service的对象,在Service里写返回方法。
class MyBinder extends Binder { public MyService getService() { return MyService.this; } }
接收数据:
首先接收MyBinder对象:MyBinder binder=(MyBinder)service;,如果方法是写在MyBinder类里面,就直接调用方法,如果不是就接着得到Service的对象MyService ser=binder.getService();,然后调用Service中自定义的方法getA()得到数据。
public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub MyBinder binder=(MyBinder)service; MyService ser=binder.getService(); int a=ser.getA(); }
Service的AIDL方式通信:
1.在工程下建立一个以aidl结尾的文件,如IService,语法类似java。
比如:
package wei.liu; interface IServer { String getValue(); }保存,如果语法没问题,会在gen/wei.liu/下面生成一个IService.java文件。
IMyService.aidl文件的内容与Java代码非常相似,但要注意,不能加修饰符(例如,public、private)、AIDL服务不支持的数据类型(例如,InputStream、OutputStream)等内容。
2.建立一个继承Service类的子类,比如MyService,在MyService类建立一个继承IService.Stub的内部类,比如MyServiceImpl,需重写getValue方法。IService.Stub是IService.java的内部类。
3.给MyService的onBind方法返回MyServiceImpl的对象。
4.在AndroidManifest,xml文件中给Service加个Action,如下:
<service android:name="MyService"> <intent-filter> <action android:name="wei.liu.IService"/> </intent-filter> </service>
// 绑定AIDL服务 bindService(new Intent("wei.liu.IService"), serviceConnection, Context.BIND_AUTO_CREATE);与上面用的方法一样,第二个参数是 ServiceConnection对象。注意:启动service并不一定要指定启动哪个类,也可以用Action去启动。