Android中的服務小知識

趁着今天有空,來回顧一下Android中Service的相關知識。如有不足,敬請指正。 任何一個Android程序員都知道Service。Service作爲Android的四大組件之一,在每一個應用當中都扮演着很重要的角色。它主要是在後臺用來處理一些耗時的操作,以及一些需要長期運行的任務。必要的時候,我們在應用退出之後,還需要我們的Service繼續執行相關的任務。 那麼,Service既然如此重要,但並不是每一個程序員都能夠很好地掌握它,然後利用好它(我也是)。不過今天,我將重新將Service的知識重新過濾一遍,加深自己的技術水平,也做個記錄。 首先,Service最基本的用法大概就是啓動一個Service了。啓動Service的基本方法跟啓動Activity的基本方法都是相似的,都需要使用到intent方法。下面,我寫了一個基本的啓動Service的方法,簡單演示一下Service的啓動。 這裏,我新建了一個MyService類,繼承自Service。然後重寫了它的onCreate、onDestroy、onStartCommand、onBind方法,然後除了onBind方法之外,在每一個方法中都打印了一句話。 public class MyService extends Service { public static String mess = "Service"; @Override public void onCreate() { Log.d(mess, "onCreate: executed"); super.onCreate(); } @Override public void onDestroy() { Log.d(mess, "onDestroy: executed"); super.onDestroy(); } //start指令(command) @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(mess, "onStartCommand: executed"); return super.onStartCommand(intent, flags, startId); } @Nullable @Override public IBinder onBind(Intent intent) { return null; }}類如上所示。然後,在基本佈局當中寫了兩個開啓和關閉Service的button:<Button android:text="開啓服務" android:id="@+id/start" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:text="關閉服務" android:id="@+id/stop" android:layout_width="match_parent" android:layout_height="wrap_content" />再然後,在MainActivity中進行邏輯的實現:public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button button1; private Button button2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button1 = (Button) findViewById(R.id.start); button2 = (Button) findViewById(R.id.stop); button1.setOnClickListener(this); button2.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.start: Intent intent = new Intent(this,MyService.class); startService(intent); break; case R.id.stop: Intent intent1 = new Intent(this,MyService.class); stopService(intent1); break; } } 最後,在AndroidManifest.xml中進行Service的註冊。 <service android:name=".MyService"></service> 然後發佈就行了。可以看見,我們在兩個按鈕當中分別加入了開啓和關閉服務的邏輯代碼。這樣,一個簡單的Service示例代碼就寫好了。 我們可以看見,點擊執行之後onCreate執行了,onStartCommand也執行了。但是不管你繼續再點擊開啓服務,它還是隻會提示onStartCommand執行了。這是爲什麼呢?因爲onCreate方法只會在Service的第一次被創建的時候執行,如果當前的Service已經被創建,那麼不管你怎麼啓動,那它的onCreate方法都是不會執行的。 下面,我們來看一下Service和Activity之間如何關聯運用: 正如我前面提到的,除了onbind函數之外我都寫了一個打印語句,那麼這個時候,它的作用就體現出來了。對了,它就是和Activity鏈接的關鍵。然我們來重寫MyService 的方法: //創建一個binder類,用於服務的綁定 class MyBinder extends Binder{ public void LogMyMethod(){ //這個方法只是用來測試 Log.d(mess, "LogMyMethod: executed "); } } 這個類當中我就寫了一個測試打印的方法,只是爲了演示。然後創建出相應的對象,再在onbind函數的返回中,返回這個對象。 再然後,我們需要在MainAcvity當中增加一些代碼,來實現與Service的綁定。 private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mbinder = (MyService.MyBinder) service; mbinder.LogMyMethod(); } @Override public void onServiceDisconnected(ComponentName name) { Log.d("mbinddddd", "onServiceDisconnected: executed"); } }; 增加一個ServiceConnection對象,這個是用來爲Activity和Service創建鏈接的鏈接對象。我們重寫它裏面的onServiceConnected方法,在其中將我們的MyBinder向下轉型爲(MyService.MyBinder) service;這樣之後,我們就能使用這個對象調用我們binder中的定義的具體實現的代碼。然後,在我們新增的button中編寫對應的綁定服務和解綁的對應邏輯代碼。 case R.id.bind: Intent bindintent = new Intent(this,MyService.class); //綁定服務之後自動創建服務對象 bindService(bindintent,connection,BIND_AUTO_CREATE); break; case R.id.unbind: unbindService(connection); break; 綁定服務跟開啓服務類似,只不過是調用的方法有所差別。我們注意到,bindService函數的第三個參數是BIND_AUTO_CREATE,單從字面意思我們就能夠猜到,綁定之後自動創建對象的服務對象。所以,我們可以不通過開啓服務就能直接通過綁定服務來創建對應的Service對象。當我們點擊按鈕之後,Activity就能指定Service去調用事先在Sercice當中定義的LogMyMethod方法,從而實現了Activity和Service 的關聯。另外我們知道,Service是一直存在與整個應用當中的,所以不止這一個Activity能夠獲取到這個Binder對象,其他Activity也能獲取到。 那麼,什麼時候我們能夠銷燬這個Service呢?你或許會說直接點解關閉服務不就行了啊,如果這樣,那你就需要自己去編寫簡單的代碼實現看一看了。如果你直接使用的綁定服務,那麼你直接點擊解綁服務就能夠實現Service的銷燬。但是如果你是點擊開啓服務之後,然後再去綁定服務,然後再去點擊解綁服務,這個時候打印是不會有ondestory的。你必須再去點擊關閉服務,才能將你的Service銷燬掉。這裏,可能大家都有一點疑問,我說一下自己的觀點:Service的Stop方法只能停止Service,並不能銷燬一個與Activity產生關聯的Service(如果沒有與任何一個關聯,那麼是可以直接銷燬的)。從這裏我們可以看出,一個Service的被銷燬的過程:如果這個Service並未與任何一個Activity產生關聯,那麼Stop方法是直接可以銷燬這個Service對象的。如果Service與Activity產生了關聯,那麼只有當解除了關聯之後,才能進行對象的銷燬。(你們可以自己去編碼嘗試一下)。

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