當前位置:首頁 » 安卓系統 » android獲取service

android獲取service

發布時間: 2024-03-28 00:00:22

A. android 怎麼獲取service實例

public class ServiceList extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

TextView tv = new TextView(this);

ActivityManager activityManger = (ActivityManager) getSystemService(ACTIVITY_SERVICE);// 獲取Activity管理器
List<ActivityManager.RunningServiceInfo> serviceList = activityManger.getRunningServices(30);// 從窗口管理器中獲取正在運行的Service
tv.setText(getServicesName(serviceList));

setContentView(tv);
}

private boolean ServiceIsStart(List<ActivityManager.RunningServiceInfo> list, String className) {// 判斷某個服務是否啟動
for (int i = 0; i < list.size(); i++) {
if (className.equals(list.get(i).service.getClassName()))
return true;
}
return false;
}

private String getServicesName(List<ActivityManager.RunningServiceInfo> list) {// 獲取所有服務的名稱
String res = "";
for (int i = 0; i < list.size(); i++) {
res += list.get(i).service.getClassName() + "/n";
}
return res;
}
}

B. 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() 是接收到的唯一回調。

C. Android Service 為什麼要綁定服務 僅僅是因為要獲取服務中的方法嗎

Android中Service是運行在後台的東西,級別與activity一樣。

既然說service是運行在後台的服務,那麼它就是不可見的,沒有界面的東西。

你可以啟動一個服務Service來播放音樂,或者記錄你地理信息位置的改變,或者啟動一個服務來運行並一直監聽某種動作。

Service和其他組件一樣,都是運行在主線程中,因此不能用它來做耗時的請求或者動作。你可以在服務中開一一個線程,在線程中做耗時動作。


服務一般分為兩種:

1:本地服務,Local Service 用於應用程序內部。在Service可以調用Context.startService()啟動,調用Context.stopService()結束。在內部可以調用Service.stopSelf() 或 Service.stopSelfResult()來自己停止。無論調用了多少次startService(),都只需調用一次stopService()來停止。

2:遠程服務, Remote Service 用於android系統內部的應用程序之間。可以定義介面並把介面暴露出來,以便其他應用進行操作。客戶端建立到服務對象的連接,並通過那個連接來調用服務。調用Context.bindService()方法建立連接,並啟動,以調用 Context.unbindService()關閉連接。多個客戶端可以綁定至同一個服務。如果服務此時還沒有載入,bindService()會先載入它。
提供給可被其他應用復用,比如定義一個天氣預報服務,提供與其他應用調用即可。

3.Service的生命周期


context.startService() ->onCreate()- >onStart()->Service running--調用context.stopService() ->onDestroy()

context.bindService()->onCreate()->onBind()->Service running--調用>onUnbind() -> onDestroy()
從上訴可以知道分別對應本地的,,以及遠程的,也對應不同的方式啟動這個服務。


4.如果你Activity不綁定服務,那麼就無法與遠程服務進行通信

例如你要調用其它應用的服務(進程之間的通信)


有關更多的RPC通信建議查看android官網的API

D. mqtt 怎麼實現android以後台service的方式獲取gps數據,並定時發送到伺服器

1 從Service繼承一個類。
2 創建startService()方法。
3 創建endService()方法 重載onCreate方法和onDestroy方法,並在這兩個方法裡面來調用startService以及endService。
4 在startService中,通過getSystemService方法獲取Context.LOCATION_SERVICE。
5 基於LocationListener實現一個新類。默認將重載四個方法onLocationChanged、onProviderDisabled、onProviderEnabled、onStatusChanged。對於onLocationChanged方法是我們更新最新的GPS數據的方法。一般我們的操作都只需要在這里進行處理。
6 調用LocationManager的requestLocationUpdates方法,來定期觸發獲取GPS數據即可。在onLocationChanged函數裡面可以實現我們對得到的經緯度的最終操作。
7 最後在我們的Activity裡面通過按鈕來啟動Service,停止Service。
示意代碼如下:
package com.offbye.gpsservice;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
public class GPSService extends Service {
// 2000ms
private static final long minTime = 2000;
// 最小變更距離10m
private static final float minDistance = 10;
String tag = this.toString();
private LocationManager locationManager;
private LocationListener locationListener;
private final IBinder mBinder = new GPSServiceBinder();
public void startService() {
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationListener = new GPSServiceListener();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance,
locationListener);
}
public void endService() {
if (locationManager != null && locationListener != null) {
locationManager.removeUpdates(locationListener);
}
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return mBinder;
}

E. android 怎麼獲得bluetootha2dpservice

這是個隱藏類,你可以通過反射來使用它,也可以去這看看隱藏API和Internal包的使用

首先我們要明白為什麼隱藏API(有@hide標記)和Internal包不能使用。
當我們使用android的SDK進行開發的時候都會用到一個非常重要的jar文件--android.jar(SDK_DIR/platforms/platform-X/android.jar,X是API等級)。這個包中移除了所有被標記的尾@hide的類、方法、枚舉、欄位和Internal包。當我們的程序在設備上運行的時候會載入設備上的一個framework.jar的文件,它包含了移除的部分。

所以我們的思路是想辦法得到framework.jar將那些缺少的API拿出來放到android.jar中。當然這些都可以通過編譯源碼來解決,但那樣太過麻煩。下面我介紹一種簡單的方法來獲取這些內容。

1,獲取framework.jar
剛才也說了,設備上有這個文件,那麼我們就從設備上來取。通過adb pull命令(也可以用DDMS):
adb pull /system/framework/framework.jar
我們需要該包中的classes.dex文件。這里從4.0以下模擬器上取,真機上一般是經過優化了的.odex文件,而4.0以上的模擬器中的這個文件中沒有classes.dex文件。
如果需要4.0以上的可以在網上找找。

2,將framework.jar改成framework.zip,解壓,得到裡面的classes.dex文件。

3,將.dex文件轉換成.jar格式。這里用到了dex2jar這個工具,知道反編譯的同學都知道這個工具,沒有的可以在網上找找。
轉換結束後會得到一個classes.dex.dex2jar.jar文件。

4,重命名classes.dex.dex2jar.jar成classes.dex.dex2jar.zip,解壓。得到以下文件。

5,將SDK_DIR/platforms/platform-X/中的android.jar拷貝出來,改成android.zip解壓,得到以下結構的文件。將上面得到的文件復制到下面文件夾中(覆蓋替換)。

6,全選上面的文件,打包成original-android.zip。
7,將original-android.zip改成original-android.jar。

OK,完成。
最簡單的方法就是將這個包直接導入我們的工程,在工程中就可以使用隱藏API和Internal包了。

熱點內容
冒險家選哪個配置性價比高 發布:2024-11-27 20:58:36 瀏覽:876
阿里雲伺服器可以多開嗎 發布:2024-11-27 20:58:18 瀏覽:496
圖片水印加密 發布:2024-11-27 20:52:37 瀏覽:118
php客戶管理 發布:2024-11-27 20:47:26 瀏覽:371
java數組中的對象 發布:2024-11-27 20:45:37 瀏覽:492
手機報停恢復需要的是什麼密碼 發布:2024-11-27 20:37:02 瀏覽:592
域名訪問量查詢 發布:2024-11-27 20:22:13 瀏覽:725
如何清理網頁帳號和登錄密碼 發布:2024-11-27 20:18:53 瀏覽:372
大發明解壓密碼 發布:2024-11-27 20:18:52 瀏覽:502
藍鷗c語言 發布:2024-11-27 20:14:38 瀏覽:813