1、Android 服務簡介html
Service是android 系統中的四大組件之一(Activity、Service、BroadcastReceiver、ContentProvider),它跟Activity的級別差很少,但不能本身運行只能後臺運行,而且能夠和其餘組件進行交互。service能夠在不少場合的應用中使用,好比播放多媒體的時候用戶啓動了其餘Activity這個時候程序要在後臺繼續播放,好比檢測SD卡上文件的變化,再或者在後臺記錄你地理信息位置的改變等等,總之服務老是藏在後臺的。java
Service的啓動有兩種方式:context.startService() 和 context.bindService()android
2、原理和流程app
1.建立前臺服務,只須要提供一個通知欄圖標而且調用startForeground便可。ide
2.想讓服務作本身的想作的事情,也比較簡單,只須要在onCreate或者onStartConmand的時候new一個Thread便可this
3.若是Activity等UI想要和服務通訊、調用服務提供的方法,怎麼辦呢?這時候就須要用到Binder了:只須要在onBind的時候返回一個IBinder對象,經過該對象能夠獲取當前Service的對象引用,這樣就能夠操做服務所提供的方法了,那如何在Service操做Acitivty呢?spa
有了Service引用,這個時候只須要在Service中給Activity開放設置回調接口便可。code
4.固然了,服務須要在Manifest.xml中進行配置聲明:xml
<service android:name="com.czm.servicetest.MyService" > </service>
3、實例:MyService.javahtm
package com.czm.servicetest; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.util.Log; /** * The Service Example * @author caizhiming * */ public class MyService extends Service{ IBinder mBinder = new MyBinder(); private int mCount = 0; public boolean mIsStop = false; // get the instance of MyService public class MyBinder extends Binder{ MyService getService(){ return MyService.this; } } public void setData(int data){ mCount = data; } public int getData(){ return mCount; } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); Thread thread = new Thread(null, new ServiceWorker(), "ServiceWorker"); thread.start(); } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub Log.v("czm","onBind()-service is started"); return mBinder; } @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub Log.v("czm","onStartCommand()-service is started"); return super.onStartCommand(intent, flags, startId); } //The Service work's thread class ServiceWorker implements Runnable{ @Override public void run() { // TODO Auto-generated method stub while(!mIsStop){ Log.v("czm","ServiceWorker: mCount="+mCount); mCount ++; if(mCount >= 10000){ mCount = 0; } if(mCount %5 == 0){ mListener.onCallback(); } try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } //The callback listener to operate UI such as Activity private OnUICallbackListener mListener; public void setListener(OnUICallbackListener listener){ mListener = listener; } public interface OnUICallbackListener{ void onCallback(); } }
4、如何使用服務-MyService?
package com.czm.servicetest; import com.czm.servicetest.MyService.MyBinder; import com.czm.servicetest.MyService.OnUICallbackListener; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity implements OnUICallbackListener{ private Button mBtnStart; private Button mBtnChange; private Button mBtnStop; private TextView mTvResult; private MyService mMyService; Intent serviceIntent; private Handler mHandler = new Handler(){ public void handleMessage(Message msg) { mTvResult.setText(String.valueOf(mMyService.getData())); mHandler.sendEmptyMessageDelayed(0, 1000); }; }; private ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub Log.v("czm","onServiceDisconnected()"); } @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub Log.v("czm","onServiceConnected()"); MyBinder binder = (MyBinder) service; mMyService = binder.getService(); mMyService.setListener(MainActivity.this); mHandler.sendEmptyMessageDelayed(0, 0); } }; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBtnStart = (Button)findViewById(R.id.btn_start); mBtnChange = (Button)findViewById(R.id.btn_change); mBtnStop = (Button)findViewById(R.id.btn_stop); mTvResult = (TextView)findViewById(R.id.tv_result); mBtnStart.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub //start service serviceIntent = new Intent(MainActivity.this,MyService.class); serviceIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //bind service in order to communicate with service MainActivity.this.bindService(serviceIntent, mServiceConnection, BIND_AUTO_CREATE); // startService(serviceIntent); } }); mBtnChange.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub mMyService.setData(1000); } }); mBtnStop.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub mMyService.mIsStop = true; MainActivity.this.unbindService(mServiceConnection); stopService(serviceIntent); } }); } /** * service callback * @param serviceConnection */ @Override public void onCallback() { // TODO Auto-generated method stub runOnUiThread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "service callback", Toast.LENGTH_SHORT).show(); } }); } }