您好,登錄后才能下訂單哦!
本篇內容介紹了“Android服務Service的用途是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
前言:
Android
的服務是開發Android
應用程序的重要組成部分。不同于活動Activity
,服務是在后臺運行,服務沒有接口,生命周期也與活動Activity
非常不同。通過使用服務我們可以實現一些后臺操作,比如想從遠程服務器加載一個網頁等。服務能幫助我們在Android
中實現多任務。
我們已經知道,安卓的活動可以啟動,停止,當系統資源太低時可以銷毀,服務被設計為實現具有更長執行時間的任務。安卓的服務可以從活動Activity
中啟動,也可以從一個廣播接收器和其他服務中啟動。
必須注意,使用服務并不需要自動創建新的線程,所以如果在服務中我們實現一個簡單的邏輯,這不需要很長的時間去處理,我們其實不需要將它運行在單獨的線程。但是如果我們要實現復雜的邏輯,用很長一段時間去處理,我們就必須采取創建一個新線程去執行,否則在主線程上運行服務,可能會導致ANR問題。
服務適合兩種用途:
實現多任務
激活 Inter-Process-Communication (IPC)
流程間通訊
第一種情況的典型的例子是: 需要從遠程服務器下載數據,在這種情況下,我們可以讓應用同時與用戶進行交互,并在后臺開始完成工作,而用戶可以繼續使用應用程序,當服務完成后發送一個消息給用戶。
在第二種情況下,我們可以通過服務“共享”一些常用的功能,使不同的應用程序可以重用這些功能。例如,假設我們有一個發送電子郵件的服務,我們希望在幾個應用程序共享此服務,這樣不必重寫相同的代碼。在這種情況下,我們可以使用IPC使服務公開,這個服務向“遠程”暴露接口,被其他應用程序調用。
下面是一個簡單的服務,繼承Service
。
public class TestService extends Service { @Override public IBinder onBind(Intent arg0) { return null; } }
服務是有生命周期的,可以實現其中一些回調方法:
public class TestService extends Service { @Override public void onCreate() { super.onCreate(); } @Override public void onDestroy() { super.onDestroy(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } @Override public IBinder onBind(Intent arg0) { return null; } }
只有服務被創建時,方法onCreate
才會被唯一的調用一次。如果該服務已在運行這個方法將不會被調用。我們也不是直接調用它,操作系統OS調用這個方法。
OnStartCommand
是最重要的方法,因為它被調用的時候,我們需要啟動服務。在這個方法中,我們需要向我們運行的服務傳遞意圖,這樣我們就可以與服務交換一些信息。在這個方法中實現的邏輯可以直接在這個方法中被執行,如果執行很花費時間,我們就需要創建一個線程。正如你可以看到這個方法要求我們返回一個整數作為結果。此整數表示服務如何由操作系統來處理。
START_STICKY :使用這個返回值,如果OS殺死我們的服務,它會重新創建它,但是發往該服務的意圖Intent
不會再被傳遞,這種方式下服務總是在運行。
START_NOT_STICKY: 如果OS殺死服務,就不會再創建,直到客戶端顯式激活onStart
命令
START_REDELIVER_INTENT: 它類似 START_STICKY
,意圖也會被再傳遞給該服務。
OnDestroy
是在服務銷毀時由操作系統調用。
服務需要在Manifest.xml 中配置:
<service android:name=".TestService" android:enabled="true"/>
正如我們所知道服務必須首先被啟動,并在完成它的任務后最終停止。我們可以從活動Activity
啟動它,我們可以使用Intent傳遞給服務一些信息。假設我們有兩個按鈕,一個開始和一個停止服務.
btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(MainActivity.this, TestService.class); i.putExtra("name", "SurvivingwithAndroid"); MainActivity.this.startService(i); } }); btnStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(MainActivity.this, TestService.class); MainActivity.this.stopService(i); } });
運行效果如下:
IntentService
正如我們前面提到的服務運行在主線程,所以我們在本服務執行一些邏輯要非常小心。必須考慮到,如果這個邏輯是一個阻塞操作,或者需要較長的時間來完成,會導致一個ANR問題發生。在這種情況下,將邏輯轉移到一個單獨的線程,這意味著我們必須在onStartCommand
方法創建線程并運行它。還有另一類稱為IntentService
的衍生服務,可以簡化這些操作。當我們不需要同時處理多個請求,這個類是有用的。這個類創建一個工作線程來處理不同的請求,
功能如下:
創建一個分離線程來處理請求
創建一個請求隊列然后傳遞一個Intent
消息
創建onStartCommand
的缺省實現
當所有請求被處理后停止服務
public class TestIntentService extends IntentService { public TestIntentService() { super("TestIntentService"); } @Override protected void onHandleIntent(Intent intent) { } }
onHandleIntent
里面我們實現了邏輯,而無需關心這作業需要半天或更長,因為這種方法在一個單獨的線程中運行。
如果我們想在智能手機開機時啟動它,我們先創建一個廣播接收器,監聽到這個事件,然后啟動該服務。
public class BootBroadcast extends BroadcastReceiver { @Override public void onReceive(Context ctx, Intent intent) { ctx.startService(new Intent(ctx, TestService.class)); } }
Manifest.xml中配置:
<receiver android:name=".BootBroadcast"> <intent-filter > <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>
“Android服務Service的用途是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。