android四大组件之Service和子类IntentService

四大组件中, Service跟Activity的生命周期非常类似,它也是可执行的.甚至可看做是没有界面的"Activity", 因为它的运行,用户并不会像Activity那样能看到它能呈现出来具体的视图界面. 同样,就像Activity一样, 需要继承Service来使用它的子类. 并且同样需要在AndroidManifest.xml中配置所定义的Service.

Service的生命周期

简述上面周期中的几个方法:

1, 如图示,Service 的几个方法onCreate(), onDestroy()是跟Activity一样的,都是创建和销毁前回调的方法.Service在Activity里被创建启动和停止, 也可以在自身使用stopSelf()来停止.

2, onStart() 在新版本已经被onStartCommand()所代替,如果是应用支持旧版本的系统,则继续用onStart(). onStart(0 和onStartCommand() 都是Service启动时会回调的方法. 如果是通过startService()来启动Service,那么每次启动都会回调onStartCommand() 这个方法.

3, onBind(), Service被绑定时回调的方法.

4, onUnbind(), Service和所绑定的所有Activity都断开时会回调该方法.

这里要强调下Activity启动Service的两种方法和区别:

Activity可以通过startService() 和 bindService() 两个方法来启动.startService()启动Service, Activity和Service之间没有关联, 当Activity退出了,Service会继续存在并运行. 而bindService() 方式启动的话,Activity和Service是有关联的,Activity不仅能和Service通信,并且当Activity退出时,Service也会中止.下面会上个例子,通过代码看出区别:

配置方式

<Service android:name="com.test.service.MyBindService"><intent-filter><!– 配置action就能像广播一样,通过action启动指定的Service –><action android:name="com.test.com.test.service.My_MSG"></intent-filter></Service>

新建两个Service:

** * 通过StartService()来启动的Service对象 * @author Mr.Et * */public class MyStartService extends Service{private String TAG = "MyStartService";@Overridepublic void onCreate(){Log.i(TAG, "onCreate()");super.onCreate();}/** * Service被启动后会回调该方法 */@Overridepublic int onStartCommand(Intent intent,int flags,int startId){Log.i(TAG, "onStartCommand()");super.onStartCommand(intent, flags, startId);return START_STICKY;}/** * (该方法必须被实现) * 绑定Service时会回调该方法 */@Overridepublic IBinder onBind(Intent intent) {//这里默认为空,如果需要传回Binder对象跟Activity通信//则可以继承Binder来实现返回对象即可.Log.i(TAG, "onBind()");return null;}@Overridepublic void onDestroy(){super.onDestroy();Log.i(TAG, "onDestroy()");}}/** * 通过bindService()来启动的Service对象 * @author Mr.Et * */public class MyBindService extends Service{private String TAG = "MyBindService";public class MyBinder extends Binder{public void printContent(){Log.i(TAG, "print the content in Class – MyBinder.");}}/** * Service被创建是会回调该方法 */@Overridepublic void onCreate(){Log.i(TAG, "onCreate()");super.onCreate();}/** * Service被启动后会回调该方法 */@Overridepublic int onStartCommand(Intent intent,int flags,int startId){Log.i(TAG, "onStartCommand()");super.onStartCommand(intent, flags, startId);return START_STICKY;}/** * 绑定Service时会回调该方法 */@Overridepublic IBinder onBind(Intent intent) {Log.i(TAG, "onBind()");// 返回Binder的子类MyBinder和Activity通信return new MyBinder();}/** * 如果前面是通过bindService()来绑定启动Service的, * 那么当解绑停止Service时会调用该方法 */@Overridepublic boolean onUnbind(Intent intent){Log.i(TAG, "onUnbind()");return true;}/** * Service被销毁前会回调该方法 */@Overridepublic void onDestroy(){Log.i(TAG, "onDestroy()");super.onDestroy();}}

启动Service的方法

第一种,startService()启动Service

Intent StartIntent = new Intent(this,MyStartService.class);/** * 通过startService()启动Service * 这种方式 */private void doStartService(){//类似广播,也可以用setAction("XXX")使特定的Service启动//StartIntent.setAction("com.test.service.My_MSG");//创建Intent,跟跳转Activity的方式类似Intent StartIntent = new Intent(this,MyStartService.class);startService(StartIntent);}/** * 停止Service */private void doStopService(){stopService(StartIntent);}第二种,bindService()启动(绑定)Service

private MyBinder myBinder;private ServiceConnection conn = new ServiceConnection() {//当Activity和Service连接成功时会调用该方法@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stub//在这里通过自定义的Binder与Service通信myBinder = (MyBinder)service;}//当Activity和Service断开连接时会调用该方法@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stub}};/** * 通过bindService()启动(绑定)Service */private void doBindSerive(){Intent bindIntent = new Intent();bindIntent.setAction("com.test.service.My_MSG");//当Service还没创建时,//第三个参数如果为0则不自动创建Service,为Service.BIND_AUTO_CREATE则自动创建bindService(bindIntent, conn, Service.BIND_AUTO_CREATE);}/** * 解除绑定Service */private void doUnbindService(){unbindService(conn);}ServiceConnection对象conn是通过绑定方式启动,和Service通信的重要中介.当和Service连接成功和断开连接时都会回调里面的onServiceConnected() 和onServiceDisconnected() 方法. 但如果是用户主动使用unBindService()断开Activity和Service之间的连接,onServiceDisconnected()并不会被调用.因为系统将这视为正常情况. 只有是由于内存不足或其他原因导致异常中止Service和Activity之间的连接时,才会调用该方法. 并且可以通过在conn中获取Binder对象, 实现和Service的通信.

IntentService和Service的区别你可能付出一定的代价,但日后你得到的,远比付出的多得多。

android四大组件之Service和子类IntentService

相关文章:

你感兴趣的文章:

标签云: