android服務
Ⅰ android service有什麼用
Service是Android系統中的四大組件之一,它是一種長生命周期的,沒有可視化界面,運行於後台的一種服務程序。如果service是被開啟的,那麼它的活動生命周期和整個生命周期一同結束。如果service是被綁定的,它們它的活動生命周期是在onUnbind()方法返回後結束。
service積極活動的生命時間(active lifetime)是從onStartCommand()或onBind()被調用開始,它們各自處理由startService()或bindService()方法傳過來的Intent對象。
(1)android服務擴展閱讀
service整體的生命時間是從onCreate()被調用開始,到onDestroy()方法返回為止。和activity一樣,service在onCreate()中進行它的初始化工作,在onDestroy()中釋放殘留的資源。
比如,一個音樂播放service可以在onCreate()中創建播放音樂的線程,在onDestory()中停止這個線程。onCreate()和onDestroy()會被所有的service調用,不論service是通過startService()還是bindService()建立。
Ⅱ Android中的Service到底起什麼作用
Service 是android的一種機制,當它運行的時候如果是Local Service,那麼對應的 Service 是運行在主進程的 main 線程上的。如:onCreate,onStart 這些函數在被系統調用的時候都是在主進程的 main 線程上運行的。如果是Remote Service,那麼對應的 Service 則是運行在獨立進程的 main 線程上。因此請不要把 Service 理解成線程,它跟線程半毛錢的關系都沒有!
既然這樣,那麼我們為什麼要用 Service 呢?其實這跟 android 的系統機制有關,我們先拿 Thread 來說。Thread 的運行是獨立於 Activity 的,也就是說當一個 Activity 被 finish 之後,如果你沒有主動停止 Thread 或者 Thread 里的 run 方法沒有執行完畢的話,Thread 也會一直執行。因此這里會出現一個問題:當 Activity 被 finish 之後,你不再持有該 Thread 的引用。另一方面,你沒有辦法在不同的 Activity 中對同一 Thread 進行控制。
舉個例子:如果你的 Thread 需要不停地隔一段時間就要連接伺服器做某種同步的話,該 Thread 需要在 Activity 沒有start的時候也在運行。這個時候當你 start 一個 Activity 就沒有辦法在該 Activity 裡面控制之前創建的 Thread。因此你便需要創建並啟動一個 Service ,在 Service 裡面創建、運行並控制該 Thread,這樣便解決了該問題(因為任何 Activity 都可以控制同一 Service,而系統也只會創建一個對應 Service 的實例)。
因此你可以把 Service 想像成一種消息服務,而你可以在任何有 Context 的地方調用 Context.startService、Context.stopService、Context.bindService,Context.unbindService,來控制它,你也可以在 Service 里注冊 BroadcastReceiver,在其他地方通過發送 broadcast 來控制它,當然這些都是 Thread 做不到的。
Ⅲ android服務和進程的區別
他們之間的區別:Service很大程度上充當了應用程序後台線程管理器的角色。(如果Activity中新開啟一個線程,當該Acitivyt關閉後,該線程依然在工作,但是與開啟它的Activity失去聯系。也就是說此時的這個線程處於失去管理的狀態。但是使用Service,則可以對後台運行的線程有效地管理。)
一個服務不是一個單獨的進程。服務對象本身並不意味著它是在自己的進程中運行,除非另有規定,否則它與運行程序是同在一個進程中。
一個服務不是一個單獨的線程。Service和其他組件一樣,默認情況下,Service中的所有代碼都是運行在主線程中。
在android中,為什麼不使用後台線程而使用Service? 有3大要點:
1、Service可以放在獨立的進程中,所以更安全;
2、使用Service可以依賴現有的binder機制,不需要在應用層面上處理線程同步的繁雜工作;
3、系統可以重新啟動異常死去的Service。
說明:進程是由若干線程組成。(線程是進程中的一部分,進程包含多個線程在運行。)
Ⅳ 如何創建android系統服務
1、 撰寫一個aidl文件,定義服務的介面,將在編譯過程中通過aidl工具生成對應的java介面。一般系統服務的aidl文件都放在framework\base\core\java\android\os目錄中。
以我所寫的IMyTool.aidl為例。在.aidl中定義自己需要加入的方法,編寫規則和java介面差不多,這里不多說。
2、 將aidl文件名添加到frameworks\base\目錄下的Android.mk編譯腳本文件中。
如:
LOCAL_SRC_FILES += \
core/java/android/accessibilityservice/.aidl\
…\
core/java/android/os/IMyTool.aidl\
…
IMyTool.aidl即我加進去的aidl文件,加入後才能在make過程中編譯到,否則將在後面的SystemServer添加系統服務時會報錯提示找不到對應類。
3、 編寫真正工作的服務類,繼承IMyTool.Stub類(AIDL文件名.Stub,aidl生成的介面中的內部類,是一個Binder)。
服務類一般都放在framework\base\services\java\com\android\server目錄中。
例如:
public class MyToolService extends IMyTool.Stub {
實現IMyTool.aidl中定義的介面。
}
4、 將自定義服務注冊到SystemServer,使得開機過程中被添加。
在framework\base\services\java\com\android\server目錄中的SystemServer中啟動服務代碼處加入:
try {
Slog.i(TAG, "MyToolService");
ServiceManager.addService(Context.MY_TOOL_SERVICE,new MyToolService(context));// MyToolService構造函數自己定義,一般都會用到Context
} catch(Throwable e) {
Slog.e(TAG, "Failure startingMyToolService", e);
}
上面代碼中Context.MY_TOOL_SERVICE是自己在Context類中定義的常量,也就是給服務定義的名字,使用常量方便獲取服務,而不需要記住注冊服務時用的名字,且想換名字時只需改一個常量的值。
Ⅳ AndroidService是什麼
Service,看名字就知道跟正常理解的「服務」差不多,後台運行,可交互這樣的一個東西。它跟Activity的級別差不多,但是他不能自己運行,需要通過某一個Activity或者其他Context對象來調用, Context.startService() 和 Context.bindService()。
兩種啟動Service的方式有所不同。這里要說明一下的是如果你在Service的onCreate或者onStart做一些很耗時間的事情,最好在Service里啟動一個線程來完成,因為Service是跑在主線程中,會影響到你的UI操作或者阻塞主線程中的其他事情。
什麼時候需要Service呢?比如播放多媒體的時候用戶啟動了其他Activity這個時候程序要在後台繼續播放,比如檢測SD卡上文件的變化,再或者在後台記錄你地理信息位置的改變等等,總之服務嘛,總是藏在後頭的。
Ⅵ 如何在android系統中開啟自己的服務
Android開機啟動Service,需要使用BroadcastReceiver,Android系統,開機會發送一個開機廣播,可以通過BroadcastReceiver來接收開機廣播。
具體代碼:
1.在配置文件AndroidManifest.xml中向系統注冊receiver
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
2.需要添加相應許可權
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
3.在Receiver中就可以添加開機需要進行的操作
public class BootCompletedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
4.執行開機後的操作,Intent intent = new Intent(context,Service.class); context.startService(intent); 這樣即可開機啟動Service了。
Ⅶ 如何寫一個android服務
android SDK提供了Service,用於類似*nix守護進程或者windows的服務。
Service有兩種類型:
1. 本地服務(Local Service):用於應用程序內部
2. 遠程服務(Remote Sercie):用於android系統內部的應用程序之間
前者用於實現應用程序自己的一些耗時任務,比如查詢升級信息,並不佔用應用程序比如Activity所屬線程,而是單開線程後台執行,這樣用戶體驗比較好。
後者可被其他應用程序復用,比如天氣預報服務,其他應用程序不需要再寫這樣的服務,調用已有的即可。
編寫不需和Activity交互的本地服務示例
本地服務編寫比較簡單。首先,要創建一個Service類,該類繼承android的Service類。這里寫了一個計數服務的類,每秒鍾為計數器加一。在服務類的內部,還創建了一個線程,用於實現後台執行上述業務邏輯。
package com.easymorse;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class CountService extends Service {
private boolean threadDisable;
private int count;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
new Thread(new Runnable() {
@Override
public void run() {
while (!threadDisable) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
count++;
Log.v("CountService", "Count is " + count);
}
}
}).start();
}
@Override
public void onDestroy() {
super.onDestroy();
this.threadDisable = true;
Log.v("CountService", "on destroy");
}
public int getCount() {
return count;
}
}
需要將該服務注冊到配置文件AndroidManifest.xml中,否則無法找到:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.easymorse" android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".LocalServiceDemoActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="CountService" />
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>
在Activity中啟動和關閉本地服務。
package com.easymorse;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
public class LocalServiceDemoActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.startService(new Intent(this, CountService.class));
}
@Override
protected void onDestroy() {
super.onDestroy();
this.stopService(new Intent(this, CountService.class));
}
}
Ⅷ android中服務存在的意義
服務一般用於長時間的工作,看需要,有的服務會跟隨APP存在,有的是綁定頁面。服務執行完了會存在那邊,如果繼續調用只是不會new出來,可以去查下相關的資料。
Ⅸ android 的ConnectivityService服務是什麼
ConnectivityService提供數據連接管理服務,NetworkPolicyManagerService提供網路策略管理服務,NetworkStatsService提供網路傳輸數據統計服務,NetworkManagementService提供對物理網路介面的管理服務,connectivityService也包括VPN、Tethering對象提供虛擬連接及共享連接管理。
ConnectivityService、NetworkPolicyManagerService、NetworkStatsService三個服務都通過INetworkManagementService介面跨進程訪問NetworkManagementService服務,實現與網路介面的交互及信息讀取。
NetworkStatsService、NetworkPolicyManagerService兩個服務還通過IConnectivityManager介面與connectivityService服務通訊,從connectivityService讀取網路連接的信息及打開數據連接的策略控制。
ConnectivityService服務也通過INetworkPolicyManager介面調用NetworkPolicyManagerService的API,讀取網路限額信息,登記監聽對象。connectivityService服務通過NetworkPolicyManagerService服務的registerListener函數向NetworkPolicyManagerService服務注冊一個INetworkPolicyListener.Stub監聽樁對象。 NetworkPolicyManagerService通過該監聽對象的遠程代理介面向ConnectivityService服務傳送規則變化通知。
另外ConnectivityService服務的Tethering、VPN對象及NetworkPolicyManagerService、NetworkStatsService服務的內部NetworkAlertObserver類型的對象都直接或間接派生自.Stub,且四個對象都登記為NetworkManagementService的監聽對象,NetworkManagementService服務通過介面向這些對象傳送網路介面事件通知。
Ⅹ Android中Service服務有哪些
通過startService()啟動的服務處於「啟動的」狀態,一旦啟動,service就在後台運行,即使啟動它的應用組件已經被銷毀了。通常started狀態的service執行單任務並且不返回任何結果給啟動者。比如當下載或上傳一個文件,當這項操作完成時,service應該停止它本身。
還有一種「綁定」狀態的service,通過調用bindService()來啟動,一個綁定的service提供一個允許組件與service交互的介面,可以發送請求、獲取返回結果,還可以通過誇進程通信來交互(IPC)。綁定的service只有當應用組件綁定後才能運行,多個組件可以綁定一個service,當調用unbind()方法時,這個service就會被銷毀了。