【Android練級之路】Service

[TOC]

大綱

Service.png

生命周期

service_lifecycle.png
  • onCreate()
  • onStartCommand()
  • onBind()
  • onUnbind()
  • onDestroy()

Service和Activity通信

Binder

Broadcast


onStartCommand()返回值

START_STICKY

當系統(tǒng)因回收資源而銷毀了 Service,當資源再次充足時自動啟動 Service蒋腮。而且再次調(diào)用 onStartCommand() 方法淘捡,但是不會傳遞最后一次的 Intent,相反系統(tǒng)在回調(diào) onStartCommand() 的時候會傳一個空 Intent池摧,除非有未處理的 Intent 準備發(fā)送焦除。

START_NOT_STICKY

當系統(tǒng)因回收資源而銷毀了 Service,當資源再次充足時不再自動啟動 Service作彤,除非有未處理的 Intent 準備發(fā)送膘魄。

START_REDELIVER_INTENT

當系統(tǒng)因回收資源而銷毀了 Service,當資源再次充足時自動啟動 Service竭讳,并且再次調(diào)用 onStartCommand() 方法创葡,并會把最后一次 Intent 再次傳遞給 onStartCommand(),相應的在隊列里的 Intent 也會按次序一次傳遞绢慢。此模式適用于下載等服務灿渴。

START_STICKY_COMPATIBILITY

是START_STICKY的兼容版本,但是不能保證Service被清理后一定會重新調(diào)用onStartCommand方法呐芥。


前臺服務

前臺服務與普通服務最大的區(qū)別在于,它會一直有一個正在運行的圖標在系統(tǒng)的狀態(tài)欄

創(chuàng)建前臺服務


public class MyService extends Service {

    ...

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("MyService", "onCreate executed");
        Intent intent = new Intent(this, MainActivity.class);
        PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
        Notification notification = new NotificationCompat.Builder(this)
                .setContentTitle("This is content title")
                .setContentText("This is content text")
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.mipmap.ic_launcher)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                .setContentIntent(pi)
                .build();
        startForeground(1, notification);
    }

    ...

}

啟動與停止前臺服務

Intent foregroundIntent = new Intent(this, ForegroundService.class);
startService(foregroundIntent); // 啟動前臺服務
stopService(foregroundIntent); // 停止前臺服務

IntentService

IntentService 是 Service 的子類奋岁,并且所有的請求操作都是在異步線程里思瘟。如果不需要 Service 來同時處理多個請求的話,IntentService 將會是最佳的選擇闻伶。

使用該服務只需要繼承并重寫 IntentService 中的 onHandleIntent() 方法滨攻,就可以對接受到的 Intent 做后臺的異步線程操作了。這個服務會在運行結束之后自動停止蓝翰。

MyService:

public class MyIntentService extends IntentService {

  public MyIntentService() {
    super("MyIntentService");
  }

  @Override
  protected void onHandleIntent(Intent intent) {
    //TODO: 耗時操作光绕,運行在子線程中
    Log.d("MyIntentService","Thread is "+Thread.currentThread().getId());
  }

  @Override
  public void onDestroy() {
    super.onDestroy();
    Log.d("MyIntentService","onDestroy executed");
  }
}

MyActivity:

public class MyActivity extends AppCompatActivity {

  protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.myactivity);

    Button btn = findViewById(R.id.btn);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Log.d("MyActivity","Thread is "+Thread.currentThread().getId());
            Intent intent = new Intent(MyActivity.this,MyIntentService.class);
            startService(intent);
        }
    });
}

  @Override
  public void onDestroy() {
    super.onDestroy();
    Log.d("MyIntentService","onDestroy executed");
  }
}

點擊按鈕之后即可看到以下效果

ServiceComLogd.png

服務保活

提高服務優(yōu)先級

將服務改成前臺服務

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末畜份,一起剝皮案震驚了整個濱河市诞帐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌爆雹,老刑警劉巖停蕉,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異钙态,居然都是意外死亡慧起,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門册倒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚓挤,“玉大人,你說我怎么就攤上這事〔右猓” “怎么了估灿?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長脾歧。 經(jīng)常有香客問我甲捏,道長,這世上最難降的妖魔是什么鞭执? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任司顿,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己呕乎,他們只是感情好较幌,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著再扭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上付材,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音圃阳,去河邊找鬼厌衔。 笑死,一個胖子當著我的面吹牛捍岳,可吹牛的內(nèi)容都是我干的富寿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼锣夹,長吁一口氣:“原來是場噩夢啊……” “哼页徐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起银萍,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤变勇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贴唇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贰锁,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年滤蝠,在試婚紗的時候發(fā)現(xiàn)自己被綠了豌熄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡物咳,死狀恐怖锣险,靈堂內(nèi)的尸體忽然破棺而出蹄皱,到底是詐尸還是另有隱情,我是刑警寧澤芯肤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布巷折,位于F島的核電站,受9級特大地震影響崖咨,放射性物質(zhì)發(fā)生泄漏锻拘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一击蹲、第九天 我趴在偏房一處隱蔽的房頂上張望署拟。 院中可真熱鬧,春花似錦歌豺、人聲如沸推穷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽馒铃。三九已至,卻和暖如春痕惋,著一層夾襖步出監(jiān)牢的瞬間区宇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工值戳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留议谷,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓述寡,卻偏偏與公主長得像柿隙,于是被迫代替她去往敵國和親叶洞。 傳聞我的和親對象是個殘疾皇子鲫凶,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容