国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Android四大組件之Service

Tonny / 2555人閱讀

摘要:我們這里就來解讀一下注釋上所描述的返回值的作用與效果相同,主要是為了兼容低版本,但是并不能保證每次都重啟成功。對方法返回不同的返回值導致服務被殺死的時候自動重啟,這個重啟次數(shù)只能是一次。感謝方法詭異的返回值中類中返回值介紹

前言

Service 算是四大組件中比較常用的吧,至少比起 Broadcase receiverContent provider 還算是用的多的,這里用來記錄一些關于 Service 的小細節(jié)。

startServicebindService 所導致的生命周期

定義一個 Service 跟一個 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 ,會多次調(diào)用 onStartCommand ,并會給 onStartCommand 參數(shù) startId 傳遞調(diào)用的次數(shù)。

多次調(diào)用 unbindService 會報 java.lang.IllegalArgumentException: Service not registered: 異常,但是多次 bindService 就沒有任何問題。

如果我們采用的是 startService 開啟一個 Service ,在 Activity 關閉后,Service 依舊運行在系統(tǒng)中。

如果我們采用的是 bindService 開啟一個 Service ,在 Activity 關閉時也會銷毀 Service ,就算你沒有調(diào)用 unBindService 方法。

如果我們 start 并且 bind 一個 Service ,怎么樣才可以銷毀這個 Service 呢?有以下幾種方法:

調(diào)用 stopServiceunbindService 這兩個方法,調(diào)用順序不分先后。

先調(diào)用 stopService ,然后再關閉 Activity

Service的 onStartCommand 方法的返回值

一般來說,我們重寫 ServiceonStartCommand 方法都會返回 super.onStartCommand(intent, flags, startId) ,但這個默認的返回值是啥呢?我們一起到 Service 的源碼中看看:

public @StartResult int onStartCommand(Intent intent, @StartArgFlags int flags, int startId) {
    onStart(intent, startId);
    return mStartCompatibility ? START_STICKY_COMPATIBILITY : START_STICKY;
}

通過 mStartCompatibility 進行三元運算法,從而返回不同的值,mStartCompatibility 其實表示的就是應用的 targetSdkVersion 是否小于5。對于現(xiàn)在的 APP 來說,targetSdkVersion 早就大于5了,所以 mStartCompatibility 自然就為 false ,而 super.onStartCommand(intent, flags, startId) 返回的就是 START_STICKY

那么這個返回值又有什么用呢?說實話,我寫代碼來驗證這個返回值貌似并不好使,也就是說不像注釋說的那樣牛逼,有時候會失效,甚至可以說是大部分都在失效。我們這里就來解讀一下注釋上所描述的返回值的作用:

START_STICKY_COMPATIBILITY :與 START_STICKY 效果相同,主要是為了兼容低版本,但是并不能保證每次都重啟成功。

START_STICKY :進程被殺死以后,服務會自動重啟,并調(diào)用 onStartCommand 方法,但是并不會保存 intent ,所以需要在 onStartCommand 處理 intent 的話,記得要判空。但是 startId 會+1。

START_NOT_STICKY :進程被殺死以后,服務并不會自動重啟,就算是重新啟動 App 也會不重啟服務。

START_REDELIVER_INTENT :進程被殺死以后,服務會被自動重啟,onStartCommand 方法會被調(diào)用,但是 intent 不為空,因為系統(tǒng)保存了上一次服務被殺死時的 intentstartId

onStartCommand 方法返回不同的返回值導致服務被殺死的時候自動重啟,這個重啟次數(shù)只能是一次。比如說服務被殺死一次以后,因為 onStartCommand 方法的返回值重啟了這個服務,但是又被殺死了,這個時候服務不會再次因為 onStartCommand 方法的返回值重啟服務了。

短時間的服務被多次殺死以后,系統(tǒng)就不愿意為你再重啟這個服務了。

感謝

Android Service.onStartCommand() 方法
Service: onStartCommand 詭異的返回值
Android中Service類中onStartCommand返回值介紹

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73921.html

相關文章

  • Android四大組件Service

    摘要:注意每個必須在中通過來聲明。執(zhí)行具體的下載任務接下來我們在中通過來綁定和解除綁定可以看到,這里我們首先創(chuàng)建了一個的匿名類,在里面重寫了方法和方法,這兩個方法分別會在與建立關聯(lián)和解除關聯(lián)的時候調(diào)用。 前言 Hi,大家好,上一期我們講了如何使用BroadcastReceiver,這一期我們講解Android四大組件之Service相關知識。每天一篇技術干貨,每天我們一起進步。 耐心專注不僅...

    archieyang 評論0 收藏0
  • Android四大組件Service全解析

    摘要:四大組件都支持這個屬性。到目前為止,中總共有三種啟動方式。返回值方法有一個的返回值,這個返回值標識服務關閉后系統(tǒng)的后續(xù)操作。,啟動后的服務被殺死,不能保證系統(tǒng)一定會重新創(chuàng)建。 1. 簡介 這篇文章會從Service的一些小知識點,延伸到Android中幾種常用進程間通信方法。 2. 進程 ? ? ? ?Service是一種不提供用戶交互頁面但是可以在后臺長時間運行的組件,可以通過在An...

    alaege 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<