Android深入淺出系列之廣播機制—2-Android中的廣播機制

來源:互聯網
上載者:User

  前言

  1.1 在上節課我們講了在項目定義檔案AndroidManifest.xml中註冊BroadcastReceiver廣播接收器的方法,今天我們介紹在代碼中註冊BroadcastReceiver廣播接收器的方法。在項目定義檔案AndroidManifest.xml中註冊BroadcastReceiver廣播接收器的話,即使你的應用程式已經被關閉了,這個BroadcastReceiver廣播接收器依然會接收到廣播,比如:你的這個應用程式是監聽拍照事件,每次拍照後BroadcastReceiver廣播接收器接收到後會彈出一個提示框“您已拍了圖片,圖片已儲存”,當你開著這個應用程式是能收到廣播的這是沒有問題的,但是你把這個應用程式關閉掉了依然能收到廣播,依然要彈出“您已拍了圖片,圖片已儲存”,這在有的情境中不是我們需要的了,所以我們要換一種註冊BroadcastReceiver廣播接收器的方法。

    1.2 瞭解安卓系統當中出現什麼情況的時候會發出廣播,以便我們對安卓作業系統當中的事件進行控制,所以我們要瞭解Android內建的這些BroadcastReceiver Actions。這裡我就不再寫了,可以去參考Android SDK 裡面很全而且都有說明。

  思路

  BroadcastReceive用於監聽被廣播的事件,這種事件是以Intent對象廣播出來的,所以必須在我們的安卓系統中註冊BroadcastReceive類。今天我們介紹在代碼中註冊BroadcastReceiver廣播接收器的方法。

  實現步驟

   一:布局檔案編寫

   1.1:布局檔案main.xml

   <?xml version="1.0" encoding="utf-8"?>
   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
      >
    <Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="綁定廣播接收器"
       android:id="@+id/start"
      />
      <Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="取消綁定的廣播接收器"
       android:id="@+id/end"
      />  

   </LinearLayout> 

  二:代碼檔案編寫

  2. 1:MainActivity.java

  package com.menglin.broadcastreceiver;

  import android.app.Activity;
  import android.content.Intent;
  import android.content.IntentFilter;
  import android.os.Bundle;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.Button;

  public class MainActivity extends Activity
  {
     protected static final String SMS_Action = "android.provider.Telephony.SMS_RECEIVED";
     //聲明兩個Button對象

     private Buttonbtn_start,btn_end;

     //聲明一個我們自訂的BroadcastReceiver類的對象
     BroadcastReceiver br;
     @Override
     public void onCreate(Bundle savedInstanceState)
     {
        super.onCreate(savedInstanceState);
        //載入布局檔案main.xml
        setContentView(R.layout.main);
        //通過findViewById()方法得到兩個按鈕對象
        btn_start= (Button)findViewById(R.id.start);
        btn_end= (Button)findViewById(R.id.end);
        //給兩個按鈕綁定監聽單擊事件
        btn_start.setOnClickListener(btn_start_listener);
        btn_end.setOnClickListener(cannellistener);
     }
 
     //監聽單擊事件
     private OnClickListener btn_start_listener= new OnClickListener()
     {
        @Override
        public void onClick(View v)
        {
           //建立一個BroadcastReceiver對象
           br = new BroadcastReceiver();
           //建立一個IntentFilter對象
           IntentFilter intentfilter = new IntentFilter();
           //為IntentFilter對象添加Action,也相當於在AndroidManifest.xml定義一樣,定義的目的是過濾器只許當安卓的作業系統產生短訊息的事件咱們自訂的這個BroadcastReceiver類才能來接收短訊息這個廣播,我們才能進行代碼的進一步處理
           intentfilter.addAction(SMS_Action);
           //註冊廣播接收器
           registerReceiver(br, intentfilter);
        }
     };
 
     //監聽單擊事件
     private OnClickListener btn_end_listener= new OnClickListener()
     {
        @Override
        public void onClick(View v)
        {
           //取消註冊的廣播接收器
           unregisterReceiver(br);
        }
     };
  }

  2.2 BroadcastReceiver .java

  package com.menglin.broadcastreceiver;

  import android.content.Context;
  import android.content.Intent;
  import android.util.Log;

  public class BroadcastReceiver extends android.content.BroadcastReceiver
  {
 
     private static final String Tag = "BroadcastReceiver";

     //建構函式
     public BroadcastReceiver()
     {
        Log.i(Tag, "建構函式");
     }

     @Override
     public void onReceive(Context context, Intent intent)
     {
          Log.i(Tag, "已接收");
     }

  }

  三:項目定義檔案

  AndroidMainfest.xml

  在<appliacation/>節點下面加上具有接收簡訊的許可權節點<uses-permission android:name="android.permission.RECEIVE_SMS"/>,我之前寫成<uses-permission android:name="android.permission.SMS_RECEIVE"/>,系統總是提醒我permission denial: receiving intent{act=intent

android.provider.Telephony.SMS_RECEIVED},我還是總是納悶了,怎麼回事,不是許可權加上了嗎,最後查看SDK發現是兩單詞寫反了。

  執行流程

  但我們單擊“註冊廣播接收器”按鈕後,我們通過“Emulator Control“面板給模擬器發送個短訊息,此時我們的Log日誌會輸出“已接收”,這個“已接收”就是我們在我們自訂的廣播接收器類中輸出的,我們再次單擊“取消廣播接收器”按鈕後,我們再次通過“Emulator Control”面板給模擬器發送個短訊息,Log日誌就輸不出了“已接收”了。

  運行機制

  當我們把這個我們寫好的廣播接收器類註冊到Android的作業系統上面後,當系統接收到短訊息後,就會自動調用我們寫的這個BroadcastReceiver.java類中的onReceive()方法,當onReceive()方法中的代碼處理完畢以後,這個廣播接收器對象的生命就銷毀了。當系統拍照或者收到電話等事件的廣播不會調用我們寫的BroadcastReceiver.java類中的onReceive()方法,因為我們寫過intentfilter.addAction(SMS_Action);這行代碼的意思是我們的廣播接收器只對當系統接收到短訊息會產生興趣,不對系統的其他事件的廣播感興趣。

   運行效果如下

  

  

  

  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.