androidservice後台運行
❶ 如何讓android的service一直在後台運行
服務開始有兩種方式,一種是startservice(意圖)直接開啟服務,服務開啟就跟開啟者沒關系了,即調用者activity退出了服務依然可以繼續運行。二種使用bindservice(意圖),這種方式是將服務綁定在activity上,即只要開啟者activity被銷毀了,服務也會銷毀。所以你可以使用第一種方式。當然如果你想應用退出了服務還能繼續運行就需要使用遠程服務了。那就需要aidl,即使用安卓介面定義語言進行跨進程通信。這樣服務與應用不在同一進程中,就能達到你想要的效果
❷ android service有什麼用
Service是Android中實現程序後台運行的解決方案,它非常適合執行那些不需要和用戶交互而
且還要求長期運行的任務。Service的運行不依賴於任何用戶界面,即使程序被切換到後台,或
者用戶打開了另外一個應用程序,Service仍然能夠保持正常運行。
所以你說service有什麼用
❸ 如何讓android的service一直在後台運行
首先來說,android是不存在一直運行後台服務的。而且,後天一直運行,就會消耗很大的手機資源的,因此也會影響手機的其他程序的使用的。
需要注意的事,手機系統運行的問題,以上的方法都是建立在手機系統夠大的時候才行的。要不就會被很輕易的就清理掉了。
以上就是我的回答,希望可以幫到題主。
❹ 如何讓android的service一直在後台運行
1.把service和activity分開,讓service開機啟動。設置一個broadcastreceiver接受開機信號,使用RECEIVE_BOOT_COMPLETED的permission,然後啟動service。activity啟動後綁定到service上,通過ipc機制通信,acitivity結束後松綁。注意安裝後要手動啟動service,不會自動啟動,之後重啟手機後才會隨開機啟動。2.在內存低的時候系統會自動清理進程,這時候後台service可能會被殺掉。可以在onStartCommand中返回START_STICKY,這樣系統有足夠多資源的時候,就會重新開啟service。3.以上不需要NDK,直接用SDK開發就可以了。Android一直運行的後台服務是不存在的,而且也不是最佳實踐,因為一直運行的後台服務會耗費大量系統資源,影響其他程序的響應從而影響到用戶體驗。可以考慮使用如下幾種方案來達到一直運行的效果。1.調用startForeground方法,android:.使用AlarmManager發送定時任務:DiamondsAreForever.ServicesAreNot.我現在也遇到這個問題,我想樓主之所以出現這個問題的原因是,你在Activitiy中創建的Service運行在當前進程中,當你把這個Activitiy的進程殺掉之後,自然這個服務也就停止了。所以我的建議是在startService的時候,讓這個Service運行在與該Activity不同的進程中(可以startService或者開機時創建一個新的進程)。實際上就是Linux裡面的進程操作。可以使用NDK開發,用C或者C++新建一個進程來運行自己的服務,並提高進程優先順序,避免被清理掉(我猜測 和 的推送服務,或許是這么實現的)。有一種做法是開兩個進程來相互監督,一旦其中一個進程被停止,另一個檢測到後,立即或稍後重啟另一個進程。這里可以效仿這種做法。可以開兩個進程,一個用來做前台,另一個負責運行服務,後者沒有activity,由前者初始化並啟動,這樣,當前台進程被關閉時,服務並不被關閉
❺ 如何讓android的service一直在後台運行
Started Service的生命周期:
onCreate():創建服務
onStartCommand():服務開始運行(在2.0以前版本中,使用onStart()回調方法)
onDestroy() :服務被停止
【詳細說明:】
在程序中調用:context.startService() 會觸發執行Service生命周期中的onCreate()、onStartCommand()回調方法,此時服務就開始正式運行;
如果Service還沒有運行,則android先調用onCreate()然後調用onStartCommand();如果Service已經運行,則只調用onStartCommand(),所以一個Service的onStartCommand方法可能會重復調用多次;
如果在程序中調用:context.stopService()會觸發執行Service生命周期中的onDestroy()回調方法,會讓服務停止;
stopService()的時候直接onDestroy,如果是調用者自己直接退出而沒有調用stopService()的話,Service會一直在後台運行。該Service的調用者再啟動該Service後可以通過stopService關閉Service;stopSelf()
所以StartService的生命周期為:onCreate --> onStartCommand(可多次調用) --> onDestroy。
Service運行在後台,它是不可見的、無界面的程序 Service運行在主線程中;最好在Service中啟動新線程來運行耗時的任務
❻ 如何讓android的service一直在後台運行
Android的service一直運行的方法:
1、 Intent.ACTION_TIME_TICK的使用
我們知道廣播的注冊有靜態注冊和動態注冊,但此系統廣播只能通過動態注冊的方式使用。即你不能通過在manifest.xml里注冊的方式接收到這個廣播,只能在代碼里通過registerReceiver()方法注冊。
在ThisApp extends Application 里注冊廣播:
IntentFilter filter = newIntentFilter(Intent.ACTION_TIME_TICK); MyBroadcastReceiver receiver = new MyBroadcastReceiver(); registerReceiver(receiver, filter);
在廣播接收器MyBroadcastReceiver extends BroadcastReceiver的onReceive里
if (intent.getAction().equals(Intent.ACTION_TIME_TICK)) { //檢查Service狀態 }
2、Service的檢查與啟動
boolean isServiceRunning = false; ActivityManager manager = (ActivityManager)ThisApp.getContext().getSystemService(Context.ACTIVITY_SERVICE); for (RunningServiceInfo service :manager.getRunningServices(Integer.MAX_VALUE)) { if("so.xxxx.WidgetUpdateService".equals(service.service.getClassName())) //Service的類名 { isServiceRunning = true; } } if (!isServiceRunning) { Intent i = new Intent(context, WidgetUpdateService.class); context.startService(i); }
另一個話題,Service的開機啟動。
實現和上邊的類似,也是通過監控開機的系統廣播來啟動Service。但其實你做了上邊的檢查也就不會做開機啟動了,因為過一兩分鍾就會通過上邊的程序啟動Service了。代碼如下:
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { Intent i = new Intent(context, LogService.class); context.startService(i); }
❼ android如何判斷後台一個Service是否在運行
當你了解Service的生命周期以後,你就會明白,你可以在onStop 或者onDestroy()中記錄一下狀態,onStop 執行以後,那麼service肯定是停止的,Service是在一段不定的時間運行在後台,不和用戶交互應用組件。每個Service必須在manifest中 通過<service>來聲明。可以通過contect.startservice和contect.bindserverice來啟動。
Service生命周期
使用context.startService() 啟動Service是會會經歷:
context.startService() ->onCreate()- >onStart()->Service running
context.stopService() | ->onDestroy() ->Service stop
在Service每一次的開啟關閉過程中,只有onStart可被多次調用(通過多次startService調用),其他onCreate,onBind,onUnbind,onDestory在一個生命周期中只能被調用一次。
而啟動service,根據onStartCommand的返回值不同,有兩個附加的模式:
1. START_STICKY 用於顯示啟動和停止service。
2. START_NOT_STICKY或START_REDELIVER_INTENT用於有命令需要處理時才運行的模式。
Service不能自己運行,需要通過調用Context.startService()或Context.bindService()方法啟動服務。這兩個方法都可以啟動Service,但是它們的使用場合有所不同。
使用startService()方法啟用服務,調用者與服務之間沒有關連,即使調用者退出了,服務仍然運行。如果打算採用Context.startService()方法啟動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,接著調用onStart()方法。如果調用startService()方法前服務已經被創建,多次調用startService()方法並不會導致多次創建服務,但會導致多次調用onStart()方法。採用startService()方法啟動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。
使用bindService()方法啟用服務,調用者與服務綁定在了一起,調用者一旦退出,服務也就終止,大有「不求同時生,必須同時死」的特點。onBind()只有採用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務綁定時被調用,當調用者與服務已經綁定,多次調用Context.bindService()方法並不會導致該方法被多次調用。採用Context.bindService()方法啟動服務時只能調用onUnbind()方法解除調用者與服務解除,服務結束時會調用onDestroy()方法。
官方文檔告訴我們,Android系統會盡量保持擁有service的進程運行,只要在該service已經被啟動(start)或者客戶端連接(bindService)到它。當內存不足時,需要保持,擁有service的進程具有較高的優先順序。
1. 如果service正在調用onCreate,onStartCommand或者onDestory方法,那麼用於當前service的進程則變為前台進程以避免被killed。
2. 如果當前service已經被啟動(start),擁有它的進程則比那些用戶可見的進程優先順序低一些,但是比那些不可見的進程更重要,這就意味著service一般不會被killed.
3. 如果客戶端已經連接到service (bindService),那麼擁有Service的進程則擁有最高的優先順序,可以認為service是可見的。
4. 如果service可以使用startForeground(int, Notification)方法來將service設置為前台狀態,那麼系統就認為是對用戶可見的,並不會在內存不足時killed。
❽ 如何讓android的service一直在後台運行
Android的service一直運行的方法: 1、 Intent.ACTION_TIME_TICK的使用 我們知道廣播的注冊有靜態注冊和動態注冊,但此系統廣播只能通過動態注冊的方式使用。即你不能通過在manifest.xml里注冊的方式接收到這個廣播,只能在代碼里通過registerReceiver()方法注冊。 在ThisApp extends Application 里注冊廣播: IntentFilter filter = newIntentFilter(Intent.ACTION_TIME_TICK); MyBroadcastReceiver receiver = new MyBroadcastReceiver(); registerReceiver(receiver, filter); 在廣播接收器MyBroadcastReceiver extends BroadcastReceiver的onReceive里 if (intent.getAction().equals(Intent.ACTION_TIME_TICK)) { //檢查Service狀態 } 2、Service的檢查與啟動 boolean isServiceRunning = false; ActivityManager manager = (ActivityManager)ThisApp.getContext().getSystemService(Context.ACTIVITY_SERVICE); for (RunningServiceInfo service :manager.getRunningServices(Integer.MAX_VALUE)) { if("so.xxxx.WidgetUpdateService".equals(service.service.getClassName())) //Service的類名 { isServiceRunning = true; } } if (!isServiceRunning) { Intent i = new Intent(context, WidgetUpdateService.class); context.startService(i); } 另一個話題,Service的開機啟動。 實現和上邊的類似,也是通過監控開機的系統廣播來啟動Service。但其實你做了上邊的檢查也就不會做開機啟動了,因為過一兩分鍾就會通過上邊的程序啟動Service了。代碼如下: if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { Intent i = new Intent(context, LogService.class); context.startService(i); }
❾ 如何讓android的service一直在後台運行
1. 把service和activity分開,讓service開機啟動。設置一個broadcast receiver接受開機信號,使用RECEIVE_BOOT_COMPLETED的permission, 然後啟動service。activity啟動後綁定到service上,通過ipc機制通信,acitivity結束後松綁。注意安裝後要手動啟動service,不會自動啟動,之後重啟手機後才會隨開機啟動。
2. 在內存低的時候系統會自動清理進程,這時候後台service可能會被殺掉。可以在onStartCommand中返回START_STICKY,這樣系統有足夠多資源的時候,就會重新開啟service。
3. 以上不需要NDK,直接用SDK開發就可以了。
❿ 如何讓android的service一直在後台運行
Android開發的過程中,每次調用startService(Intent)的時候,都會調用該Service對象的onStartCommand(Intent,int,int)方法,然後在onStartCommand方法中做一些處理。然後我們注意到這個函數有一個int的返回值
從Android官方文檔中,我們知道onStartCommand有4種返回值:
START_STICKY:如果service進程被kill掉,保留service的狀態為開始狀態,但不保留遞送的intent對象。隨後系統會嘗試重新創建service,由於服務狀態為開始狀態,所以創建服務後一定會調用onStartCommand(Intent,int,int)方法。如果在此期間沒有任何啟動命令被傳遞到service,那麼參數Intent將為null。
START_NOT_STICKY:「非粘性的」。使用這個返回值時,如果在執行完onStartCommand後,服務被異常kill掉,系統不會自動重啟該服務。
START_REDELIVER_INTENT:重傳Intent。使用這個返回值時,如果在執行完onStartCommand後,服務被異常kill掉,系統會自動重啟該服務,並將Intent的值傳入。
START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保證服務被kill後一定能重啟。
現在的安卓手機,只要一長按home鍵,通常都會列出近期任務,這里可以幹掉所有進程
所以一直不斷的在後台運行是不行的,但是你可以通常廣播來激活你的service