码迷,mamicode.com
首页 > 移动开发 > 详细

Android Service 笔记

时间:2015-04-15 13:34:53      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:service   android   

   从运行模式来看,Android的服务组件没有运行在独立的进程或线程中,而是和Android其他组件一样运行在进程的主线程中。所以直接在服务组件中同步执行耗时操作,将会阻塞主线程。

   像Service的子类IntentService,完成构造函数和onHandleIntent(Intent intent)方法,然后就可以通过startService(intent)发送执行命令,IntentService接收到首个命令时,IntentService完成启动,并触发一个后台线程,然后将命令放入队列。IntentService会顺序执行这些命令,并同时为每一条命令在后台线程上调用onHandleIntent(intent)的方法。当执行完队列的所有命令后,服务也随即停止并被销毁。PS:IntentService是一种non-sticky服务。

   non-sticky服务:当服务自己认为已经完成任务时,会调用stopSelf()或者stopSelf(int)方法告诉Android任务已经完成,以结束服务。

   sticky服务:服务会持续运行,直到某个组件调用Context.stopService(Intent)让它停止。


Service的生命周期

一、Context.startService

    当首次启动服务时,会依次调用onCreate()和onStart(),如果服务已经被创建,再调用startService(intent)


就只会执行onStart()。Intent传递过来的参数可以在onStartCommand()方法中进行处理。主动结束时执行


stopSelf()方法,被动结束调用Context.stopService()方法,然后再执行onDestroy()。


二、Context.bindService


    如果客户端想持续连接服务,获取服务实例可以使用绑定服务这种方式。


    同样首次创建服务时,会调用onCreate(),然后onBind方法会构造一个IBinder对象返回给调用者,建立通信连


接,调用者通过重写ServiceConnection类中的onServiceConnected()方法可以获取此IBinder对象。通过


onUnBind解绑服务,然后再执行onDestroy()。绑定服务的组件在销毁前应解除绑定,否则会造成内存泄


露。


部分代码如下:


Service端

public class MyService extends Service {  
    private static final String TAG = "MyService";  
    private MyBinder mBinder = new MyBinder(); 
	// 创建一个Binder对象,通过onBinder返回给调用者,调用者再通过此对象得到该服务实例
    @Override  
    public IBinder onBind(Intent intent) {  
        Log.e(TAG, "start IBinder~~~");  
        return mBinder;  
    }  
    @Override  
    public void onCreate() {  
        Log.e(TAG, "start onCreate~~~");  
        super.onCreate();  
    }  
      
    @Override  
    public void onDestroy() {  
        Log.e(TAG, "start onDestroy~~~");  
        super.onDestroy();  
    }  
      
      
    @Override  
    public boolean onUnbind(Intent intent) {  
        Log.e(TAG, "start onUnbind~~~");  
        return super.onUnbind(intent);  
    }  
      
    //为服务创建一个公共方法,用于测试 
    public String test(){  
          System.out.println("test");
    }  
      
    public class MyBinder extends Binder{  
        MyService getService(){  
            return MyService.this;  
        }  
    }  
}  


调用端:


public class ServiceDemo extends Activity {  
      
    private ServiceConnection mServiceConnection = new ServiceConnection() {  
        
        public void onServiceConnected(ComponentName name, IBinder service) {  
           
            mMyService = ((MyService.MyBinder)service).getService();  
			mMyService.test(); // 直接调用服务实例的公共方法
        }  
          
        public void onServiceDisconnected(ComponentName name) {  
            
              
        }  
    };  
	
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
		Intent i  = new Intent();  
        i.setClass(ServiceDemo.this, MyService.class);  
        mContext.bindService(i, mServiceConnection, BIND_AUTO_CREATE);  
	}     
      
}  




Android Service 笔记

标签:service   android   

原文地址:http://blog.csdn.net/u012964281/article/details/45055237

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!