當前位置:首頁 » 安卓系統 » android常駐服務

android常駐服務

發布時間: 2022-12-06 15:41:03

A. 如何讓Android Service不被清除或者常駐內存

你可以在service的ondestroy裡面再次啟動,或者監聽手機屏幕變化,只要操作手機你就再次啟動服務

B. 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

C. Android後台進程保活方案

思想: 使用 Linux 中的 fork 機制創建 Native 進程,在 Native 進程中監控主進程的存活,當主進程掛掉後,在 Native 進程中立即對主進程進行拉活。

原理: 在 Android 中所有進程和系統組件的生命周期受 ActivityManagerService 的統一管理。Android5.0以下通過 Linux 的 fork 機制創建的進程為純 Linux 進程,其生命周期不受 Android 的管理。

該方案主要適用於 Android5.0 以下版本手機。

該方案不受 forceclose 影響,被強制停止的應用依然可以被拉活,在 Android5.0 以下版本拉活效果非常好。
詳情

對於 Android5.0 以上手機,系統雖然會將native進程內的所有進程都殺死,這里其實就是系統「依次」殺死進程時間與拉活邏輯執行時間賽跑的問題,如果可以跑的比系統邏輯快,依然可以有效拉起。在 某些 Android 5.0 以上機型有效。
詳情

https://github.com/Marswin/MarsDaemon

作者5.0以下系統用一個java進程和一個fork出來的純native進程雙管道互鎖監聽對方的狀態,無論哪個被殺後都拉起第三個進程,第三個進程來拉活常駐進程,實現拉活。
5.0以上同一進程組的進程會被同時殺死,所以5.0以上使用雙java進程在native層互鎖文件實現監聽,但任務管理器會在短時間內殺死所有進程,只能用反射提前初始化pacel,在進程被殺的時候和系統搶那幾十毫秒的時間發送一個拉活的廣播。用4個文件來讓兩個進程實現互鎖來做監聽,但實際效果很一般,測試了幾個5.0以上的國產機型都不行,效果是根本監聽不到進程被殺,目測原因是當任務管理器查殺進程的時候將所有的進程都掛起了,隨後全部殺掉,並在一段時間內禁止進程啟動。

PersistedJobService.java

BootReceiver.java靜態注冊BroadcastReceiver

注冊,開機,網路切換、拍照、拍視頻時候,利用系統產生的廣播也能喚醒app,不過Android N已經將這三種廣播取消了

常用的拉活許可權

BackgroundService.java
WakeLock

作為前台應用運行,提高應用存活幾率

service被關掉後自動啟動

START_STICKY
如果系統在onStartCommand返回後被銷毀,系統將會重新創建服務並依次調用onCreate和onStartCommand(注意:根據測試Android2.3.3以下版本只會調用onCreate根本不會調用onStartCommand,Android4.0可以辦到),這種相當於服務又重新啟動恢復到之前的狀態了)。

START_NOT_STICKY
如果系統在onStartCommand返回後被銷毀,如果返回該值,則在執行完onStartCommand方法後如果Service被殺掉系統將不會重啟該服務。

START_REDELIVER_INTENT
START_STICKY的兼容版本,不同的是其不保證服務被殺後一定能重啟。

service注冊,許可權設置為高優先順序

KeepAliveService.java
注冊,在新的獨立進程內啟動,適用5.0以下的原生系統,5.0以上同樣會被殺死

他的局限性在於:
第一,用戶會在系統設置的賬戶列表裡面看到一個不認識的賬戶;
第二,同步的事件間隔是有限制的,最短1分鍾,見源碼,如果小雨60秒,置為60秒。而且各種國產機怎麼改的源碼我們未可知,是不是都能用仍然未可知;
第三,很致命,某些手機比如note3需要手動設置賬戶,你如何騙你的用戶給你手動設置賬戶完了之後不卸載你;
第四,也很致命,必須聯網!google提供這個組件是讓你同步賬戶信息,不聯網你同步個鬼,我們要保活,可以不聯網不做事,但是不能不聯網就死

集成三方推送平台sdk,友盟極光等

D. Android 使用MarsDaemon進程常駐

在特定的業務場景中,我們可能會需要app在後台做一些事情,比如上傳數據之類的操作,並且希望這種操作及時在程序退出之後依然可以繼續進行。因此也就理所當然的想到了使用Service進行處理。 但是 ,在特定條件(app進入後台+設備內存不足+進程佔用的內存足夠大)的情況下,Service會非常容易在幾分鍾內被系統幹掉,因此提高Service的存活率至關重要。

此方法企圖利用Service是生命周期去調用其本身,事實證明這種方法是無效的,在進程被殺死時,Service根本不會執行onDestroy就被直接清出內存了,因此靠自身的力量提高存活率的方式也就不可行了。

導入項目之後

之後不要忘記導入mole

此處將process1作為主要進程,process2作為守護進程。MainService中執行主要的業務邏輯,Receiver1、GuardService、Receiver2都是額外創建的,裡面不要做任何事情,都是空實現就好。

由於我們的Application一般都會集成其他的Application,因此需要在attachBaseContext中初始化DaemonClient,然後調用onAttachBaseContext即可實現

使用Marsdaemon提高Service存活率的方式雖然有一定效果,但是在Android5.0之後的版本中,並不可靠,並且還有如下幾個缺陷。

因此,Marsdaemon不應是大家頻繁使用的功能,特殊情況下可以應急即可。

E. android後台服務保持,不被殺死

作者:閉關寫代碼
鏈接:https://www.hu.com/question/29826231/answer/71207109
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。

強烈建議不要這么做,不僅僅從用戶角度考慮,作為Android開發者也有責任去維護Android的生態環境。現在很多Android開發工程師,主力機居然是iPhone而不是Android設備,感到相當悲哀。
從技術角度概括一下現在普遍的防殺方法

Service設置成START_STICKY,kill 後會被重啟(等待5秒左右),重傳Intent,保持與重啟前一樣
通過 startForeground將進程設置為前台進程,做前台服務,優先順序和前台應用一個級別,除非在系統內存非常缺,否則此進程不會被 kill

雙進程Service:讓2個進程互相保護,其中一個Service被清理後,另外沒被清理的進程可以立即重啟進程
QQ黑科技:在應用退到後台後,另起一個只有 1 像素的頁面停留在桌面上,讓自己保持前台狀態,保護自己不被後台清理工具殺死
在已經root的設備下,修改相應的許可權文件,將App偽裝成系統級的應用(Android4.0系列的一個漏洞,已經確認可行)
Android系統中當前進程(Process)fork出來的子進程,被系統認為是兩個不同的進程。當父進程被殺死的時候,子進程仍然可以存活,並不受影響。鑒於目前提到的在Android-Service層做雙守護都會失敗,我們可以fork出c進程,多進程守護。死循環在那檢查是否還存在,具體的思路如下(Android5.0以下可行)
用C編寫守護進程(即子進程),守護進程做的事情就是循環檢查目標進程是否存在,不存在則啟動它。
在NDK環境中將1中編寫的C代碼編譯打包成可執行文件(BUILD_EXECUTABLE)。
主進程啟動時將守護進程放入私有目錄下,賦予可執行許可權,啟動它即可。
聯系廠商,加入白名單
------------------------------------------------------
TIP: 面對各種流氓軟體後台常駐問題,建議使用「綠色守護」來解決,可是殺掉那些第三方清理工具難以清除的後台程序

F. android中service常駐

在AndroidManifest中聲明Activity或者Service時,定義android:process屬性
格式:android:process=":{進程名字}",這樣就能運行在其他進程了
詳見:http://developer.android.com/guide/topics/manifest/service-element.html

當把service跑在其他進程後,就可解決,方法參考1
按推薦做法的話,可以像Google提供的絕大多數服務那樣,使用Content Provider,具體使用方式請自行搜索.另外,可以採用AIDL跟其他進程的Service直接進行通信,我們之前的做法會做一套序列/反序列化的東西在公共Service和其他普通app進行通信(當然也是通過AIDL).至於Service可以不用單獨裝,在你的業務app里捆綁一個小的Service也就可以了

http://segmentfault.com/q/1010000000415917

G. 請教android如何做到service常駐內存

android實現開機自啟動可能是移動操作系統中最簡單的了,我們只需要監聽一個開機啟動的Broadcast(廣播)即可。首先寫一個Receiver(即廣播監聽器),繼承BroadcastReceiver,如下所示:

public class BootReceiver extends BroadcastReceiver {
private PendingIntent mAlarmSender;
@Override
public void onReceive(Context context, Intent intent) {
// 在這里干你想乾的事(啟動一個Service,Activity等),本例是啟動一個定時調度程序,每30分鍾啟動一個Service去更新數據
mAlarmSender = PendingIntent.getService(context, 0, new Intent(context,
RefreshDataService.class), 0);
long firstTime = SystemClock.elapsedRealtime();
AlarmManager am = (AlarmManager) context
.getSystemService(Activity.ALARM_SERVICE);
am.cancel(mAlarmSender);
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime,
30 * 60 * 1000, mAlarmSender);
}
}

接下來,我們只需要在應用程序配置文件AndroidManifest.xml中注冊這個Receiver來監聽系統啟動事件即可,如下所示:
<receiver android:name=".service.BootReceiver">

<intent-filter>
<!-- 系統啟動完成後會調用-->
<action android:name="android.intent.action.BOOT_COMPLETED">
</action>
</intent-filter>
</receiver>

H. 如何讓android的service一直在後台運行

Service組件在android開發中經常遇到,其經常作為後台服務,需要始終保持運行,負責處理一些必要的任務。而一些安全軟體,會有結束進程的功能,如果不做Service的保持,就會被其殺掉。
如何保持Service的運行,其核心就是利用ANDROID的系統廣播,這一不會被其他軟體影響的常駐程序觸發自己的程序檢查Service的運行狀態,如果被殺掉,就再起來。
利用的系統廣播是Intent.ACTION_TIME_TICK,這個廣播每分鍾發送一次,可以每分鍾檢查一次Service的運行狀態,如果已經被結束了,就重新啟動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);
}

I. 求問大神 AndroidDaemon.apk 這個軟體是啥

Android 服務保活/常駐 (Android Service Daemon)
建議只在 App 的核心功能需要保活/常駐時使用。
啟動前台服務而不顯示通知來自於 D-clock 的 AndroidDaemonService,對其他的一些非 native 層保活方法進行了實現。

熱點內容
android開發jni 發布:2023-02-09 10:50:04 瀏覽:233
命令行編譯android 發布:2023-02-09 10:47:04 瀏覽:968
系統下載文件夾 發布:2023-02-09 10:46:26 瀏覽:664
材料中ftp 發布:2023-02-09 10:45:20 瀏覽:235
qq怎麼設手勢密碼 發布:2023-02-09 10:37:28 瀏覽:563
安卓如何增加4k輸出 發布:2023-02-09 10:36:07 瀏覽:363
吉他用壓縮 發布:2023-02-09 10:30:59 瀏覽:524
安卓遙控在哪裡 發布:2023-02-09 10:29:11 瀏覽:163
eclipselinux下載 發布:2023-02-09 10:25:55 瀏覽:304
c語言最厲害的編譯器 發布:2023-02-09 10:24:56 瀏覽:681