安卓基礎(chǔ)學(xué)習(xí) Day11 |常用組件-廣播和服務(wù)

目錄
一惹谐、廣播
(一)廣播接收者
(二)自定義廣播的發(fā)送與接收
(三)有序廣播和無序廣播
二是整、服務(wù)
(一)基礎(chǔ)知識(shí)
(二)測(cè)試
三铡羡、補(bǔ)充
1、主要參考自:https://b23.tv/Flmxaa
2榛泛、內(nèi)容如果有不對(duì)的蝌蹂,希望可以指出或補(bǔ)充噩斟。
3曹锨、新知識(shí)。

一剃允、廣播
(一)廣播接收者

① 概述

廣播接收者(BroadcastReceiver):Android系統(tǒng)中內(nèi)置了很多廣播沛简,列如手機(jī)的開機(jī)完成、電池電量不足時(shí)都會(huì)發(fā)送一條廣播斥废。為了監(jiān)聽來自系統(tǒng)或者應(yīng)用程序的廣播事件椒楣,Android系統(tǒng)提供了廣播接收者組件(四大組件之一)。當(dāng)Android系統(tǒng)產(chǎn)生一個(gè)廣播事件時(shí)牡肉,可以有多個(gè)對(duì)應(yīng)的廣播接收者接收并進(jìn)行處理捧灰。相當(dāng)于是接收電臺(tái)消息的收音機(jī)。
特點(diǎn):一對(duì)多(如一個(gè)電臺(tái)的發(fā)出的頻率统锤,可以被多個(gè)收音機(jī)接收到)毛俏,消息是單向的(如收音機(jī)只能接收消息)。
② 測(cè)試

1 創(chuàng)建廣播接收者饲窿。


20210119175502333.png
20210119180040828.png

2 動(dòng)態(tài)注冊(cè)廣播接收者-創(chuàng)建

靜態(tài)的注冊(cè):系統(tǒng)一般會(huì)自動(dòng)創(chuàng)建煌寇,在項(xiàng)目清單文件里。
動(dòng)態(tài)注冊(cè)的特點(diǎn):只有當(dāng)注冊(cè)廣播接收者的組件活著的時(shí)候(存在)逾雄,對(duì)應(yīng)的廣播接收者才會(huì)接收到廣播阀溶,這也是和靜態(tài)注冊(cè)的區(qū)別所在。


20210119182638671.png

3 測(cè)試-攔截電話

① 布局


20210119193816869.png

② 代碼部分


20210119194240957.png
20210119194321926.png

③ 運(yùn)行效果

項(xiàng)目清單文件


20210119193651599.png

如下:


20210119195048263.gif

(二)自定義廣播的發(fā)送與接收

① 概述

當(dāng)系統(tǒng)提供的廣播不能滿足需求時(shí)鸦泳,可以自定義廣播(發(fā)送消息)银锻,同時(shí)需要編寫對(duì)應(yīng)的廣播接收者(監(jiān)聽消息)。

當(dāng)自定義廣播發(fā)送消息時(shí)做鹰,會(huì)存儲(chǔ)到公共消息區(qū)中击纬,而公共消息區(qū)中如果存在對(duì)應(yīng)的廣播接收者,就會(huì)及時(shí)的接收這條消息誊垢。

② 測(cè)試

1 布局以及MainActivity.java內(nèi)容


20210119202039424.png
20210119202128820.png

2 測(cè)試效果

和上面的測(cè)試一樣的道理掉弛,處理項(xiàng)目清單文件(聲明自定義的廣播事件的意圖)


20210119201811513.png

運(yùn)行結(jié)果:


20210119201705658.png

(三)有序廣播和無序廣播

① 概述

Android系統(tǒng)提供了兩種廣播類型症见,有序廣播和無序廣播,開發(fā)者可根據(jù)需求為程序設(shè)置不同的廣播類型殃饿。

有序廣播:按照接收者的優(yōu)先級(jí)接收谋作,只有一個(gè)廣播接收者能接收到消息,在此廣播接收者中邏輯執(zhí)行完畢后乎芳,才會(huì)繼續(xù)傳遞遵蚜。

無序廣播:是完全異步執(zhí)行,發(fā)送廣播時(shí)所有監(jiān)聽這個(gè)廣播的廣播接收者都會(huì)接收到此消息奈惑,但接收的順序不確定吭净。

有序廣播可以被攔截;無序廣播所有的廣播接收者都可以接收到消息肴甸。

② 測(cè)試-有序廣播

需要新建三個(gè)廣播接收者驾诈,以便更好的測(cè)試。這三個(gè)廣播接收者的設(shè)置都差不多驻粟,如:


20210119210802432.png

1 布局略

2 運(yùn)行效果

項(xiàng)目清單文件


20210119205256234.png

效果如下:


20210119210144765.png

注:如果priority的數(shù)值相同(優(yōu)先級(jí)一樣)役电,那么就是在項(xiàng)目清單文件中最先聲明(位置在前面的)先收到消息。如果把高優(yōu)先級(jí)的廣播中斷了(在廣播接收者里編寫 攔截有序廣播:abortBroadcast(); )庶柿,優(yōu)先級(jí)較低的就不會(huì)再收到消息了村怪,但有方法(如下圖-在發(fā)送方法里編寫)可以強(qiáng)制廣播接收者接收到消息。


20210119211517483.png

二浮庐、服務(wù)

Day12內(nèi)容甚负。

服務(wù)(Service)也是四大組件之一,可將它看作是一個(gè)沒界面的activity(一般用于后臺(tái)操作审残,如手機(jī)息屏后音樂的播放)梭域。
最大的特點(diǎn):可在后臺(tái)長(zhǎng)時(shí)間運(yùn)行。
(一)基礎(chǔ)知識(shí)

創(chuàng)建:同廣播接收者的創(chuàng)建類似(在程序包名上右擊選擇【New】→【Service】→【Service】→在彈出的窗口中輸入服務(wù)名稱或默認(rèn)即可)维苔;若采用自行創(chuàng)建Java類繼承Service類的方式創(chuàng)建服務(wù)碰辅,則需要手動(dòng)在項(xiàng)目清單文件中進(jìn)行注冊(cè)。

生命周期:也就是它從啟動(dòng)到關(guān)閉所經(jīng)歷的一個(gè)過程介时。轉(zhuǎn)↓


20210120184904896.png

啟動(dòng)方式:

① 通過startService()方法:服務(wù)會(huì)長(zhǎng)期運(yùn)行在后臺(tái)没宾,且服務(wù)的狀態(tài)與開啟者的狀態(tài)無關(guān),也就是即使啟動(dòng)服務(wù)的組件已被銷毀沸柔,服務(wù)會(huì)依舊運(yùn)行循衰。需要自身調(diào)用stopSelf()方法或其他組件調(diào)用stopService()方法時(shí)服務(wù)才能停止。

② 通過bindService()方法:服務(wù)會(huì)與組件綁定褐澎。需要調(diào)用onUnbind()方法解除綁定之后才會(huì)被銷毀会钝。注:如果要長(zhǎng)期存在,就需要在綁定之前用startService啟動(dòng)
20210120194335831.png

服務(wù)(結(jié)合使用)。
(二)測(cè)試

① startService啟動(dòng)Service

1 布局


20210120194456337.png

2 服務(wù)類


20210120200115960.png

3 展示結(jié)果


20210120194335831.png

總結(jié):onCreate()表示的是當(dāng)服務(wù)創(chuàng)建的時(shí)候執(zhí)行(創(chuàng)建成功了就不會(huì)再有作用了)迁酸,只調(diào)用一次先鱼;多次執(zhí)行開啟服務(wù)(只要服務(wù)還是啟動(dòng)著的)會(huì)多次調(diào)用onStartCommand()且只是復(fù)用前面產(chǎn)生的service對(duì)象,不會(huì)新建新service對(duì)象奸鬓;onDestroy()表示的是關(guān)閉服務(wù)焙畔,同onCreate()一樣的道理,只調(diào)用一次串远。

② bindService啟動(dòng)Service

1 布局略(與①的布局設(shè)置同理)

2 代碼

① MyService.java

在OnBind()方法中需要返回一個(gè)IBinder的實(shí)例宏多,否則監(jiān)聽連接狀態(tài)的方法就不會(huì)調(diào)用。

package com.example.testservice;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {
    public MyService() { }

    //定義onBinder方法所返回的對(duì)象實(shí)例
    //創(chuàng)建服務(wù)代理 調(diào)用服務(wù)中的方法
    class MyBinder extends Binder{
        //可以間接調(diào)用到service里面的相關(guān)方法
        public void callTestInService(){
            testInService();
        }
    }
    public void testInService(){
        Log.i("MyService","自定義方法澡罚,testInService()");
    }

    @Override
    //IBinder是一個(gè)接口  可進(jìn)行跨進(jìn)程訪問(遠(yuǎn)程調(diào)用)
    public IBinder onBind(Intent intent) {
        Log.i("MyService","綁定服務(wù)伸但,調(diào)用onBind()");
        return new MyBinder();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i("MyService","創(chuàng)建服務(wù),調(diào)用onCreate()");
    }

    @Override
    //解綁
    public boolean onUnbind(Intent intent) {
        Log.i("MyService","解綁服務(wù)留搔,調(diào)用onUnbind()");
        return super.onUnbind(intent);
    }
}

② MainActivity.java

package com.example.testservice;
import androidx.appcompat.app.AppCompatActivity;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;

public class MainActivity extends AppCompatActivity {
    private MyService.MyBinder myBinder;
    private MyTest mytest;

    @Override
    //自帶
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    //綁定(開啟)服務(wù)
    public void btnBind(View view){
        if(mytest == null){
            mytest = new MyTest();
        }
        Intent intent = new Intent(this,MyService.class);
        //參數(shù)1:用于指定要啟動(dòng)的service更胖,參數(shù)2:監(jiān)聽調(diào)用者與service間的連接狀態(tài),
        // 參數(shù)3:指定綁定時(shí)是否自動(dòng)創(chuàng)建service
        bindService(intent,mytest,BIND_AUTO_CREATE);
    }

    //服務(wù)連接時(shí)執(zhí)行
    private class MyTest implements ServiceConnection{
        @Override
        //當(dāng)成功綁定服務(wù)時(shí)調(diào)用催式,返回MyService里面的Ibinder對(duì)象
        public void onServiceConnected(ComponentName name, IBinder service) {
            myBinder = (MyService.MyBinder) service;
            Log.i("MainActivity","服務(wù)成功綁定函喉,內(nèi)存地址為:"+myBinder.toString());
        }
        //當(dāng)服務(wù)失去連接時(shí),調(diào)用的方法
        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.i("MainActivity","服務(wù)失去連接");
        }
    }

    //調(diào)用服務(wù)中的方法
    public void btnCall(View view){
        //訪問到MyService里的callTestInService()方法
        myBinder.callTestInService();
    }

    //解綁服務(wù)
    public void btnUnbind(View view){
        //需要判斷是因?yàn)椋航獬壎〞r(shí)就需要接收ServiceConnection
        if(mytest != null){
            unbindService(mytest);
            mytest = null;
        }
    }
}

3 展示結(jié)果


20210120215130830.png

總結(jié):多次啟動(dòng)服務(wù)荣月,onBind()只被調(diào)用一次。
三梳毙、補(bǔ)充

1哺窄、Android的四大組件,只要被定義了账锹,就必須在AndroidManifest.xml(清單文件)中注冊(cè)萌业。一般,系統(tǒng)都會(huì)自動(dòng)注冊(cè)奸柬。

2生年、遇到的意圖報(bào)錯(cuò)問題

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市廓奕,隨后出現(xiàn)的幾起案子抱婉,更是在濱河造成了極大的恐慌,老刑警劉巖桌粉,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒸绩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡铃肯,警方通過查閱死者的電腦和手機(jī)患亿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來押逼,“玉大人步藕,你說我怎么就攤上這事惦界。” “怎么了咙冗?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵表锻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我乞娄,道長(zhǎng)瞬逊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任仪或,我火速辦了婚禮确镊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘范删。我一直安慰自己蕾域,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布到旦。 她就那樣靜靜地躺著旨巷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪添忘。 梳的紋絲不亂的頭發(fā)上采呐,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音搁骑,去河邊找鬼斧吐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛仲器,可吹牛的內(nèi)容都是我干的煤率。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼乏冀,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了辆沦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤众辨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鹃彻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體郊闯,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡团赁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了欢摄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怀挠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绿淋,到底是詐尸還是另有隱情,我是刑警寧澤吞滞,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站裁赠,受9級(jí)特大地震影響殿漠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜佩捞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一绞幌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧失尖,春花似錦啊奄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)琼富。三九已至仪吧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鞠眉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工械蹋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留出皇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓哗戈,卻偏偏與公主長(zhǎng)得像郊艘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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