您的位置:首页 > 其它

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

2012-08-02 13:57 417 查看
我在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里写返回方法。

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去启动。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: