Activity綁定本地Service

服務客戶端(Activity):

  1. import android.app.Activity; 
  2. import android.content.ComponentName; 
  3. import android.content.Context; 
  4. import android.content.Intent; 
  5. import android.content.ServiceConnection; 
  6. import android.os.Bundle; 
  7. import android.os.IBinder; 
  8. import android.util.Log; 
  9. import android.view.Menu; 
  10. import android.view.View; 
  11. import android.view.View.OnClickListener; 
  12. import android.widget.Button; 
  13. import android.widget.Toast; 
  14.  
  15. public class MainActivity extends Activity { 
  16.  
  17.     private final String TAG = "ActivityBindLocalService"
  18.     private LocalService mLocalService; 
  19.     private boolean mIsBound; 
  20.     
  21.     @Override 
  22.     protected void onCreate(Bundle savedInstanceState) { 
  23.         super.onCreate(savedInstanceState); 
  24.         setContentView(R.layout.activity_main); 
  25.         
  26.         Button bindLocalService = (Button) findViewById(R.id.bind_local_service); 
  27.         bindLocalService.setOnClickListener(bindClickListener); 
  28.         Button unBindLocalService = (Button) findViewById(R.id.unBind_local_service); 
  29.         unBindLocalService.setOnClickListener(unBindOnClickListener); 
  30.         
  31.     } 
  32.     
  33.     private final OnClickListener bindClickListener = new OnClickListener() { 
  34.         
  35.         @Override 
  36.         public void onClick(View v) { 
  37.             doBindService(); 
  38.         } 
  39.     }; 
  40.     
  41.     private final OnClickListener unBindOnClickListener = new OnClickListener() { 
  42.         
  43.         @Override 
  44.         public void onClick(View v) { 
  45.             doUnBindService(); 
  46.         } 
  47.     }; 
  48.  
  49.     private void doBindService(){ 
  50.         //將此Activity和LocalService綁定,然後會執行ServiceConnection裏面的onServiceConnected 
  51.         Log.i(TAG, "MainActivity ----> bindService"); 
  52.         bindService(new Intent(MainActivity.this, LocalService.class), 
  53.                 mServiceConnection, Context.BIND_AUTO_CREATE); 
  54.         mIsBound = true
  55.     } 
  56.     
  57.     private void doUnBindService(){ 
  58.         if (mIsBound) { 
  59.             //將此Activity和LocalService解除綁定,會直接執行LocalService的onDestory方法,將此Service銷燬 
  60.             unbindService(mServiceConnection); 
  61.             mIsBound = false
  62.         } 
  63.     } 
  64.     
  65.     private final ServiceConnection mServiceConnection = new ServiceConnection() { 
  66.         
  67.         @Override 
  68.         public void onServiceDisconnected(ComponentName name) { 
  69.             mLocalService = null
  70.             Toast.makeText(MainActivity.this
  71.                     "Disconnected from local service, 只有在異常的情況纔會調用onServiceDisonnected方法"
  72.                     Toast.LENGTH_SHORT).show(); 
  73.         } 
  74.         
  75.         @Override 
  76.         public void onServiceConnected(ComponentName name, IBinder service) { 
  77.             //獲得LocalService實例,注意:此時僅僅是將Activity和LocalService綁定起來了,但並沒有啓動Service 
  78.             //如果要啓動LocalService, 
  79.             //只需要執行mLocalService.startService(new Intent(MainActivity.this, LocalService.class)); 
  80.             Log.i(TAG, "MainActivity ----> onServiceConnected"); 
  81.             mLocalService = ((LocalService.LocalBinder)service).getLocalService(); 
  82.             Toast.makeText(MainActivity.this"Connected to local service", Toast.LENGTH_SHORT).show(); 
  83.         } 
  84.     }; 
  85.  
  86.     /** 
  87.      * 此方法用於初始化菜單,其中menu參數就是即將要顯示的Menu實例。 
  88.      * 返回true則顯示該menu,false 則不顯示; 
  89.      * (只會在第一次初始化菜單時調用) 
  90.      */ 
  91.     @Override 
  92.     public boolean onCreateOptionsMenu(Menu menu) { 
  93.         // Inflate the menu; this adds items to the action bar if it is present. 
  94.         getMenuInflater().inflate(R.menu.main, menu); 
  95.         return true
  96.     } 
  97.  

本地服務類(Service):

  1. import android.app.Service; 
  2. import android.content.Intent; 
  3. import android.os.Binder; 
  4. import android.os.IBinder; 
  5. import android.util.Log; 
  6.  
  7. public class LocalService extends Service { 
  8.  
  9.     private final String TAG = "ActivityBindLocalService"
  10.     private final IBinder mBinder = new LocalBinder(); 
  11.     
  12.     /** 
  13.      * 返回LocalBinder對象 
  14.      */ 
  15.     @Override 
  16.     public IBinder onBind(Intent intent) { 
  17.         Log.i(TAG, "LocalService ----> LocalService onBind"); 
  18.         return mBinder; 
  19.     } 
  20.  
  21.     /** 
  22.      * 創建一個內部類用來返回LocalService實例 
  23.      * @author Simon Xu 
  24.      * 
  25.      * 2013-4-10下午2:34:33 
  26.      */ 
  27.     public class LocalBinder extends Binder{ 
  28.         LocalService getLocalService(){ 
  29.             Log.i(TAG, "localService ----> return LocalService"); 
  30.             return LocalService.this
  31.         } 
  32.     } 
  33.  
  34.     @Override 
  35.     public void onCreate() { 
  36.         Log.i(TAG, "LocalService----> LocalService onCreate"); 
  37.         super.onCreate(); 
  38.     } 
  39.     
  40.     @Override 
  41.     public int onStartCommand(Intent intent, int flags, int startId) { 
  42.         Log.i(TAG, "LocalService----> LocalService onStartCommand"); 
  43.         return START_STICKY; 
  44.     } 
  45.  
  46.     @Override 
  47.     public void onDestroy() { 
  48.         Log.i(TAG, "LocalService----> LocalService onDestroy"); 
  49.         super.onDestroy(); 
  50.     }    
  51.     
  52. }

 

(此圖來源於<<Android框架揭祕>>一書)

(此圖來源於<<Android框架揭祕>>一書)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章