Android四大組件:BroadcastReceiver的使用

來源:互聯網
上載者:User

標籤:tools   parent   val   插入   android   tps   break   mode   studio   

BroadcastReceiver

 

作用:

監聽 / 接收 應用 App 發出的廣播訊息,並 做出響應

 

應用情境:

  • Android不同組件間的通訊(含 :應用內 / 不同應用之間)
  • 多線程通訊
  • 與 Android 系統在特定情況下的通訊

如:電話呼入時、網路可用時、耳機插入時

 

 

 

初步使用BroadcastReceiver:實現向BroadcastRecever發送訊息,在控制台輸出BroadcastReceiver接收到的訊息

 

步驟一:

activity_main.xml布局:

 

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="com.contentprovide.liuliu.brodcast_demo1.MainActivity"><Button    android:id="@+id/btn"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="傳送訊息"    /></LinearLayout>

 

 

步驟二:

建立一個BroadcastReceiver(自訂類繼承BroadcastReceiver,重寫onReceive方法),

package com.contentprovide.liuliu.brodcast_demo1;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class MyReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        String s = intent.getStringExtra("date");        System.out.println("===================接收到的訊息是:"+s);    }}

 這一步系統會在AndroidManifest.xml檔案中自動靜態註冊BroadcastReceiver

 

步驟三: Java代碼向廣播接收器傳遞資訊

package com.contentprovide.liuliu.brodcast_demo1;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class MainActivity extends AppCompatActivity {    Button btn;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        btn = (Button) findViewById(R.id.btn);        btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent intent = new Intent(MainActivity.this, MyReceiver.class);                intent.putExtra("date", "11111");//                傳送訊息                sendBroadcast(intent);            }        });    }}

實現效果: 

 

 

 

 動態註冊和登出BroadcastReceiver


在Android Studio中一鍵建立BroadcastReceiver時系統會自動的靜態註冊,但是很多時候為了最佳化程式,在需要的時候動態註冊,不需要時及時登出

 

步驟一:activity_main.xml布局檔案:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="com.contentprovide.liuliu.brodcast_demo2.MainActivity">    <Button        android:id="@+id/btn_send"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="傳送訊息" />    <Button        android:id="@+id/btn_reg"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="註冊接收器" />    <Button        android:id="@+id/btn_unreg"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="登出接收器" /></LinearLayout>

 

 步驟二:建立BroadcastRecever,聲明一個對象用作廣播接收器的類型

MyReceiver.java

package com.contentprovide.liuliu.brodcast_demo2;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class MyReceiver extends BroadcastReceiver {//聲明一個字串變數儲存當前廣播接收器的路徑,用作接收廣播的類型    public static final String Path = "com.contentprovide.liuliu.brodcast_demo2";    @Override    public void onReceive(Context context, Intent intent) {        String s = intent.getStringExtra("date");        System.out.println("===================接收到的訊息是:"+s);    }}

 

 步驟三:使用Java代碼動態註冊和登出廣播接收器

 

package com.contentprovide.liuliu.brodcast_demo2;import android.content.Intent;import android.content.IntentFilter;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class MainActivity extends AppCompatActivity implements View.OnClickListener {    Button btn_send, btn_reg, btn_unreg;    Intent intent;    MyReceiver myReceiver = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        btn_send = (Button) findViewById(R.id.btn_send);        btn_reg = (Button) findViewById(R.id.btn_reg);        btn_unreg = (Button) findViewById(R.id.btn_unreg);        btn_send.setOnClickListener(this);        btn_reg.setOnClickListener(this);        btn_unreg.setOnClickListener(this);        intent = new Intent(MyReceiver.Path);    }    @Override    public void onClick(View view) {        switch (view.getId()) {            case R.id.btn_send:                intent.putExtra("date", "11111");                sendBroadcast(intent);                break;            case R.id.btn_reg://添加判斷語句是為了防止重複註冊和重複登出                if (myReceiver == null) {                    myReceiver = new MyReceiver();//                     設定接收廣播的類型,在執行個體化後面的括弧中調用在MyReceiver.java中聲明的字串變數                    IntentFilter intentFilter = new IntentFilter(myReceiver.Path);//                    註冊廣播接收器                    registerReceiver(myReceiver, intentFilter);                }                break;            case R.id.btn_unreg:                if (myReceiver != null) {//                    登出廣播接收器                    unregisterReceiver(myReceiver);                    myReceiver = null;                }                break;        }    }}

 實現效果:在點擊註冊播放器前點擊傳送訊息,控制台沒有訊息輸出。先點擊註冊播放器再點擊發送訊息,控制台有訊息輸出。點擊登出播放器後再點擊發送訊息,控制台也沒有訊息輸出

 

 

 

 

  • Android中內建了多個系統廣播:只要涉及到手機的基本操作(如開機、網路狀態變化、拍照等等),都會發出相應的廣播
  • 每個廣播都有特定的Intent - Filter(包括具體的action),Android系統廣播action如下:
系統操作 action
監聽網路變化 android.net.conn.CONNECTIVITY_CHANGE
關閉或開啟飛航模式 Intent.ACTION_AIRPLANE_MODE_CHANGED
充電時或電量發生變化 Intent.ACTION_BATTERY_CHANGED
電池電量低 Intent.ACTION_BATTERY_LOW
電池電量充足(即從電量低變化到飽滿時會發出廣播 Intent.ACTION_BATTERY_OKAY
系統啟動完成後(僅廣播一次) Intent.ACTION_BOOT_COMPLETED
按下照相時的拍照按鍵(硬體按鍵)時 Intent.ACTION_CAMERA_BUTTON
螢幕鎖屏 Intent.ACTION_CLOSE_SYSTEM_DIALOGS
裝置當前設定被改變時(介面語言、裝置方向等) Intent.ACTION_CONFIGURATION_CHANGED
插入耳機時 Intent.ACTION_HEADSET_PLUG
未正確移除SD卡但已取出來時(正確移除方法:設定--SD卡和裝置記憶體--卸載SD卡) Intent.ACTION_MEDIA_BAD_REMOVAL
插入外部儲存裝置(如SD卡) Intent.ACTION_MEDIA_CHECKING
成功安裝APK Intent.ACTION_PACKAGE_ADDED
成功刪除APK Intent.ACTION_PACKAGE_REMOVED
重啟裝置 Intent.ACTION_REBOOT
螢幕被關閉 Intent.ACTION_SCREEN_OFF
螢幕被開啟 Intent.ACTION_SCREEN_ON
關閉系統時 Intent.ACTION_SHUTDOWN
重啟裝置 Intent.ACTION_REBOOT

註:當使用系統廣播時,只需要在註冊廣播接收者時定義相關的action即可,並不需要手動發送廣播,當系統有相關操作時會自動進行系統廣播

 

 

 

推薦相關部落格:https://www.jianshu.com/p/ca3d87a4cdf3

 

Android四大組件:BroadcastReceiver的使用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.