摘要:我們這里就來解讀一下注釋上所描述的返回值的作用與效果相同,主要是為了兼容低版本,但是并不能保證每次都重啟成功。對(duì)方法返回不同的返回值導(dǎo)致服務(wù)被殺死的時(shí)候自動(dòng)重啟,這個(gè)重啟次數(shù)只能是一次。感謝方法詭異的返回值中類中返回值介紹
前言
Service 算是四大組件中比較常用的吧,至少比起 Broadcase receiver 跟 Content provider 還算是用的多的,這里用來記錄一些關(guān)于 Service 的小細(xì)節(jié)。
startService 跟 bindService 所導(dǎo)致的生命周期定義一個(gè) Service 跟一個(gè) Activity ,分別如下:
public class MainActivity extends AppCompatActivity { private Intent mIntent; private MyServiceConnection mMyServiceConnection; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mMyServiceConnection = new MyServiceConnection(); mIntent = new Intent(this, MyService.class); } public void startService(View view) { startService(mIntent); } public void unbindService(View view) { unbindService(mMyServiceConnection); } public void bingService(View view) { bindService(mIntent, mMyServiceConnection, BIND_AUTO_CREATE); } public void stopService(View view) { stopService(mIntent); } @Override protected void onDestroy() { super.onDestroy(); Log.e("jiang", "onDestroy"); } class MyServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.e("jiang", "onServiceConnected:"); MyService.MyBinder myBinder = (MyService.MyBinder) service; myBinder.systemOut(); } @Override public void onServiceDisconnected(ComponentName name) { Log.e("jiang", "onServiceDisconnected:"); } } }
public class MyService extends Service { @Override public void onCreate() { super.onCreate(); Log.e("jiang", "onCreate"); } @Override public IBinder onBind(Intent intent) { Log.e("jiang", "onBind"); return new MyBinder(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.e("jiang", "onStartCommand: flags :" + flags + " startId :" + startId); return super.onStartCommand(intent, flags, startId); } @Override public void unbindService(ServiceConnection conn) { super.unbindService(conn); Log.e("jiang", "unbindService"); } @Override public boolean onUnbind(Intent intent) { Log.e("jiang", "onUnbind"); return super.onUnbind(intent); } @Override public void onDestroy() { Log.e("jiang", "onDestroy"); super.onDestroy(); } class MyBinder extends Binder { public void systemOut() { Log.e("jiang", "該方法在MyService的內(nèi)部類MyBinder中"); } } }
(1)、 startService 所走的生命周期:
onCreate onStartCommand: flags :0 startId :1
(2)、stopService 所走的生命周期:
onDestroy
(1)、bindService 所走的生命周期:
onCreate onBind onServiceConnected: 該方法在MyService的內(nèi)部類MyBinder中
(2)、unDindService 所走的生命周期:
onUnbind onDestroy
(1)、 startService 所走的生命周期:
onCreate onStartCommand: flags :0 startId :1
(2)、bindService 所走的生命周期:
onBind onServiceConnected: 該方法在MyService的內(nèi)部類MyBinder中
(3)、stopService 所走的生命周期:
什么也不走
(4)、unBindService 所走的生命周期:
onUnbind
(1)、 startService 所走的生命周期:
onCreate onStartCommand: flags :0 startId :1
(2)、bindService 所走的生命周期:
onBind onServiceConnected: 該方法在MyService的內(nèi)部類MyBinder中
(3)、unBindService 所走的生命周期:
onUnbind
(4)、stopService 所走的生命周期:
onDestroy
(1)、 bindService 所走的生命周期:
onCreate onBind onServiceConnected: 該方法在MyService的內(nèi)部類MyBinder中
(2)、startService 所走的生命周期:
onStartCommand: flags :0 startId :1
(3)、stopService 所走的生命周期:
什么也不走
(4)、unBindService 所走的生命周期:**
onUnbind onDestroy
(1)、 bindService 所走的生命周期:
onCreate onBind onServiceConnected: 該方法在MyService的內(nèi)部類MyBinder中
(2)、startService 所走的生命周期:
onStartCommand: flags :0 startId :1
(3)、unBindService 所走的生命周期:
onUnbind
(4)、stopService 所走的生命周期:
onDestroy
如果 Service 被多次 start ,會(huì)多次調(diào)用 onStartCommand ,并會(huì)給 onStartCommand 參數(shù) startId 傳遞調(diào)用的次數(shù)。
多次調(diào)用 unbindService 會(huì)報(bào) java.lang.IllegalArgumentException: Service not registered: 異常,但是多次 bindService 就沒有任何問題。
如果我們采用的是 startService 開啟一個(gè) Service ,在 Activity 關(guān)閉后,Service 依舊運(yùn)行在系統(tǒng)中。
如果我們采用的是 bindService 開啟一個(gè) Service ,在 Activity 關(guān)閉時(shí)也會(huì)銷毀 Service ,就算你沒有調(diào)用 unBindService 方法。
如果我們 start 并且 bind 一個(gè) Service ,怎么樣才可以銷毀這個(gè) Service 呢?有以下幾種方法:
調(diào)用 stopService 和 unbindService 這兩個(gè)方法,調(diào)用順序不分先后。
先調(diào)用 stopService ,然后再關(guān)閉 Activity 。
Service的 onStartCommand 方法的返回值一般來說,我們重寫 Service 的 onStartCommand 方法都會(huì)返回 super.onStartCommand(intent, flags, startId) ,但這個(gè)默認(rèn)的返回值是啥呢?我們一起到 Service 的源碼中看看:
public @StartResult int onStartCommand(Intent intent, @StartArgFlags int flags, int startId) { onStart(intent, startId); return mStartCompatibility ? START_STICKY_COMPATIBILITY : START_STICKY; }
通過 mStartCompatibility 進(jìn)行三元運(yùn)算法,從而返回不同的值,mStartCompatibility 其實(shí)表示的就是應(yīng)用的 targetSdkVersion 是否小于5。對(duì)于現(xiàn)在的 APP 來說,targetSdkVersion 早就大于5了,所以 mStartCompatibility 自然就為 false ,而 super.onStartCommand(intent, flags, startId) 返回的就是 START_STICKY 。
那么這個(gè)返回值又有什么用呢?說實(shí)話,我寫代碼來驗(yàn)證這個(gè)返回值貌似并不好使,也就是說不像注釋說的那樣牛逼,有時(shí)候會(huì)失效,甚至可以說是大部分都在失效。我們這里就來解讀一下注釋上所描述的返回值的作用:
START_STICKY_COMPATIBILITY :與 START_STICKY 效果相同,主要是為了兼容低版本,但是并不能保證每次都重啟成功。
START_STICKY :進(jìn)程被殺死以后,服務(wù)會(huì)自動(dòng)重啟,并調(diào)用 onStartCommand 方法,但是并不會(huì)保存 intent ,所以需要在 onStartCommand 處理 intent 的話,記得要判空。但是 startId 會(huì)+1。
START_NOT_STICKY :進(jìn)程被殺死以后,服務(wù)并不會(huì)自動(dòng)重啟,就算是重新啟動(dòng) App 也會(huì)不重啟服務(wù)。
START_REDELIVER_INTENT :進(jìn)程被殺死以后,服務(wù)會(huì)被自動(dòng)重啟,onStartCommand 方法會(huì)被調(diào)用,但是 intent 不為空,因?yàn)橄到y(tǒng)保存了上一次服務(wù)被殺死時(shí)的 intent 跟 startId 。
對(duì) onStartCommand 方法返回不同的返回值導(dǎo)致服務(wù)被殺死的時(shí)候自動(dòng)重啟,這個(gè)重啟次數(shù)只能是一次。比如說服務(wù)被殺死一次以后,因?yàn)?onStartCommand 方法的返回值重啟了這個(gè)服務(wù),但是又被殺死了,這個(gè)時(shí)候服務(wù)不會(huì)再次因?yàn)?onStartCommand 方法的返回值重啟服務(wù)了。
短時(shí)間的服務(wù)被多次殺死以后,系統(tǒng)就不愿意為你再重啟這個(gè)服務(wù)了。
感謝Android Service.onStartCommand() 方法
Service: onStartCommand 詭異的返回值
Android中Service類中onStartCommand返回值介紹
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/73921.html
摘要:注意每個(gè)必須在中通過來聲明。執(zhí)行具體的下載任務(wù)接下來我們?cè)谥型ㄟ^來綁定和解除綁定可以看到,這里我們首先創(chuàng)建了一個(gè)的匿名類,在里面重寫了方法和方法,這兩個(gè)方法分別會(huì)在與建立關(guān)聯(lián)和解除關(guān)聯(lián)的時(shí)候調(diào)用。 前言 Hi,大家好,上一期我們講了如何使用BroadcastReceiver,這一期我們講解Android四大組件之Service相關(guān)知識(shí)。每天一篇技術(shù)干貨,每天我們一起進(jìn)步。 耐心專注不僅...
摘要:四大組件都支持這個(gè)屬性。到目前為止,中總共有三種啟動(dòng)方式。返回值方法有一個(gè)的返回值,這個(gè)返回值標(biāo)識(shí)服務(wù)關(guān)閉后系統(tǒng)的后續(xù)操作。,啟動(dòng)后的服務(wù)被殺死,不能保證系統(tǒng)一定會(huì)重新創(chuàng)建。 1. 簡介 這篇文章會(huì)從Service的一些小知識(shí)點(diǎn),延伸到Android中幾種常用進(jìn)程間通信方法。 2. 進(jìn)程 ? ? ? ?Service是一種不提供用戶交互頁面但是可以在后臺(tái)長時(shí)間運(yùn)行的組件,可以通過在An...
閱讀 1354·2021-09-10 10:51
閱讀 2829·2019-08-30 15:54
閱讀 3367·2019-08-29 17:11
閱讀 926·2019-08-29 16:44
閱讀 1391·2019-08-29 13:47
閱讀 1086·2019-08-29 13:47
閱讀 1485·2019-08-29 12:23
閱讀 1038·2019-08-28 18:18