(转)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
我在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
相关文章推荐
- Servers与Activity 的线程关系;Service的生命周期;Service与Activity通信
- Activity,Service,Broadcast其创建的背景线程的关系
- service汇总(service模拟后台下载、service刷新UI、service与Activity生命周期关系、service和活动间的通信)
- Activity生命周期和其中另外线程的关系
- Activity与service的生命周期及其关系
- ActivityManagerService服务线程启动源码分析【转】
- Activity, Service,Task, Process and Thread之间的关系
- Activity&Fragment&Service的生命周期
- ActivityThead ActivityManagerService 和activity关系概述
- ActivityManagerService服务线程启动源码分析
- Android中Activity、Service和线程之间的通信
- Android 编程组件-Fragments 的生命周期与 Activity 的生命周期之间的关系
- Activity和Service的生命周期
- android activity与service的生命周期
- android系统service组件的线程关系
- ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的关系(and5.1)
- Android中Activity、Service和线程之间的通信
- Activity 与service的进程关系(今日面试被问到的)
- 一、概述 EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间
- Android Activity、Service、Widget 生命周期