您的位置:首页 > 其它

(转)Servers与Activity 的线程关系;Service的生命周期;Service与Activity通信

2013-02-25 12:00 435 查看
我在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方法有返回时调用。第二个参数是[b]onBind[/b]的返回值。

传递数据:

  如果要从Service里往Activity传值,就定义一个类继承自IBinder的实现类Binder,比如命名为MyBinder,建议自定义的类MyBinder是Service的内部类,可以直接在MyBinder里面写带返回值的方法,返回要传的数据,也可以返回Service的对象,在Service里写返回方法。

[java] view
plaincopy

class MyBinder extends Binder  

{  

    public MyService getService()  

    {  

        return MyService.this;  

          

    }  

}  

 

接收数据:

首先接收MyBinder对象:MyBinder binder=(MyBinder)service;,如果方法是写在MyBinder类里面,就直接调用方法,如果不是就接着得到Service的对象MyService ser=binder.getService();,然后调用Service中自定义的方法getA()得到数据。

[java] view
plaincopy

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。

 比如:

[java] view
plaincopy

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,如下:

[html] view
plaincopy

<service android:name="MyService">  

    <intent-filter>  

        <action android:name="wei.liu.IService"/>  

    </intent-filter>  

</service>  

绑定服务的方法:

[java] view
plaincopy

// 绑定AIDL服务   

bindService(new Intent("wei.liu.IService"), serviceConnection, Context.BIND_AUTO_CREATE);   

与上面用的方法一样,第二个参数是ServiceConnection对象。注意:第一个参数不同,不是Bind服务类,而是aidl文件生成的java类。

转自:http://blog.csdn.net/liu149339750/article/details/7822569
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: