ÔµØÖ·:http://blog.csdn.net/wulianghuan/article/details/8596467
Service¸ÅÄî¼°ÓÃ;:
A service is an application component that can perform long-running operations in the background and does not provide a user interface¡£
ͨ³£serviceÓÃÀ´Ö´ÐÐһЩºÄʱ²Ù×÷,»òÕߺǫִ́Ðв»ÌṩÓû§½»»¥½çÃæµÄ²Ù×÷,ÀýÈç:ÏÂÔØ¡¢²¥·ÅÒôÀÖ¡£
ServiceÉúÃüÖÜÆÚ :
Android ServiceµÄÉúÃüÖÜÆÚ²¢²»ÏñActivityÄÇô¸´ÔÓ,ËüÖ»¼Ì³ÐÁËonCreate(),onStart(),onDestroy()Èý¸ö·½·¨,µ±ÎÒÃǵÚÒ»´ÎÆô¶¯Serviceʱ,ÏȺóµ÷ÓÃÁËonCreate(),onStart()ÕâÁ½¸ö·½·¨,µ±Í£Ö¹Serviceʱ,ÔòÖ´ÐÐonDestroy()·½·¨,ÕâÀïÐèҪעÒâµÄÊÇ,Èç¹ûServiceÒѾÆô¶¯ÁË,µ±ÎÒÃÇÔÙ´ÎÆô¶¯Serviceʱ,²»»áÔÚÖ´ÐÐonCreate()·½·¨,¶øÊÇÖ±½ÓÖ´ÐÐonStart()·½·¨,¾ßÌåµÄ¿ÉÒÔ¿´ÏÂÃæµÄʵÀý¡£
ServiceÓëActivityͨÐÅ:
Serviceºó¶ËµÄÊý¾Ý×îÖÕ»¹ÊÇÒª³ÊÏÖÔÚÇ°¶ËActivityÖ®ÉϵÄ,ÒòΪÆô¶¯Serviceʱ,ϵͳ»áÖØпªÆôÒ»¸öеĽø³Ì,Õâ¾ÍÉæ¼°µ½²»Í¬½ø³Ì¼äͨÐŵÄÎÊÌâÁË(AIDL)ÕâÒ»½ÚÎÒ²»×÷¹ý¶àÃèÊö,µ±ÎÒÃÇÏë»ñÈ¡Æô¶¯µÄServiceʵÀýʱ,ÎÒÃÇ¿ÉÒÔÓõ½bindServiceºÍonBindService·½·¨,ËüÃÇ·Ö±ðÖ´ÐÐÁËServiceÖÐIBinder()ºÍonUnbind()·½·¨¡£
ÕâÀïÒªÌá¼°Ò»µã:¼Ì³ÐserviceµÄ×ÓÀàÔÚÖØдserviceµÄ·½·¨ÖÐ,³ýÁËÒ»¸öonStart()·½·¨Ö®Íâ,»¹ÓÐÒ»¸öonStartCommand()·½·¨,ÓйØonStartCommand()·½·¨ÉÔ΢×÷µã½éÉÜ:
Android¿ª·¢µÄ¹ý³ÌÖÐ,ÿ´Îµ÷ÓÃstartService(Intent)µÄʱºò,¶¼»áµ÷ÓøÃService¶ÔÏóµÄonStartCommand(Intent,int,int)·½·¨,È»ºóÔÚonStartCommand·½·¨ÖÐ×öһЩ´¦Àí¡£È»ºóÎÒÃÇ×¢Òâµ½Õâ¸öº¯ÊýÓÐÒ»¸öintµÄ·µ»ØÖµ,ÕâƪÎÄÕ¾ÍÊǼòµ¥µØ½²½²int·µ»ØÖµµÄ×÷Óá£
´ÓAndroid¹Ù·½ÎĵµÖÐ,ÎÒÃÇÖªµÀonStartCommandÓÐ4ÖÖ·µ»ØÖµ:
START_STICKY:Èç¹ûservice½ø³Ì±»killµô,±£ÁôserviceµÄ״̬Ϊ¿ªÊ¼×´Ì¬,µ«²»±£ÁôµÝË͵Äintent¶ÔÏó¡£Ëæºóϵͳ»á³¢ÊÔÖØд´½¨service,ÓÉÓÚ·þÎñ״̬Ϊ¿ªÊ¼×´Ì¬,ËùÒÔ´´½¨·þÎñºóÒ»¶¨»áµ÷ÓÃonStartCommand(Intent,int,int)·½·¨¡£Èç¹ûÔÚ´ËÆÚ¼äûÓÐÈκÎÆô¶¯ÃüÁî±»´«µÝµ½service,ÄÇô²ÎÊýIntent½«Îªnull¡£
START_NOT_STICKY:¡°·ÇÕ³ÐԵġ±¡£Ê¹ÓÃÕâ¸ö·µ»Øֵʱ,Èç¹ûÔÚÖ´ÐÐÍêonStartCommandºó,·þÎñ±»Òì³£killµô,ϵͳ½«»á°ÑËüÖÃΪstarted״̬,ϵͳ²»»á×Ô¶¯ÖØÆô¸Ã·þÎñ,Ö±µ½startService(Intent intent)·½·¨Ôٴα»µ÷ÓÃ;¡£
START_REDELIVER_INTENT:ÖØ´«Intent¡£Ê¹ÓÃÕâ¸ö·µ»Øֵʱ,Èç¹ûÔÚÖ´ÐÐÍêonStartCommandºó,·þÎñ±»Òì³£killµô,ϵͳ»á×Ô¶¯ÖØÆô¸Ã·þÎñ,²¢½«IntentµÄÖµ´«Èë¡£
START_STICKY_COMPATIBILITY:
START_STICKYµÄ¼æÈÝ°æ±¾,µ«²»±£Ö¤·þÎñ±»killºóÒ»¶¨ÄÜÖØÆô¡£
ÓÐÁË Service ÀàÎÒÃÇÈçºÎÆô¶¯ËûÄØ,ÓÐÁ½ÖÖ·½·¨:
Context.startService() Context.bindService()
1. ÔÚͬһ¸öÓ¦ÓÃÈκεط½µ÷Óà startService() ·½·¨¾ÍÄÜÆô¶¯ Service ÁË,È»ºóϵͳ»á»Øµ÷ Service ÀàµÄ onCreate() ÒÔ¼° onStart() ·½·¨¡£ÕâÑùÆô¶¯µÄ Service »áÒ»Ö±ÔËÐÐÔÚºǫ́,Ö±µ½ Context.stopService() »òÕß selfStop() ·½·¨±»µ÷Óá£ÁíÍâÈç¹ûÒ»¸ö Service ÒѾ±»Æô¶¯,ÆäËû´úÂëÔÙÊÔͼµ÷Óà startService() ·½·¨,ÊDz»»áÖ´ÐÐ onCreate() µÄ,µ«»áÖØÐÂÖ´ÐÐÒ»´Î onStart() ¡£
2. ÁíÍâÒ»ÖÖ bindService() ·½·¨µÄÒâ˼ÊÇ,°ÑÕâ¸ö Service ºÍµ÷Óà Service µÄ¿Í»§Àà°óÆðÀ´,Èç¹ûµ÷ÓÃÕâ¸ö¿Í»§Àà±»Ïú»Ù,Service Ò²»á±»Ïú»Ù¡£ÓÃÕâ¸ö·½·¨µÄÒ»¸öºÃ´¦ÊÇ,bindService() ·½·¨Ö´Ðкó Service »á»Øµ÷ÉϱßÌáµ½µÄ onBind() ·½·¢,Äã¿ÉÒÔ´ÓÕâÀï·µ»ØÒ»¸öʵÏÖÁË IBind ½Ó¿ÚµÄÀà,ÔÚ¿Í»§¶Ë²Ù×÷Õâ¸öÀà¾ÍÄܺÍÕâ¸ö·þÎñͨÐÅÁË,±ÈÈçµÃµ½ Service ÔËÐеÄ״̬»òÆäËû²Ù×÷¡£Èç¹û Service »¹Ã»ÓÐÔËÐÐ,ʹÓÃÕâ¸ö·½·¨Æô¶¯ Service ¾Í»á onCreate() ·½·¨¶ø²»»áµ÷Óà onStart()¡£ Çø±ð¸Å¿öΪ:
startService() µÄµ÷ÓÃÕßÓë·þÎñûÓÐÁªÏµ,¼´Ê¹µ÷ÓÃÕßÍ˳öÁË,·þÎñÈÔÈ»ÔËÐÐ,¶øbindService() µÄµ÷ÓÃÕßÓë·þÎñ°óÔÚÒ»Æð,µ÷ÓÃÕßÒ»µ©Í˳öÁË,·þÎñÒ²Ëæ¼´ÖÕÖ¹µô¡£
ÕâÀïÓÃÒ»¸öʵÀý(ʹÓÃ
startService()·½·¨À´Æô¶¯)À´½²½âÒ»ÏÂserviceµÄÉùÃ÷ÖÜÆÚºÍʹÓ÷½·¨:
Ê×Ïȱàдһ¸öÀà¼Ì³ÐServiceÕâ¸ö»ùÀà,ÖØдÀïÃæµÄ·½·¨,È»ºóÔÚActivityÖе÷ÓÃ
startService()ºÍstopService()À´Æô¶¯ºÍÍ£Ö¹·þÎñ¡£
ÔËÐнçÃæ:

¹¤³ÌĿ¼½á¹¹:

ExampleService.Java
package com.service.activity;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class ExampleService extends Service{
private static final String TAG = "ExampleService";
@Override
public void onCreate() {
Log.i(TAG, "ExampleService-onCreate");
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
Log.i(TAG, "ExampleService-onStart");
super.onStart(intent, startId);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//Ö´ÐÐÎļþµÄÏÂÔØ»òÕß²¥·ÅµÈ²Ù×÷
Log.i(TAG, "ExampleService-onStartCommand");
/*
* ÕâÀï·µ»Ø״̬ÓÐÈý¸öÖµ,·Ö±ðÊÇ:
* 1¡¢START_STICKY:µ±·þÎñ½ø³ÌÔÚÔËÐÐʱ±»É±ËÀ,ϵͳ½«»á°ÑËüÖÃΪstarted״̬,µ«ÊDz»±£´æÆä´«µÝµÄIntent¶ÔÏó,Ö®ºó,ϵͳ»á³¢ÊÔÖØд´½¨·þÎñ;
* 2¡¢START_NOT_STICKY:µ±·þÎñ½ø³ÌÔÚÔËÐÐʱ±»É±ËÀ,²¢ÇÒûÓÐеÄIntent¶ÔÏ󴫵ݹýÀ´µÄ»°,ϵͳ½«»á°ÑËüÖÃΪstarted״̬,
* µ«ÊÇϵͳ²»»áÖØд´½¨·þÎñ,Ö±µ½startService(Intent intent)·½·¨Ôٴα»µ÷ÓÃ;
* 3¡¢START_REDELIVER_INTENT:µ±·þÎñ½ø³ÌÔÚÔËÐÐʱ±»É±ËÀ,Ëü½«»áÔÚ¸ôÒ»¶Îʱ¼äºó×Ô¶¯´´½¨,²¢ÇÒ×îºóÒ»¸ö´«µÝµÄIntent¶ÔÏ󽫻áÔٴδ«µÝ¹ýÀ´¡£
*/
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "ExampleService-onBind");
return null;
}
@Override
public void onDestroy() {
Log.i(TAG, "ExampleService-onDestroy");
super.onDestroy();
}
}
MainActivity.java
package com.service.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener{
private static final String TAG = "MainActivity"; //ÈÕÖ¾Êä³ö±êÖ¾
private Button btnStartService;
private Button btnStopService;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnStartService = (Button)findViewById(R.id.btnStartService);
btnStopService = (Button)findViewById(R.id.btnStopService);
btnStartService.setOnClickListener(this);
btnStopService.setOnClickListener(this);
}
//µã»÷ʼþ´¦Àí¼àÌýÆ÷
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,ExampleService.class);
switch(v.getId()){
case R.id.btnStartService:
startService(intent);
break;
case R.id.btnStopService:
stopService(intent);
break;
default:
break;
}
}
}
×îºóÔÚAndroidManifest.xmlÖжÔservice½øÐÐÉùÃ÷,Ëü¸úActivityͬһ¼¶,¶¼Ð´ÔÚApplication±êÇ©ÀïÃæ:
<service android:name=".ExampleService"/>
´´½¨ÍêÔËÐÐ
ÔÚÔËÐеã»÷"Æô¶¯service"Ö®ºó(µÚÒ»´ÎÆô¶¯service),ÎÒÃÇ¿ÉÒԲ鿴LogCat¿ØÖÆ̨Êä³öµÄÈÕÖ¾ÈçÏÂ:

Õâ¸öʱºòÎÒÃǵã»÷"·µ»Ø",Activity±»¸ÉµôÁË,µ«ÊÇÎÒÃǵķþÎñÈÔÈ»ÔÚÔËÐÐ,¿ÉÒԲ鿴Setting-->Application-->Running Service,½ØͼÈçÏÂ:

È»ºó»Øµ½ÎÒÃǵÄActivity,Ôٴεã»÷Æô¶¯Service,¿ØÖÆ̨Êä³öÈÕÖ¾ÈçÏÂ:

onCreate()·½·¨Ã»Óб»µ÷ÓÃ,˵Ã÷Ëü²¢Ã»ÓÐÖØб»´´½¨¡£
È»ºóÎÒÃǵã»÷Í£Ö¹Service,Êä³öÈÕÖ¾ÈçÏÂ:

|