Android四大組件之服務-Service 原理和應用開發詳解

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();
            }
        });
        
    }
}

  真題園網http://www.zhentiyuan.com

相關文章
相關標籤/搜索