『壹』 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
『貳』 如何讓android的service一直在後台運行
按使用方式分類:
類別 區別
startService 啟動的服務 主要用於啟動一個服務執行後台任務,不進行通信。停止服務使用stopService
bindService 啟動的服務 該方法啟動的服務要進行通信。停止服務使用unbindService
startService 同時也 bindService 啟動的服務 停止服務應同時使用stepService與unbindService
以上面三種方式啟動的服務其生命周期也有區別,將在隨後給出。
2、Service 與 Thread 的區別
很多時候,你可能會問,為什麼要用 Service,而不用 Thread 呢,因為用 Thread 是很方便的,比起 Service
也方便多了,下面我詳細的來解釋一下。
1). Thread:Thread 是程序執行的最小單元,它是分配CPU的基本單位。可以用 Thread 來執行一些非同步的操作。
2). 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 做不到的。
3、Service的生命周期1). 被啟動的服務的生命周期:如果一個Service被某個Activity 調用 Context.startService
方法啟動,那麼不管是否有Activity使用bindService綁定或unbindService解除綁定到該Service,該Service都
在後台運行。如果一個Service被startService
方法多次啟動,那麼onCreate方法只會調用一次,onStart將會被調用多次(對應調用startService的次數),並且系統只會創建
Service的一個實例(因此你應該知道只需要一次stopService調用)。該Service將會一直在後台運行,而不管對應程序的
Activity是否在運行,直到被調用stopService,或自身的stopSelf方法。當然如果系統資源不足,android系統也可能結束服 務。
2). 被綁定的服務的生命周期:如果一個Service被某個Activity 調用 Context.bindService 方法綁定啟動,不管調用
bindService 調用幾次,onCreate方法都只會調用一次,同時onStart方法始終不會被調用。當連接建立之後,Service將會一直運行,除非調用
Context.unbindService 斷開連接或者之前調用bindService 的 Context
不存在了(如Activity被finish的時候),系統將會自動停止Service,對應onDestroy將被調用。
3).
被啟動又被綁定的服務的生命周期:如果一個Service又被啟動又被綁定,則該Service將會一直在後台運行。並且不管如何調用,onCreate
始終只會調用一次,對應startService調用多少次,Service的onStart便會調用多少次。調用unbindService將不會停止
Service,而必須調用 stopService 或 Service的 stopSelf 來停止服務。
4). 當服務被停止時清除服務:當一個Service被終止(1、調用stopService;2、調用stopSelf;3、不再有綁定的連接(沒有被啟
動))時,onDestroy方法將會被調用,在這里你應當做一些清除工作,如停止在Service中創建並運行的線程。
特別注意:
1、你應當知道在調用 bindService 綁定到Service的時候,你就應當保證在某處調用 unbindService 解除綁定(盡管
Activity 被 finish 的時候綁定會自動解除,並且Service會自動停止);
2、你應當注意 使用 startService 啟動服務之後,一定要使用
stopService停止服務,不管你是否使用bindService;
3、同時使用 startService 與 bindService 要注意到,Service
的終止,需要unbindService與stopService同時調用,才能終止 Service,不管 startService 與 bindService
的調用順序,如果先調用 unbindService 此時服務不會自動終止,再調用 stopService 之後服務才會停止,如果先調用 stopService
此時服務也不會終止,而再調用 unbindService 或者 之前調用 bindService 的 Context 不存在了(如Activity 被
finish 的時候)之後服務才會自動停止;
4、當在旋轉手機屏幕的時候,當手機屏幕在「橫」「豎」變換時,此時如果你的 Activity 如果會自動旋轉的話,旋轉其實是 Activity
的重新創建,因此旋轉之前的使用 bindService 建立的連接便會斷開(Context 不存在了),對應服務的生命周期與上述相同。
5、在 sdk 2.0 及其以後的版本中,對應的 onStart 已經被否決變為了 onStartCommand,不過之前的 onStart
任然有效。這意味著,如果你開發的應用程序用的 sdk 為 2.0 及其以後的版本,那麼你應當使用 onStartCommand 而不是 onStart。
4、startService 啟動服務
想要用 startService 啟動服務,不管Local 還是 Remote 我們需要做的工作都是一樣簡單。當然要記得在
Androidmanifest.xml 中注冊 service。
根據上面的生命周期,我們便會給出 Service 中的代碼框架:
package com.newcj.test;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class LocalService1 extends Service {
/**
* onBind 是 Service 的虛方法,因此我們不得不實現它。
* 返回 null,表示客服端不能建立到此服務的連接。
*/
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
對應生命周期系統回調函數上面已經說明,在對應地方加上適當的代碼即可。下面是啟動與停止 Service 的代碼:
// 啟動一個 Activity
startActivity(new Intent(this, LocalService1.class));
...
// 停止一個 Activity
stopService(new Intent(this, LocalService1.class));
對應的 Intent 為標志服務類的 Intent。
5、Local 與 Remote 服務綁定
同樣記得在 Androidmanifest.xml 中注冊 service
1). Local 服務綁定:Local 服務的綁定較簡單,首先在 Service 中我們需要實現 Service 的抽象方法
onBind,並返回一個實現 IBinder 介面的對象。
Service 中的代碼:
package com.newcj.test;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
public class LocalService extends Service {
/**
* 在 Local Service 中我們直接繼承 Binder 而不是 IBinder,因為 Binder 實現了 IBinder
介面,這樣我們可以少做很多工作。
* @author newcj
*/
public class SimpleBinder extends Binder{
/**
* 獲取 Service 實例
* @return
*/
public LocalService getService(){
return LocalService.this;
}
public int add(int a, int b){
return a + b;
}
}
public SimpleBinder sBinder;
@Override
public void onCreate() {
super.onCreate();
// 創建 SimpleBinder
sBinder = new SimpleBinder();
}
@Override
public IBinder onBind(Intent intent) {
// 返回 SimpleBinder 對象
return sBinder;
}
}
上面的代碼關鍵之處,在於 onBind(Intent) 這個方法 返回了一個實現了 IBinder 介面的對象,這個對象將用於綁定Service 的
Activity 與 Local Service 通信。下面是 Activity 中的代碼:
package com.newcj.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.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
public class Main extends Activity {
private final static String TAG = "SERVICE_TEST";
private ServiceConnection sc;
private boolean isBind;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sc = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
LocalService.SimpleBinder sBinder = (LocalService.SimpleBinder)service;
Log.v(TAG, "3 + 5 = " + sBinder.add(3, 5));
Log.v(TAG, sBinder.getService().toString());
}
};
findViewById(R.id.btnBind).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
bindService(new Intent(Main.this, LocalService.class), sc,
Context.BIND_AUTO_CREATE);
isBind = true;
}
});
findViewById(R.id.btnUnbind).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(isBind){
unbindService(sc);
isBind = false;
}
}
});
}
}
在 Activity 中,我們通過 ServiceConnection 介面來取得建立連接 與
連接意外丟失的回調。bindService有三個參數,第一個是用於區分 Service 的Intent 與 startService 中的 Intent
一致,第二個是實現了 ServiceConnection 介面的對象,最後一個是 flag 標志位。有兩個flag,BIND_DEBUG_UNBIND 與
BIND_AUTO_CREATE,前者用於調試(詳細內容可以查看javadoc 上面描述的很清楚),後者默認使用。unbindService
解除綁定,參數則為之前創建的 ServiceConnection 介面對象。另外,多次調用 unbindService
來釋放相同的連接會拋出異常,因此我創建了一個 boolean 變數來判斷是否 unbindService 已經被調用過。
運行結果:
2). Remote 服務綁定:Remote 的服務綁定由於服務是在另外一個進程,因此需要用到 android 的 IPC
機制。這將又是一個很長的話題,因此,我打算寫另外一篇 android 的 IPC 機制分析 ,並在其中進行詳述,然後在這里更新鏈接,敬請關注。
特別注意:
1、Service.onBind如果返回null,則調用 bindService 會啟動 Service,但不會連接上 Service,因此
ServiceConnection.onServiceConnected 不會被調用,但你任然需要使用 unbindService 函數斷開它,這樣
Service 才會停止。
6、創建前台服務
前台服務的優點上面已經說明,但設置服務為前台服務,我們需要注意在 sdk 2.0 及其以後版本使用的方法是 startForeground 與
stopForeground,之前版本使用的是 setForeground ,因此如果你應用程序的最低運行環境要求是
2.0,那麼這里可以直接運用新方法,如果運行環境是2.0以下,那麼為了保證向後兼容性,這里必須使用反射技術來調用新方法。
下面是我仿照 ApiDemos 重新敲的代碼,對某些地方進行了修改,因此更具有說明性:
特別注意:
1、使用 startForeground ,如果 id 為 0 ,那麼 notification 將不會顯示。
7、在什麼情況下使用 startService 或 bindService 或 同時使用startService 和 bindService
如果你只是想要啟動一個後台服務長期進行某項任務那麼使用 startService 便可以了。如果你想要與正在運行的 Service
取得聯系,那麼有兩種方法,一種是使用 broadcast ,另外是使用 bindService ,前者的缺點是如果交流較為頻繁,容易造成性能上的問題,並且
BroadcastReceiver 本身執行代碼的時間是很短的(也許執行到一半,後面的代碼便不會執行),而後者則沒有這些問題,因此我們肯定選擇使用
bindService(這個時候你便同時在使用 startService 和 bindService 了,這在 Activity 中更新 Service
的某些運行狀態是相當有用的)。另外如果你的服務只是公開一個遠程介面,供連接上的客服端(android 的 Service
是C/S架構)遠程調用執行方法。這個時候你可以不讓服務一開始就運行,而只用 bindService ,這樣在第一次 bindService
的時候才會創建服務的實例運行它,這會節約很多系統資源,特別是如果你的服務是Remote Service,那麼該效果會越明顯(當然在 Service
創建的時候會花去一定時間,你應當注意到這點)。
8、在 AndroidManifest.xml 里 Service 元素的常見選項
android:name-------------服務類名
android:label--------------服務的名字,如果此項不設置,那麼默認顯示的服務名則為類名
android:icon--------------服務的圖標
android:permission-------申明此服務的許可權,這意味著只有提供了該許可權的應用才能控制或連接此服務
android:process----------表示該服務是否運行在另外一個進程,如果設置了此項,那麼將會在包名後面加上這段字元串表示另一進程的名字
android:enabled----------如果此項設置為 true,那麼 Service 將會默認被系統啟動,不設置默認此項為
false
android:exported---------表示該服務是否能夠被其他應用程序所控制或連接,不設置默認此項為 false
『叄』 Android 初學者 關於app關閉service一直運行 求各位指點迷津
Android5.0之前可以用雙守護進程 fork一個子進程來守護主進程
白名單,微信QQ等等之所以能夠存活,是因為系統商給了騰訊白名單,你調用清理內存時,並沒有真正的清理
『肆』 安卓系統的app,我需要它一直在後台運行,我該怎麼加鎖才可以 關閉其
若是vivo手機,允許軟體一直在後台運行 :
1、進入設置--電池--後台耗電管理--對應軟體--選擇「允許後台高耗電」(部分機型需進入設置--電池--後台高耗電--將對應的軟體開啟);
2、可以進入i管家--應用管理/軟體管理--許可權管理--許可權--自啟動--開啟軟體的自啟許可權;
3、進入多任務卡片界面,下拉軟體加入到加速白名單;
可以參考設置加速白名單的方法:
OriginOS系統:調出卡片式後台,按住後台軟體下滑即可加入白名單;
FuntouchOS10/iQOOUI及以上系統:調出卡片式後台,可按住卡片下拉鎖定,也可以點右上角「=」圖標--選擇鎖定;
FuntouchOS10以下系統:先調出快捷欄,然後按住需要設置白名單的軟體向下拉,點擊該軟體上方的鎖狀圖標,該軟體即會加入白名單。
註:加入白名單後,後台軟體右上角會顯示鎖狀圖標。
4、若軟體被隱藏了,請把軟體取消隱藏或移出原子隱私系統。
註:若是出現因軟體異常佔用內存,被智慧引擎強行關閉的情況,則是軟體自身原因不支持設置。
更多疑惑,可以進入vivo官網--點擊我的—在線客服,輸入「人工」聯系在線客服處理。
『伍』 如何讓android的service一直在後台運行
首先來說,android是不存在一直運行後台服務的。而且,後天一直運行,就會消耗很大的手機資源的,因此也會影響手機的其他程序的使用的。
需要注意的事,手機系統運行的問題,以上的方法都是建立在手機系統夠大的時候才行的。要不就會被很輕易的就清理掉了。
以上就是我的回答,希望可以幫到題主。
『陸』 Android 之 Service(一)啟動,綁定服務
Service(服務)一個運行在後台執行長時間運行的操作組件,它不提供任何用戶界面,作為與Activity同級的組件,它依舊是運行在主線程中。
其它組件可以啟動一個Service,當這個Service啟動之後便會在後台執行,這里需要注意,由於是在主線程中,所以我們需要另外開啟一個線程來執行我們的耗時操作。
此外,一個組件還可以與一個Service進行綁定來實現組件之間的交互,甚至可以執行IPC(Inter-Process Communication)進程間通信。
Service可以在後台執行很多任務,比如處理網路事務,播放音樂,文件讀寫或者與一個內容提供者交互,等等。
本地服務(Local)
該服務依附在主進程上而不是獨立的進程,這樣在一定程度上節約了資源,另外本地服務因為是在同一進程因此不需要IPC,也不需要AIDL。相應bindService會方便很多,當主進程被Kill後,服務便會終止。一般使用在音樂播放器播放等不需要常駐的服務。
遠程服務(Remote Service)
該服務是獨立的進程,對應進程名格式為所在包名加上你指定的android:process字元串。一般定義方式 android:process=":service" 由於是獨立的進程,因此在Activity所在進程被Kill的時候,該服務依然在運行,不受其他進程影響,有利於為多個進程提供服務具有較高的靈活性。由於是獨立的進程,會佔用一定資源,並且使用AIDL進行IPC比較麻煩。一般用於系統的Service,這種Service是常駐的。
startService啟動的服務
用於啟動一個服務執行後台任務,不與組件進行通信,停止服務使用stopService。 當一個應用組件比如activity通過調用startService()來啟動一個服務的時候,服務便處於啟動狀態。一旦啟動,服務可以在後台無限期地運行下去,即使當啟動它的組件已經銷毀。通常情況下,一個啟動的service執行一個單一的操作並且不會返回任何結果給調用者。
bindService啟動的服務
用於啟動的服務需要進行通信。停止服務使用unbindService。 當一個應用組件通過調用bindService()來與一個服務綁定時,服務便處於綁定狀態。一個綁定的服務提供了一個客戶端-伺服器端介面來允許組件與服務進行交互,發送請求,得到結果甚至通過IPC進程間通信來完成操作。只有當其它組件與服務進行綁定時,服務才會處於綁定狀態。多個組件可以同時與服務綁定,但是當他們全部都解除綁定時,服務就會銷毀。
2.BindService:
如果一個Service在某個Activity中被調用bindService方法啟動,不論bindService被調用幾次,Service的 onCreate 方法只會執行一次,同時 onStartCommand 方法始終不會調用。當建立連接後,Service會一直運行,除非調用unbindService來接觸綁定、斷開連接或調用該Service的Context不存在了(如Activity被Finish——即通過bindService啟動的Service的生命周期依附於啟動它的Context),系統在這時會自動停止該Service。
3.StartService AND BindService:
當一個Service在被啟動(startService 的同時又被綁定(bindService ),該Service將會一直在後台運行,並且不管調用幾次, onCreate 方法始終只會調用一次, onStartCommand 的調用次數與startService 調用的次數一致(使用bindService 方法不會調用 onStartCommand )。同時,調用unBindService 將不會停止Service,必須調用stopService 或Service自身的stopSelf 來停止服務。
4.停止Service:
當一個服務被終止(stopService 、stopSelf 、unbindService )時, onDestory 方法將會被調用——所以我們需要在該方法中清除一些工作(依附該Service生命周期上的,比如:停止在Service中創建並運行的線程)。
1.創建服務
如果你才用的是 startService的方式那麼 onBind方法可以忽略
2.注冊服務
3.開啟服務
start:
bind
綁定服務,一般涉及到組件或進程之間的通信,既然需要通信,那麼我們肯定需要一個連接,這里ServiceConnection就是我們所需要的連接,通過Ibinder的傳遞,我們可以獲取到Service的Ibinder對象,從而進行相關操作。
關於粘性服務,這里需要提到 Service的onStartCommand返回值
andorid:name
adroid:exported
android:enabled
android:label
android:process
android:icon
android:permission
關於服務,當我們在應用開發中,如果需要長時間的在後台運行,獨立完成某一些事情的情況下,請使用Service!
此文綜合: http://www.jianshu.com/p/1e49e93c3ec8 以及自己的一些問題看法,用作學習,回顧之用。
Service 前台服務
請參看 紫豪 http://www.jianshu.com/p/5505390503fa