1. 程式人生 > >Android:日常學習筆記(9)———探究廣播機制

Android:日常學習筆記(9)———探究廣播機制

ora rri enabled cas 管理 encoding protect 其他 acc

Android:日常學習筆記(9)———探究廣播機制

引入廣播機制

Andorid廣播機制

  廣播是任何應用均可接收的消息。系統將針對系統事件(例如:系統啟動或設備開始充電時)傳遞各種廣播。通過將 Intent 傳遞給 sendBroadcast()sendOrderedBroadcast()sendStickyBroadcast(),您可以將廣播傳遞給其他應用。

  Android提供了一套完整的API,允許應用程序自由地發送和接受廣播。發送廣播使用Intent,接受廣播使用 廣播接收器(Boradcast Receiver)

  廣播分成兩種類型:

  •   標準廣播:一種完全異步的廣播,在廣播發出之後,所有的廣播接收器幾乎同時收到這條廣播信息。
  •   有序廣播:一種同步執行的廣播,在廣播發出之後,所有的接收器根據先後順序依次收到,並且可以被截獲。

接受系統廣播

  廣播接收器可以自由地對自己感興趣的廣播進行註冊,這樣當相應的廣播發出時,廣播接收器就可以收到這條廣播,並在內部處理邏輯。

動態註冊:在代碼中註冊

創建廣播接收器的步驟:

1.新建一個類使其繼承BroadcastReceiver

2.重寫onReceive()方法

public class MyBroadCastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,
"network changes",Toast.LENGTH_LONG).show(); } }

3.為接受器綁定要接受的廣播

public class MainActivity extends AppCompatActivity {
   
    
    private IntentFilter intentFilter; 
/*
Structured description of Intent values to be matched. An IntentFilter can match against actions, categories, and data (either via its type, scheme, and/or path) in an Intent. It also includes a "priority" value which is used to order multiple matching filters.
*/ private MyBroadCastReceiver myReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); //需要廣播器接受什麽樣的廣播,就在這裏添加什麽樣的action myReceiver = new MyBroadCastReceiver(); registerReceiver(myReceiver,intentFilter); //註冊 } @Override protected void onDestroy() { unregisterReceiver(myReceiver); //動態註冊的廣播一定要取消註冊才行 super.onDestroy(); }

獲取精確的網絡狀態:

1.修改接收器代碼

public class MyBroadCastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        ConnectivityManager connectivityManager =
                (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        //這是一個系統服務類,專門用於管理網絡連接
        NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
        if(networkInfo!=null&&networkInfo.isAvailable())
        {
            Toast.makeText(context,"獲得網絡連接",Toast.LENGTH_LONG).show();
        }
        else
        {
            Toast.makeText(context,"失去網絡連接",Toast.LENGTH_LONG).show();

        }

    }
}

3.聲明程序權限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.zy.dealhelper">
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <application
     .....
    </application>

</manifest>

說明:涉及用戶隱私的狀態信息必須要到AndroidManifest.xml中進行聲明

靜態註冊:在AndroidManifest.xml中進行聲明

說明:靜態註冊最大的特點就是程序未啟用的情況下便可接受到廣播

使用AS自動生成廣播接收器

1.新建一個廣播接收器

技術分享

2.配置廣播接收器

技術分享

public class BootCompleteReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"Boot Complete",Toast.LENGTH_LONG).show();
    }
}

3.手動註冊

技術分享

發送自定義廣播

發送標準廣播

1.首先定義了自己的廣播接收器並且配置了廣播名

public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
  Toast.makeText(context,"收到我自己發送的廣播"+intent.getExtras().getString("info"),Toast.LENGTH_SHORT).show();
} }
        <receiver
            android:name=".broadcast.MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.expample.zy.MY_BROADCAST"></action>
            </intent-filter>
        </receiver>

2.發送廣播

                Intent broadCastIntent = new Intent("com.example.zy.MY_BROADCAST");
                broadCastIntent.putExtra("info","你好啊");
                sendBroadcast(broadCastIntent);

發送有序廣播

0.設置接收器的優先等級

<intent-filter android:priority="100">
<action android:name="com.example.zy.MY_BROADCAST"></action>
</intent-filter>

1.發送有序廣播

sendOrderedBroadcast(intent,null);

2.截獲

public class MyReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"收到我自己發送的廣播"+intent.getExtras().getString("info"),Toast.LENGTH_SHORT).show();
abortBroadcast();
}
}

使用本地廣播

為什麽使用本地廣播?

前面我們接收和發送的廣播全部屬於系統全局廣播,即發出的廣播可以被其他任何應用程序接收到,並且我們也可以接收到來自其他應用程序的廣播,這樣就容易引起安全性問題。為此Android引入了一套本地廣播機制,使用這個機制發出的廣播僅僅能在應用程序內部進行傳遞。

實例  

public class MainActivity extends AppCompatActivity {
    private LocalBroadcastManager localBroadcastManager;
    private IntentFilter intentFilter;
    private MyBroadCastReceiver myReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        localBroadcastManager = LocalBroadcastManager.getInstance(this);
        //1.獲取本地管理器實例
        setContentView(R.layout.activity_main);

        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        myReceiver = new MyBroadCastReceiver();
        localBroadcastManager.registerReceiver(myReceiver,intentFilter);
        //2.使用本地廣播管理器進行動態註冊

        });
    }

    @Override
    protected void onDestroy() {
        localBroadcastManager.unregisterReceiver(myReceiver);
        //3.使用本地廣播管理器動態卸載
        super.onDestroy();
    }
}

Android:日常學習筆記(9)———探究廣播機制