android服務應用
A. 安卓應用里游戲服務是什麼
安卓應用里轎游毀游戲服務是指安卓應用里游戲所提供的服務,它可以讓用戶在游戲中獲得更好的體閉備驗,比如游戲更新、在線游戲、游磨顫戲聯機等等。
B. android服務是什麼軟體
Android服務Service是android系統中的一種組件,安卓不同版本圖片它跟Activity的級別差不多,但是他不能自己運行,只能後台運行,並且可以和爛源納其他組件進行交互!
服務( Service )是 Android 中實現程序後台運行的解決方案,它非常適合用於去執行那些不需要和用戶交互而且還要求長期運行的任務。服務的運行不依賴於任何用戶界面,即使當程序被切換到後台,或者用戶打開了另外一個應用程序,服務仍然能夠保持正常運行。
不過需要注意的是,服務並不是運行在一個獨立的進程當中的,而是依賴於創建服務時所在的應用程序進程。當某個裂悄應用程序進程被殺掉時,所有依賴於該進程的服務也會停止運行。
另外,也不要被服務的後台概念所迷惑,實際上服務並不會自動開啟線程,所有的代碼都是默認運行在主線程當中的。也就是飢沒說,我們需要在服務的內部手動創建子線程,並在這里執行具體的任務,否則就有可能出現主線程被阻塞住的情況!
況。
C. Android應用程序啟動流程總結
AMS主要功能:
AMS是Android中最核心的服務,主要負責系統中四大組件的啟動、切換、調度及應用進程的管理和調度等工作。還負責啟動或殺死應用程序的進程。
WMS主要功能:
為所有窗口分配Surface。
管理Surface的顯示順序、尺寸、位置。
管理窗口動畫。
輸入系統相關:WMS是派發系統按鍵和觸摸消息的最佳人選,當接收到一個觸摸事件,它需要尋找一個最合適的窗口來處理消息。
PWS主要功能:
PMS 用來管理跟蹤所有應用APK,包括安裝,卸載,解析,控制許可權等。
SystemServer也是一個進程,包括AMS、PMS、WMS等等。
zygote意為「受精卵「。Android是基於Linux系統的,而在Linux中,所有的進程都是由init進程直接或者是間接fork出來的,zygote進程也不例外。
App進程是用戶點擊桌面icon時,通過Launcher進程請求SystemServer,再調用Zygote孵化的。
①點擊啟動一個App,Launcher進程採用Binder IPC向ActivityManagerService發起startActivity請求;
②ActivityManagerService接收到請求後,向zygote進程發送創建進程的請求;
③Zygote進程fork出新的子進程,即App進程;
④App進程通過Binder IPC向sytem_server進程發起綁定Application請求;
⑤system_server進程在收到請求後,進行一系列准備工作後,再通過binder IPC向App進程發送scheleLaunchActivity請求;
⑥App進程的binder線程(ApplicationThread)在收到請求後,通過handler向主線程發送LAUNCH_ACTIVITY消息;
⑦主線程在收到Message後,通過發射機制創建目標Activity,並回調Activity.onCreate()等方法。
⑧到此,App便正式啟動,開始進入Activity生命周期,執行完onCreate/onStart/onResume方法,UI渲染結束後便可以看到App的主界面。
備註:
Launcher,PMS,Zygote,App進程是三個獨立的進程,相互通信就需要使用進程間通信機制。與Zygote通信是使用的socket通信,Launcher,PMS,App進程間使用的是Binder機制。
D. 好用的安卓應用市場推薦幾個
1、應用寶:是騰訊應用中心專為智能手機用戶打造的一個手機應用獲取平台,可在應用搜索方面推出「唯一」搜索,可有效幫助用戶解決下應用下載中誤下載山寨應用的問題,安全、放心的下載應用;
2、豌豆莢:是一款在PC上使用的Android手機管理軟體,把手機和電腦連接上後,即可以將各類應用程序、音樂、視頻、電子書等內容傳輸或者從網路直接下載到手機上,也可以用它實現備份、聯系人管理、簡訊群發、截屏等功能;
3、安卓市場:是中國國內的安卓軟體和游戲下載平台,為用戶提供良好的手機軟體服務;
4、應用匯:是國內一家承諾對用戶進行第三方賠付的Android應用商店;
5、安智市場:是目前中國最知名的Android系統手機應用軟體免費下載平台。
E. android 五大應用開發框架是什麼
android應用開發框架是 Application Framework,其系統架構由5部分組成,分別是:Linux Kernel、Android Runtime、Libraries、Application Framework、Applications。
1、Linux Kernel (Linux內核)
Android基於Linux 2.6提供核心系統服務,例如:安全、內存管理、進程管理、網路 堆棧、驅動模型。Linux Kernel也作為硬體和軟體之間的抽象層,它隱藏具體硬體細節而為上層提供統一的服務。
2、Android Runtime (運行庫)
Android包含一個核心庫的集合,提供大部分在java編程語言核心類庫中可用的功能。每一個Android應用程序是Dalvik虛擬機中的實例,運行在他們自己的進程中。
Dalvik虛擬機設計成,在一個設備可以高效地運行多個虛擬機。Dalvik虛擬機可執行文件格式是.dex,dex格式是專為Dalvik設計的一種壓縮格式,適合內存和處理器速度有限的系統。 大多數虛擬機包括JVM都是基於棧的,而Dalvik虛擬機則是基於寄存器的。
3、Libraries (程序庫)
Android包含一個C/C++庫的集合,供Android系統的各個組件使用。這些功能通過Android的應用程序框架(application framework)暴露給開發者。
4、Application Framework (應用框架層)
通過提供開放的開發平台,Android使開發者能夠編制極其豐富和新穎的應用程序。開發者可以自由地利用設備硬體優勢、訪問位置信息、運行後台服務、設置鬧鍾、向狀態欄添加通知等等,很多很多。 開發者可以完全使用核心應用程序所使用的框架APIs。
應用程序的體系結構旨在簡化組件的重用,任何應用程序都能發布他的功能且任何其他應用程序可以使用這些功能(需要服從框架執行的安全限制)。這一機制允許用戶替換組件。
5、Applications(應用層)
Android裝配一個核心應用程序集合,包括電子郵件客戶端、SMS程序、日歷、地圖、瀏覽器、聯系人和其他設置。所有應用程序都是用Java編程語言寫的。Android本身是一套軟體堆迭(Software Stack),或稱為「軟體迭層架構」,迭層主要分成三層:操作系統、中間件、應用程序。
(5)android服務應用擴展閱讀
開發人員也可以完全訪問核心應用程序所使用的API框架。該應用程序的架構設計簡化了組件的重用;任何一個應用程序都可以發布它的功能塊並且任何其它的應用程序都可以使用其所發布的功能塊(不過得遵循框架的安全性限制)。同樣,該應用程序重用機制也使用戶可以方便的替換程序組件。
隱藏在每個應用後面的是一系列的服務和系統,其中包括;
豐富而又可擴展的視圖(Views),可以用來構建應用程序,它包括列表(lists),網格(grids),文本框(textBoxes),按鈕(buttons),甚至可嵌入的web瀏覽器。
內容提供器(ContentProviders)使得應用程序可以訪問另一個應用程序的數據(如聯系人資料庫),或者共享它們自己的數據
資源管理器(ResourceManager)提供非代碼資源的訪問,如本地字元串,圖形,和布局文件(layoutfiles)。
通知管理器(NotificationManager)使得應用程序可以在狀態欄中顯示自定義的提示信息。
活動管理器(ActivityManager)用來管理應用程序生命周期並提供常用的導航回退功能。
F. 如何給Android應用創建本地服務
本文通過代碼向大家詳細介紹和演示這兩種的服務的創建過程,代碼適用於Android2.3.3以後的版本。
1. 定義清單文件(AndroidManifest.xml)
4. 創建服務啟動界面(LocalServiceActivities.java)
package my.android.test;
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.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
/**
* 該類中包含兩種類型服務的客戶端:
* 啟動類型服務客戶端:Controller
* 綁定類型服務客戶端:Binding
*/
publicclass LocalServiceActivities {
/**
* Controller類是啟動類型服務的客戶端,它包含兩個按鈕:
* start:點擊該按鈕時,啟動服務。
* stop: 點擊該按鈕時,終止服務。
*/
publicstaticclass Controller extends Activity{
/**
* Activity被首次啟動時,調用該方法。
*/
@Override
protectedvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//填充布局
setContentView(R.layout.local_service_controller);
//查找布局中的啟動服務按鈕,並設置點擊事件監聽器。
Button button = (Button)findViewById(R.id.start);
button.setOnClickListener(mStartListener);
//查找布局中的終止服務按鈕,並設置點擊事件監聽器。
button = (Button)findViewById(R.id.stop);
button.setOnClickListener(mStopListener);
}
/**
* start按鈕的點擊事件監聽器實現。
*/
private OnClickListener mStartListener = new OnClickListener(){
publicvoid onClick(View v){
//啟動LocalService服務。
startService(new Intent(Controller.this, LocalService.class));
}
};
/**
* stop按鈕的點擊事件監聽器實現。
*/
private OnClickListener mStopListener = new OnClickListener(){
publicvoid onClick(View v){
//終止LocalService服務。
stopService(new Intent(Controller.this, LocalService.class));
}
};
}
/***************************************************************
*以下是綁定型服務客戶端的實現
***************************************************************/
/**
* Binding類是綁定類型服務的客戶端,它包含兩個按鈕:
* bind:點擊該按鈕時,調用bindService()方法綁定並啟動服務;
* unbind:點擊該按鈕時,調用unbindService()方法解除綁定並終止服務。
*/
publicstaticclass Binding extends Activity{
//用於保存服務的綁定狀態,true:綁定,false:未綁定
privatebooleanmIsBound;
//用於保存被綁定的本地服務實例。
private LocalService mBoundService;
/**
* 實現監視被綁定服務狀態的介面:ServiceConnection
* 綁定類型服務都要實現這個介面,以便監視服務的狀態,這個介面中的方法會在
* 應用的主線程中被調用。
*/
private ServiceConnection mConnection = new ServiceConnection(){
/**
* 當連接的服務被創建時,Android系統會調用這個方法,用IBinder對象跟服務建立通信通道。
* @param className:被連接的具體的服務組件的名稱
* @param service:服務的通信通道IBinder對象。
*/
publicvoid onServiceConnected(ComponentName className, IBinder service){
//從IBinder對象中獲取服務實例。
mBoundService = ((LocalService.LocalBinder)service).getService();
//顯示Activity已經與服務建立了連接的提示消息。
Toast.makeText(Binding.this, R.string.local_service_connected, Toast.LENGTH_SHORT).show();
}
/**
* 當服務被終止時,Android系統會調用這個方法。
*/
publicvoid onServiceDisconnected(ComponentName className){
//清除客戶端服務實例
mBoundService = null;
//顯示服務被終止的提示消息。
Toast.makeText(Binding.this, R.string.local_service_disconnected, Toast.LENGTH_SHORT).show();
}
};
/**
* 綁定並啟動服務,bind按鈕點擊時會調用這個方法。
*/
void doBindService(){
//綁定並啟動服務。
bindService(new Intent(Binding.this, LocalService.class), mConnection, Context.BIND_AUTO_CREATE);
mIsBound = true;
}
/**
* 解除與服務的綁定,unbind按鈕被點擊時會調用這個方法
*/
void doUnbindService(){
//如果服務被綁定,則解除與服務綁定。
if(mIsBound){
unbindService(mConnection);
mIsBound = false;
}
}
/**
* 當Activity被銷毀時,調用解除綁定服務的方法,解除被綁定的服務。
*/
@Override
protectedvoid onDestroy(){
super.onDestroy();
//解除被綁定的服務。
doUnbindService();
}
/**
* bind按鈕的點擊事件監聽器介面實現。
*/
private OnClickListener mBindListener = new OnClickListener(){
publicvoid onClick(View v){
//綁定並啟動服務。
doBindService();
}
};
/**
* unbind按鈕的點擊事件監聽器介面實現。
*/
private OnClickListener mUnbindListener = new OnClickListener(){
publicvoid onClick(View v){
//解除被綁定的服務。
doUnbindService();
}
};
/**
* Activity被首次啟動時,會調用這個方法。
*/
@Override
protectedvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//填充Activity
setContentView(R.layout.local_service_binding);
//查找布局中的bind按鈕,並設置點擊事件的監聽器
Button button = (Button)findViewById(R.id.bind);
button.setOnClickListener(mBindListener);
//查找布局中的unbind按鈕,並設置點擊事件的監聽器
button = (Button)findViewById(R.id.unbind);
button.setOnClickListener(mUnbindListener);
}
}
}
5. 創建服務(LocalService.java)
package my.android.test;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.Process;
import android.util.Log;
import android.widget.Toast;
/**
* LocalService基礎Android的Service類,實現應用的本地服務組件。
* 該服務使用HandlerThread類創建了服務自己的線程和消息循環,
* 因此,不會因為服務中的長時處理,而阻塞界面的刷新,影響用戶體驗。
*/
publicclass LocalService extends Service {
//用於保存本服務自己的消息循環對象Looper
private Looper mServiceLooper;
//用於保存內部類ServiceHandler的對象實例,它繼承了Android的Handler類,
//用於處理發送給服務的消息。
private ServiceHandler mServiceHandler;
/**
* 這個類用於給客戶端提供綁定對象,因為本示例的服務與客戶端運行在同一個
* 主進程中,所以不需要處理進程間通信(IPC)
*/
publicclass LocalBinder extends Binder{
LocalService getService(){
//返回本服務的實例。
return LocalService.this;
}
}
/**
* 服務被首次創建時,系統調用這個方法。
* Android服務組件必須覆寫這個方法
*/
@Override
publicvoid onCreate(){
//創建線程對象,並啟動線程。
HandlerThread thread = new HandlerThread("ServiceStartArguments", Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
//獲取線程的消息循環對象
mServiceLooper = thread.getLooper();
//用線程的消息循環對象創建消息處理對象。
mServiceHandler = new ServiceHandler(mServiceLooper);
}
/**
* 啟動類型服務必須實現這個方法,客戶端每次調用startService()方法時,
* 系統都會調用這個方法。
* @param intent:它是傳遞給startService()方法的Intent對象。
* @param flags:有關啟動請求的附加數據,可以是:0、START_FLAG_REDELIVERY或START_FLAG_RETRY.
* @param startId:一個唯一的整數,代表一次具體的請求,用於stopSelfResult(int)方法。
*/
@Override
publicint onStartCommand(Intent intent, int flags, int startId){
Log.i("LocalService", "Received star id" + startId + ":" + intent);
//顯示服務啟動的提示信息
Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
//獲取要傳遞給服務消息循環的Message對象。
Message msg = mServiceHandler.obtainMessage();
//初始化Message對象的成員變數。
msg.arg1 = startId;
msg.obj = "Message processing......" + startId;
//把消息發送給服務線程的消息循環。
mServiceHandler.sendMessage(msg);
returnSTART_STICKY;
}
/**
* 必須覆寫這個方法,服務被終止時要調用這個方法,清理服務所佔用的資源。
*/
@Override
publicvoid onDestroy(){
//退出服務線程的消息循環。
mServiceLooper.quit();
//顯示服務被退出的提示信息。
Toast.makeText(this, R.string.local_service_stopped, Toast.LENGTH_SHORT).show();
}
/**
* 綁定型服務必須覆寫這個方法,啟動型服務也可覆寫這個方法,只要返回null即可。
*/
@Override
public IBinder onBind(Intent intent){
//返回本服務對象實例。
returnmBinder;
}
privatefinal IBinder mBinder = new LocalBinder();
/**
* 該類繼承Android的Handler類,為線程的消息循環提供發送和處理消息的功能,
* 本示例覆寫了handleMessage()方法,用來處理發送給服務消息循環的消息。
*/
privatefinalclass ServiceHandler extends Handler{
//類實例化時,需要傳入服務線程的消息循環對象
public ServiceHandler(Looper looper){
super(looper);
}
/**
* 覆寫Handler類的handleMessage()方法,當服務線程的消息循環接收到外部
* 發送的消息時,會調用這個方法來處理對應的消息,本示例只是簡單的向用戶提示消息被處理的信息。
*/
@Override
publicvoid handleMessage(Message msg){
long endTime = System.currentTimeMillis() + 5 * 1000;
while (System.currentTimeMillis() < endTime){
synchronized(this){
try{
wait(endTime - System.currentTimeMillis());
CharSequence cs = msg.obj.toString();
Toast.makeText(LocalService.this, cs, Toast.LENGTH_SHORT).show();
//showNotification();
}catch(Exception e){
//
}
}
}
//消息被處理之後,終止本服務。
LocalService.this.stopSelf();
}
}
}
G. Android應用組件 —— Service
官方原文: 地址
本文摘錄自官方原文,方便自己觀看。
service 是一個可以在後台長時間運行的操作而不提供用戶界面的應用組件。服務可以由其他應用組件啟動,而且即使用戶切換到其他應用程序,服務仍將在後台繼續運行。此外,組件可以綁定到服務,以與之進行交互,甚至執行進程間的通信(IPC)
服務基本分為兩種形式:
啟動
綁定
上述雖然分開概括這兩種服務,但是服務可以同時以這兩種方式運行,也就是說,他既可以是啟動服務(以無限期運行),也允許綁定。問題在於是否實現了一組回調方法: onStartCommand() (允許組件啟動服務)和 onBing() (允許綁定服務)。
無論應用是出於啟動狀態還是綁定狀態,亦或處於啟動並且綁定狀態,任何應用組件均可以像使用Activity那麼調用Itent來使用服務(即使此服務來自另一應用)。 不過,您可以通過清單文件將服務聲明為私有服務,並阻止其他應用訪問。 使用清單文件聲明服務部分將對此做更詳盡的闡述。
注意:
服務在其託管進程的主線程中運行,它既不創建自己的線程,也不在單獨的進程中運行(除非另行指定)。這意味著,如果服務將執行任何CPU密集型工作或者阻止性操作(我理解為耗時操作,例如 MP3 播放或聯網),則應在服務內創建新線程來完成這項工作。通過使用單獨的線程,可以降低發生「應用無響應」(ANR) 錯誤的風險,而應用的主線程仍可繼續專注於運行用戶與 Activity 之間的交互。
要創建服務,您必須創建 Service 的子類(或使用它的一個現有子類)。在實現中,您需要重寫一些回調方法,以處理服務生命周期的某些關鍵方面並提供一種機制將組件綁定到服務(如適用)。 應重寫的最重要的回調方法包括:
onStartCommand()
onBind()
onCreate()
onDestroy()
如果組件通過調用 startService() 啟動服務(這會導致對 onStartCommand() 的調用),則服務將一直運行,直到服務使用 stopSelf() 自行停止運行,或由其他組件通過調用 stopService() 停止它為止。
如果組件是通過調用 bindService() 來創建服務(且未調用 onStartCommand() ,則服務只會在該組件與其綁定時運行。一旦該服務與所有客戶端之間的綁定全部取消,系統便會銷毀它。
如同 Activity(以及其他組件)一樣,您必須在應用的清單文件中聲明所有服務。
要聲明服務,請添加 <service> 元素作為 <application> 元素的子元素。例如:
為了確保應用的安全性, 請始終使用顯式 Intent 啟動或綁定 Service,且不要為服務聲明 Intent 過濾器。 啟動哪個服務存在一定的不確定性,而如果對這種不確定性的考量非常有必要,則可為服務提供 Intent 過濾器並從 Intent 中排除相應的組件名稱,但隨後必須使用 setPackage() 方法設置 Intent 的軟體包,這樣可以充分消除目標服務的不確定性。
此外,還可以通過添加 android:exported 屬性並將其設置為 "false" ,確保服務僅適用於您的應用。這可以有效阻止其他應用啟動您的服務,即便在使用顯式 Intent 時也如此
Service
IntentService
簡單地說,服務是一種即使用戶未與應用交互也可在後台運行的組件。 因此,您應僅在必要時才創建服務。
如需在主線程外部執行工作,不過只是在用戶正在與應用交互時才有此需要,則應創建新線程而非服務。 例如,如果您只是想在 Activity 運行的同時播放一些音樂,則可在 onCreate() 中創建線程,在 onStart() 中啟動線程,然後在 onStop() 中停止線程。您還可以考慮使用 AsyncTask 或 HandlerThread,而非傳統的 Thread 類。
前台服務被認為是用戶主動意識到的一種服務,因此在內存不足時,系統也不會考慮將其終止。 前台服務必須為狀態欄提供通知,放在「正在進行」標題下方,這意味著除非服務停止或從前台移除,否則不能清除通知。
要請求讓服務運行於前台,請調用 startForeground() 。此方法採用兩個參數:唯一標識通知的整型數和狀態欄的 Notification 。例如:
注意 :提供給 startForeground() 的整型 ID 不得為 0。
要從前台移除服務,請調用 stopForeground() 。此方法採用一個布爾值,指示是否也移除狀態欄通知。 此方法不會停止服務。 但是,如果您在服務正在前台運行時將其停止,則通知也會被移除。
與 Activity 類似,服務也擁有生命周期回調方法,您可以實現這些方法來監控服務狀態的變化並適時執行工作。 以下框架服務展示了每種生命周期方法:
注 :與 Activity 生命周期回調方法不同,您 不 需要調用這些回調方法的超類實現。
注 :盡管啟動服務是通過調用 stopSelf() 或 stopService() 來停止,但是該服務並無相應的回調(沒有 onStop() 回調)。因此,除非服務綁定到客戶端,否則在服務停止時,系統會將其銷毀 — onDestroy() 是接收到的唯一回調。
H. Android應用的伺服器端可以用C#寫嗎還是只能用java寫
Android應用的伺服器端是可以用C#寫的:
1、C#是微軟公司發布的一種面向對象的、運行於.NET Framework之上的高級程序設計語言。並定於在微軟職業開發者論壇(PDC)上登台亮相。C#是微軟公司研究員Anders Hejlsberg的最新成果。C#看起來與Java有著驚人的相似;它包括了諸如單一繼承、介面、與Java幾乎同樣的語法和編譯成中間代碼再運行的過程。但是C#與Java有著明顯的不同,它借鑒了Delphi的一個特點,與COM(組件對象模型)是直接集成的,而且它是微軟公司 .NET windows網路框架的主角。
2、C#是一種安全的、穩定的、簡單的、優雅的,由C和C++衍生出來的面向對象的編程語言。它在繼承C和C++強大功能的同時去掉了一些它們的復雜特性(例如沒有宏以及不允許多重繼承)。C#綜合了VB簡單的可視化操作和C++的高運行效率,以其強大的操作能力、優雅的語法風格、創新的語言特性和便捷的面向組件編程的支持成為.NET開發的首選語言。
3、C#是面向對象的編程語言。它使得程序員可以快速地編寫各種基於MICROSOFT .NET平台的應用程序,MICROSOFT .NET提供了一系列的工具和服務來最大程度地開發利用計算與通訊領域。
4、C#使得C++程序員可以高效的開發程序,且因可調用由 C/C++ 編寫的本機原生函數,因此絕不損失C/C++原有的強大的功能。因為這種繼承關系,C#與C/C++具有極大的相似性,熟悉類似語言的開發者可以很快的轉向C#。
I. 安卓手機中的 android app service 應用可以刪除嗎
android
app
service是後台運行的系統進程,是不可以刪除的。刪除之後會導致伏祥系統使用錯誤,有可能會無法開機、桌面無法顯示等異常。
android通過文件管理器打開文件,可以看到很多以缺游搏符號"."開頭的文件夾,這些文件都屬於系統配置文件或者必要的應磨升用,比如時鍾、電話撥號器等等,一旦刪除掉的話,手機就會失去基本的系統功能。
J. Android 服務的限制
Google官網將Android服務分為了三種,前台服務,後台服務和綁定服務:
前台服務執行一些用戶能注意到的操作。例如,音頻應用會使用前台服務來播放音頻曲目。前台服務必須顯示 通知 。即使用戶停止與應用的交互,前台服務仍會繼續運行。
後台服務執行用戶不會直接注意到的操作。例如,如果應用使用某個服務來壓縮其存儲空間,則此服務通常是後台服務。
當應用組件通過調用 bindService() 綁定到服務時,服務即處於 綁定 狀態。綁定服務會提供客戶端-伺服器介面,以便組件與服務進行交互、發送請求、接收結果,甚至是利用進程間通信 (IPC) 跨進程執行這些操作。僅當與另一個應用組件綁定時,綁定服務才會運行。多個組件可同時綁定到該服務,但全部取消綁定後,該服務即會被銷毀。
我個人理解服務可以分為兩種, 前台 和 後台 ,而 綁定 應該是被當作一種狀態,因為 前台服務 和 後台服務 都可以進行綁定。
基於這個理解,我們將限制分成了前台和後台兩個部分:
從 Android 5.0(API 級別 21)開始,如果使用隱式 Intent 調用 bindService() ,則系統會拋出異常。為確保應用的安全性,在啟動 Service 時,請始終使用顯式 Intent,且不要為服務聲明 Intent 過濾器。
在後台中運行的 Service 會消耗設備資源,這可能會降低用戶體驗。 為了緩解這一問題,系統對這些 Service 施加了一些限制。
處於前台時,應用可以自由創建和運行前台與後台 Service。
Android 8.0 開始:系統不允許後台應用創建後台 Service。否則該函數將引發一個 IllegalStateException。
Android 8.0 開始:進入後台時,在一個持續數分鍾的時間窗內,應用仍可以創建和使用 Service。 在該時間窗結束後,應用將被視為處於 空閑 狀態。 此時,系統將停止應用的後台 Service,就像應用已經調用 Service 的 Service.stopSelf() 方法一樣。
為了解除這種限制,可以使用 JobScheler 作業替換後台 Service。
在 Android 8.0 之前,創建前台 Service 的方式通常是先創建一個後台 Service,然後將該 Service 推到前台。
而在Android 8.0 之後,系統不允許後台應用創建後台 Service。
解決方案:調用 startForegroundService() ,以在前台啟動新 Service。
在系統創建 Service 後,應用有五秒的時間來調用該 Service 的 startForeground() 方法以顯示新 Service 的用戶可見通知。 如果應用在此時間限制內 未 調用 startForeground() ,則系統將停止此 Service 並聲明此應用為 ANR 。
前台服務必須顯示優先順序為 PRIORITY_LOW 或更高的 狀態欄通知 ,這有助於確保用戶知道應用正在執行的任務。如果某操作不是特別重要,因而您希望使用最低優先順序通知,則可能不適合使用服務;相反,您可以考慮使用 計劃作業 。
在 Android 9 (API 28)之後,使用前台服務必須申請 FOREGROUND_SERVICE 許可權,否則會報 SecurityException 。 這是普通許可權,因此,系統會自動為請求許可權的應用授予此許可權。
每個運行服務的應用都會給系統帶來額外負擔,從而消耗系統資源。如果應用嘗試使用低優先順序通知隱藏其服務,則可能會降低用戶正在主動交互的應用的性能。因此,如果某個應用嘗試運行擁有最低優先順序通知的服務,則系統會在抽屜式通知欄的底部調用出該應用的行為。
以 Android 12 為目標平台的應用在後台運行時無法再啟動 前台服務 。
在 Android 11 及以後,系統對前台服務何時可以訪問設備的位置、攝像頭或麥克風進行了限制。
如果您的應用以 Android 11 或更高版本為目標平台,且在前台服務中訪問攝像頭或麥克風,則必須添加 前台服務類型 camera 和 microphone 。
如果你的應用 在後台運行時啟動了某項前台服務 :
如果某服務的功能(位置、麥克風 和 相機)受到了限制,則Logcat中會列印如下語句: