androidservice開啟
㈠ Android中Service的生命周期與啟動方法有什麼區別
● startService():開啟Service,調用者退出後Service仍然存在。
● bindService():開啟Service,調用者退出後Service也隨即退出。
Service生命周期:
● 只是用startService()啟動服務:onCreate() -> onStartCommand() -> onDestory
● 只是用bindService()綁定服務:onCreate() -> onBind() -> onUnBind() -> onDestory
● 同時使用startService()啟動服務與bindService()綁定服務:onCreate() -> onStartCommand() -> onBind() -> onUnBind() -> onDestory
㈡ Android中如何啟用Service,如何停用Service
• Context.startService()
• Context.bindService()
1. 在同一個應用任何地方調用 startService() 方法就能啟動 Service 了,然後系統會回調 Service 類的
onCreate() 以及 onStart() 方法。這樣啟動的 Service 會一直運行在後台,直到
Context.stopService() 或者 selfStop() 方法被調用。另外如果一個 Service 已經被啟動,其他代碼再試圖調用
startService() 方法,是不會執行 onCreate() 的,但會重新執行一次 onStart() 。
2. 另外一種 bindService() 方法的意思是,把這個 Service 和調用 Service
的客戶類綁起來,如果調用這個客戶類被銷毀,Service 也會被銷毀。用這個方法的一個好處是,bindService() 方法執行後
Service 會回調上邊提到的 onBind() 方發,你可以從這里返回一個實現了 IBind
介面的類,在客戶端操作這個類就能和這個服務通信了,比如得到 Service 運行的狀態或其他操作。如果 Service
還沒有運行,使用這個方法啟動 Service 就會 onCreate() 方法而不會調用 onStart()。
總結:
1.
startService()的目的是回調onStart()方法,onCreate()
方法是在Service不存在的時候調用的,如果Service存在(例如之前調用了bindService,那麼Service的onCreate方法
已經調用了)那麼startService()將跳過onCreate() 方法。
2.
bindService()目的是回調onBind()方法,它的作用是在Service和調用者之間建立一個橋梁,並不負責更多的工作(例如一個
Service需要連接伺服器的操作),一般使用bindService來綁定到一個現有的Service(即通過StartService啟動的服
務)。
由於Service 的onStart()方法只有在startService()啟動Service的情況下才調用,故使用onStart()的時候要注意這點。
㈢ Android中服務service
本文原文連接 https://blog.csdn.net/wen20102321/article/details/53155736
Service是Android中的四大組件之一,它的級別和Activity差不多。只不過Service沒有頁面顯示,只能後台運行,可以和其他組件進行交互。
Service的後台運行並不是子線程,是在主線程中進行的,只是它沒有界面顯示。如果Service進行了耗時操作同樣需要開啟子線程,否則會跟Activity一樣出現ANR問題(application not response–程序沒有響應)。
補充說明:
主線程的內容包括UI和後台,只要程序中的UI或者後台其中一個在跑,程序都算是在運行狀態。
1,創建一個自己的TestService繼承Service
2,必須實現重寫其中的onBind方法,可以在里邊做各種操作,也可以接收傳遞過來的Intent的數據。
(在Android Studio中可以直接新建一個Service)
服務的注冊是四大組件中最簡單的一個,一般只要設置name屬性就可以了。
1,startService()啟動
(1)啟動服務startService:onCerate(),onStart()
(2)停止服務stopService:onDestroy()
此方法啟動服務,服務如果未被創建,系統會先調用onCreate()方法,接著調用onStrat()方法。如果調用startService前服務已經被啟動,多次調用啟動方法,不會多次調用onCreate,但會導致多次調用onStrat。
2,bindService()啟動
(1)綁定bindService:onCreate(),onBind()
(2)解除綁定unbindService:onUnbind()
(3)正常停止程序服務的方法是先接觸綁定unbindService,在停止服務stopService
綁定後調用stopService方法,這時候是不能停止服務的,如果這時再調用解綁unbindService,程序會先解綁,後停止服務。
用此方法啟動服務,在服務未被創建時,會先調用onCreate(),接著調用onBind()方法,這時候調用者和服務綁定在一起,調用者退出,系統會先調用服務的onUnbind(),然後onDestroy()。如果調用bindService之前服務已經被綁定,多次調用bindService並不會導致onCreate()和onBind()方法被多次調用。如果調用者想與正在綁定的服務解除綁定,可以調用unbindService()。
(1),onCerate()服務第一次被創建
(2),onStartComand()服務開始工作
(3),onBind()服務已經綁定
(4),onUnBind()服務解綁
(5),onDestroy()服務已經停止
普通的Service進行耗時操作要創建一個線程去完成,因為service是在主線程運行的,並且這個子線程完成工作要手動停止 。IntentService是繼承了Service並處理起步請求的一個類,在IntentService內有一個工作線程,來處理耗時操作,啟動IntentService的方式和啟動傳統的Service是一樣,當任務執行完成後,IntentService會自動停止,而不需要我們去控制。
可以啟動多次IntentService,每一個耗時操作會以工作隊列的方式在IntentService的onHandleIntent回調方法中執行,並且每次只會執行一個工作線程,執行完第一個再執行第二個,以此類推,而且,所有請求都在一個單線程中,不會阻塞主線程,同一時間只處理一個請求。
IntentService優點
1,省去了在Service中開線程的麻煩
2,當操作完成時,不用手動停止Service。IntentService是Service,但是比Service更智能。
㈣ Android 啟動後台運行程序(Service)
Android開發中,當需要創建在後台運行的程序的時候,就要使用到Service。Service 可以分為有無限生命和有限生命兩種。
特別需要注意的是Service跟Activities是不同的(簡單來說可以理解為後台與前台的區別),例如,如果需要使用Service的話,需要調用startService(),從而利用startService()去調用Service中的OnCreate()和onStart()方法來啟動一個後台的Service。
啟動一個Service的過程如下:context.startService() ->onCreate()- >onStart()->Service running其中onCreate()可以進行一些服務的初始化工作,onStart()則啟動服務。
停止一個Service的過程如下:context.stopService() | ->onDestroy() ->Service stop
接下來的實例是一個利用後台服務播放音樂的小例子,點擊start運行服務,點擊stop停止服務。ServicesDemo.java(是一個Activity)
除此之外還要在Manifest裡面聲明服務:(AndroidManifest.xml)
定義Service(MyService.java)
layout文件夾中是main.xml
values 文件夾中是strings.xm
㈤ android7.0 怎樣啟動service
安卓7.0開啟夜間模式介紹: Android 7.0正式版已經發布,然而此前在開發者預覽版中的一些功能遭到了閹割,最終沒有在正式版中加入,其中之一便是夜間模式。而實際上,安卓7.0正式版中是有這個功能的,只不過被谷歌隱藏了而已。 Reddit網站上的帖子表示,安卓7.0正式版隱藏了夜間模式的功能,可通過一些ADB命令開啟,但普通消費者並不懂怎樣使用ADB命令,現在有開發者專門開發了一個開啟安卓7.0隱藏夜間模式的APP,放在谷歌商店供下載。 用戶只需要安裝這款APP,然後點擊打開夜間模式功能按鈕,之後去快速啟動欄按住設置圖標,進入系統調諧器界面開啟夜間模式功能即可。 值得一提的是,通過安卓6.0.1升級到Android 7.0牛軋糖的用戶無法使用以上方法打開夜間模式,只有從以前的開發者預覽版升級到Android 7.0牛軋糖正式版的手機才可以。 既然夜間模式的代碼仍然在安卓7.0正式版中,我們估計谷歌會在未來合適的時候正式放開這個功能。
㈥ 安卓怎麼自動啟動service
1、首先創建一個廣播接收者,重構其抽象方法onReceive(Context context, Intent intent),在其中啟動你想要啟動的Service。import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class BootBroadcastReceiver extends BroadcastReceiver {
//重寫onReceive方法
@Override
public void onReceive(Context context, Intent intent) {
//後邊的XXX.class就是要啟動的服務
Intent service = new Intent(context,XXXclass);
context.startService(service);
Log.v("TAG", "開機自動服務自動啟動.....");
}
}
配置xml文件,在receiver接收這種添加intent-filter配置
<receiver android:name="BootBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</receiver>
添加許可權處理
<!--此許可權在高版本中可以省略,你可以測試-->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
創建你需要啟動的service處理(的XXX)類,並在androidMainfest.xml文件中添加(XXX)service的配置即可。
㈦ Android如何啟用Service,如何停用Service。
1.第一種是通過調用Context.startService()啟動,調用Context.stopService()結束,startService()可以傳遞參數給Service
2.第二種方式是通過調用Context.bindService()啟動,調用Context.unbindservice()結束,還可以通過ServiceConnection訪問Service。
在Service每一次的開啟關閉過程中,只有onStart可被多次調用(通過多次startService調用),其他onCreate,onBind,onUnbind,onDestory在一個生命周期中只能被調用一次。
㈧ Android 開機自啟動service實踐
Android 設備啟動的時候,會發送android.intent.action.BOOT_COMPLETED的廣播,監聽這個廣播來實現開機自啟動。
1) 創建需要的service和 BroadcastReceiver
2) 在AndroidManifest.xml 注冊service 和BroadcastReceiver
3)申明許可權
```
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
}
㈨ Android Service啟動方式
1.startService
①.定義一個類繼承service
②.在manifest.xml文件中配置該service
③.使用context的startService(intent)啟動該service
④.不再使用時,調用stopService(Intent)停止該服務
2.bindService
①.創建bindService服務段,繼承自service並在類中,創建一個實現binder介面的實例對象並提供公共方法給客戶端調用
②.從onbind()回調方法返回此binder實例
③.在客戶端中,從onserviceconnected()回調方法接收binder,並使用提供的方法調用綁定服務
㈩ Android重學系列 Service 啟動和綁定原理
我們已經了解了BroadcastReceiver的原理,我們再來看看四大組件之一的Service是怎麼啟動的,以及怎麼運行的原理。
如果遇到什麼問題可以來到 https://www.jianshu.com/p/c4927c0b80a9 本文下進行交流
啟動Service的入口就是startService和bindService方法。我們先來看看startService在ContextImpl中做了什麼。
文件:/ frameworks / base / core / java / android / app / ContextImpl.java
此時調用的就是AMS的startService方法。
mServices是一個ActiveServices對象。這個對象是在AMS的構造函數中初始化好的。
這里調用了ActiveServices的startServiceLocked。
文件:/ frameworks / base / services / core / java / com / android / server / am / ActiveServices.java
核心流程有如下三個:
注意這里addToStarting是一個比較關鍵的判斷,addToStarting默認為false。
如果此時不是啟動前台服務,則需要進一步進行處理。如果ProcessRecord為空或者curProcState大於PROCESS_STATE_RECEIVER這個優先順序數值;也就是優先順序更小。
為了避免此時App應用是沒有任何的前台ui,或者App應用還沒有聲明。避免有的App通過startService進行應用的包活或者拉起應用。就會進行如下能夠存在的最大後台服務數量,則放入mDelayedStartList中進行延時啟動後台服務,現在直接返回了。
不然則說明能夠允許啟動後台服務, 就設置為addToStarting為true。
通過ComponentName也就是包名和類名查找ServiceRecord;通過Intent意圖過濾找到ServiceRecord。·
核心方法是bringUpServiceLocked。如果bringUpServiceLocked返回了異常,就返回一個特殊的ComponentName對象。
addToStarting為true,說明此時是一個能夠啟動的後台服務,則ServiceRecord添加到mStartingBackground中。如果mStartingBackground的數量為0,則直接調用ServiceMap的rescheleDelayedStartsLocked啟動後台服務。
這幾個關鍵的步驟,讓我們依次的考察,先來看看scheleCreateService中做了什麼。
如果第一次啟動就走第一個if的分支:
能看到和BroadcastReceiver的ANR思路一樣,通過一個延時的Handler,如果達到時間了還沒有移除這個Handler消息則報ANR異常。
這里根據啟動前台和後台分為兩種超時時間:
前台分別是10秒,後台服務不屬於後台進程組(判斷adj是否在SCHED_GROUP_BACKGROUND)是20秒,後台服務屬於後台進程組 200秒。
把數據封裝成CreateServiceData後,通過Handler調用如下方法:
透三點的核心原理可以看我寫的的Application創建和BroadcastReceiver原理兩篇文章。來看看Service中都做了什麼?
很簡單就是保存了傳遞過來的參數,值得注意的是這個IBinder對象其實就是指ServiceRecord對象。
接著執行Service.onCreate這個空實現的方法。
本質上還是調用了ActiveServices的serviceDoneExecutingLocked方法。
type是SERVICE_DONE_EXECUTING_ANON,所不會做更多的處理。 最後執行了serviceDoneExecutingLocked方法。
這個方法不斷的循環遍歷List<ServiceStartArgs>分發SERVICE_ARGS消息,這個消息通過主線程的Looper調用handleServiceArgs。
bindService在開發中用的不是很多,這里稍微提一下他的使用。
首先申明一個ServiceConnection對象,用於綁定服務端的Service。
調用bindService的方法綁定到某個Service中。當服務端的service成功回調onBind方法,我們只需要返回對應的Binder對象。就能使用調用bindService的客戶端在ServiceConnection的onServiceConnected的回調中獲得Binder對象。
之後就能通過這個Binder調用本進程或者其他進程的的方法了。實際上我們可以把這個過程看成一個多對多的服務-客戶端模型。多個客戶端通過Binder向多服務端Service通信,每一次我們都可以通過ComponentName判斷不同服務返回來的Binder對象。
這裡面很簡單,和BroadcastReceiver的思路很像。動態注冊的BroadcastReceiver會封裝成一個ReceiverDispatcher,而這里把ServiceConnection封裝成LoadedApk.ServiceDispatcher對象。
並且會把ServiceDispatcher作為value,ServiceConnection作為key緩存一個map中。並且以context為key,把這個臨時的map作為value緩存起來。這樣一個Context就映射有了多個ServiceDispatcher對象,也就可以注冊多個監聽被綁定Service狀態的監聽者了。