Android Service詳解及示例代碼
Android Service 詳細(xì)介紹:
1、Service的概念
2、Service的生命周期
3、實(shí)例:控制音樂(lè)播放的Service
一、Service的概念
Service是Android程序中四大基礎(chǔ)組件之一,它和Activity一樣都是Context的子類(lèi),只不過(guò)它沒(méi)有UI界面,是在后臺(tái)運(yùn)行的組件。
二、Service的生命周期
Service對(duì)象不能自己?jiǎn)?dòng),需要通過(guò)某個(gè)Activity、Service或者其他Context對(duì)象來(lái)啟動(dòng)。啟動(dòng)的方法有兩種,Context.startService和Context.bindService()。兩種方式的生命周期是不同的,具體如下所示。
Context.startService方式的生命周期:
啟動(dòng)時(shí),startService –> onCreate() –> onStart()
停止時(shí),stopService –> onDestroy()
Context.bindService方式的生命周期:
綁定時(shí),bindService -> onCreate() –> onBind()
解綁定時(shí),unbindService –>onUnbind() –> onDestory()
三、實(shí)例:控制音樂(lè)播放的Service
下面我們用一個(gè)可以控制在后臺(tái)播放音樂(lè)的例子來(lái)演示剛才所學(xué)知識(shí),同學(xué)們可以通過(guò)該例子可以明顯看到通過(guò)綁定方式運(yùn)行的Service在綁定對(duì)象被銷(xiāo)毀后也被銷(xiāo)毀了。
下面把代碼分享如下:
1、建立一個(gè)新項(xiàng)目名字叫 Lesson14_HelloService,Activity起名叫MainHelloService.java
2、res/layout/main.xml中代碼寫(xiě)成
< ?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <textview android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="音樂(lè)播放服務(wù)" android:textsize="25sp" android:layout_margintop="10dp"> <button android:text="開(kāi)啟音樂(lè)播放服務(wù)" android:textsize="20sp" android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="10dp"> </button> <button android:text="停止音樂(lè)播放服務(wù)" android:textsize="20sp" android:id="@+id/Button02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="10dp"> </button> <button android:text="綁定音樂(lè)播放服務(wù)" android:textsize="20sp" android:id="@+id/Button03" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="10dp"> </button> <button android:text="解綁定音樂(lè)播放服務(wù)" android:textsize="20sp" android:id="@+id/Button04" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="10dp"> </button> </textview></linearlayout>
3、在res目錄中建立一個(gè)raw目錄,并把一個(gè)音樂(lè)文件babayetu.mp3拷貝進(jìn)來(lái)3、在Activity的同目錄新建一個(gè)service文件
MusicService.java
package android.basic.lesson14; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.os.IBinder; import android.util.Log; import android.widget.Toast; public class MusicService extends Service { //為日志工具設(shè)置標(biāo)簽 String tag ="MusicService"; //定義音樂(lè)播放器變量 MediaPlayer mPlayer; //其他對(duì)象通過(guò)bindService方法通知該Service時(shí)該方法會(huì)被調(diào)用 @Override public IBinder onBind(Intent intent) { Toast.makeText(this,"MusicService onBind()",Toast.LENGTH_SHORT).show(); Log.i(tag, "MusicService onBind()"); mPlayer.start(); return null; } //其他對(duì)象通過(guò)unbindService方法通知該Service時(shí)該方法會(huì)被調(diào)用 @Override public boolean onUnbind(Intent intent){ Toast.makeText(this, "MusicService onUnbind()", Toast.LENGTH_SHORT).show(); Log.i(tag, "MusicService onUnbind()"); mPlayer.stop(); return false; } //該服務(wù)不存在需要被創(chuàng)建時(shí)被調(diào)用,不管startService()還是bindService()都會(huì)在啟動(dòng)時(shí)調(diào)用該方法 @Override public void onCreate(){ Toast.makeText(this, "MusicService onCreate()", Toast.LENGTH_SHORT).show(); //創(chuàng)建一個(gè)音樂(lè)播放器對(duì)象 mPlayer=MediaPlayer.create(getApplicationContext(), R.raw.babayetu); //設(shè)置可以重復(fù)播放 mPlayer.setLooping(true); Log.i(tag, "MusicService onCreate()"); } //用startService方法調(diào)用該服務(wù)時(shí),在onCreate()方法調(diào)用之后,會(huì)調(diào)用改方法 @Override public void onStart(Intent intent,int startid){ Toast.makeText(this,"MusicService onStart",Toast.LENGTH_SHORT).show(); Log.i(tag, "MusicService onStart()"); mPlayer.start(); } //該服務(wù)被銷(xiāo)毀時(shí)調(diào)用該方法 @Override public void onDestroy(){ Toast.makeText(this, "MusicService onDestroy()", Toast.LENGTH_SHORT).show(); mPlayer.stop(); Log.i(tag, "MusicService onDestroy()"); } }
4、MainHelloService.java中的代碼:
package android.basic.lesson14; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MainHelloService extends Activity { //為日志工具設(shè)置標(biāo)簽 String tag = "MusicService"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //輸出Toast消息和日志記錄 Toast.makeText(MainHelloService.this, "MainHelloService onCreate", Toast.LENGTH_SHORT).show(); Log.i(tag, "MainHelloService onCreate"); //定義組件對(duì)象 Button b1= (Button)findViewById(R.id.Button01); Button b2= (Button)findViewById(R.id.Button02); Button b3= (Button)findViewById(R.id.Button03); Button b4= (Button)findViewById(R.id.Button04); //定義服務(wù)鏈接對(duì)象 final ServiceConnection conn = new ServiceConnection(){ @Override public void onServiceConnected(ComponentName name, IBinder service) { Toast.makeText(MainHelloService.this, "ServiceConnection onServiceConnected", Toast.LENGTH_SHORT).show(); Log.i(tag, "ServiceConnection onServiceConnected"); } @Override public void onServiceDisconnected(ComponentName name) { Toast.makeText(MainHelloService.this, "ServiceConnection onServiceDisconnected", Toast.LENGTH_SHORT).show(); Log.i(tag, "ServiceConnection onServiceDisconnected"); }}; //定義點(diǎn)擊監(jiān)聽(tīng)器 OnClickListener ocl= new OnClickListener(){ @Override public void onClick(View v) { //顯示指定intent所指的對(duì)象是個(gè)Service Intent intent = new Intent(MainHelloService.this,android.basic.lesson14.MusicService.class); switch(v.getId()){ case R.id.Button01: //開(kāi)始服務(wù) startService(intent); break; case R.id.Button02: //停止服務(wù) stopService(intent); break; case R.id.Button03: //綁定服務(wù) bindService(intent,conn,Context.BIND_AUTO_CREATE); break; case R.id.Button04: //解除綁定 unbindService(conn); break; } } }; //綁定點(diǎn)擊監(jiān)聽(tīng)器 b1.setOnClickListener(ocl); b2.setOnClickListener(ocl); b3.setOnClickListener(ocl); b4.setOnClickListener(ocl); } @Override public void onDestroy(){ super.onDestroy(); Toast.makeText(MainHelloService.this, "MainHelloService onDestroy", Toast.LENGTH_SHORT).show(); Log.i(tag, "MainHelloService onDestroy"); } }
以上就是對(duì)Android Service的介紹,后續(xù)繼續(xù)補(bǔ)充相關(guān)資料,謝謝大家對(duì)本站的支持!
- 淺談Android Activity與Service的交互方式
- Android Service中方法使用詳細(xì)介紹
- Android基于Service的音樂(lè)播放器
- Android實(shí)現(xiàn)開(kāi)機(jī)自動(dòng)啟動(dòng)Service或app的方法
- Android提高Service優(yōu)先級(jí)的方法分析
- Android使用Messenger實(shí)現(xiàn)service與activity交互
- Android輔助功能AccessibilityService與搶紅包輔助
- Android getSystemService用法實(shí)例總結(jié)
- Android中bindService基本使用方法概述
- Android Service 服務(wù)不被殺死的妙招
- Android 兩個(gè)Service的相互監(jiān)視實(shí)現(xiàn)代碼
相關(guān)文章
使用adb?or?fastboot命令進(jìn)入高通的9008(edl)模式的兩種方法
這篇文章主要介紹了使用adb?or?fastboot命令進(jìn)入高通的9008(edl)模式,兩種方式通過(guò)命令給大家寫(xiě)的非常詳細(xì),文中又給大家補(bǔ)充介紹了高通手機(jī)?進(jìn)入?高通9008模式的兩種方法,需要的朋友可以參考下2023-01-01Android開(kāi)發(fā)之獲取SD卡及手機(jī)ROM容量的方法
這篇文章主要介紹了Android開(kāi)發(fā)之獲取SD卡及手機(jī)ROM容量的方法,結(jié)合實(shí)例形式分析了Android針對(duì)SD卡的讀取及屬性操作相關(guān)技巧,需要的朋友可以參考下2016-04-04Android TextView和ImageView簡(jiǎn)單說(shuō)明
Android TextView和ImageView簡(jiǎn)單說(shuō)明,需要的朋友可以參考一下2013-03-03Android Studio打包APK文件具體實(shí)現(xiàn)步驟解析
這篇文章主要介紹了Android Studio打包APK文件具體實(shí)現(xiàn)步驟解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11

flutter日期選擇器 flutter時(shí)間選擇器

Android中EditText屏蔽第三方輸入法表情的方法示例

Android編程之內(nèi)存溢出解決方案(OOM)實(shí)例總結(jié)