Androidでシステム放送を受信する方法について

7211 ワード

Androidには多くのシステムレベルのブロードキャストが内蔵されており、アプリケーションでこれらのブロードキャストを傍受することで様々なシステムのステータス情報を得ることができます.例えば、携帯電話の電源を入れた後に放送を出したり、バッテリーの電力量が変わった後に放送を出したり、時間や時間帯が変わったりして放送を出したりします.これらのブロードキャストを受信するには、ブロードキャスト受信機を使用する必要があります.
登録ブロードキャストの方式は2種類あり、コードに登録(動的登録)とAndroid Manifest.xmlに登録(静的登録).
1動的登録
ブロードキャスト受信機の作成:BroadcastReceiverから継承されるクラスを新規作成し、親クラスのonReceive()メソッドを書き換えます.ブロードキャストが到来するとonReceive()メソッドが実行され,このメソッドに具体的な論理が記述される.
public class MainActivity extends AppCompatActivity {

    private IntentFilter intentFilter;

    private NetworkChangeReceiver networkChangeReceiver;

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

        //  “    ”      
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangeReceiver = new NetworkChangeReceiver();
        registerReceiver(networkChangeReceiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);
    }

    /**
     * “    ”      
     */
    private class NetworkChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager manager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo=manager.getActiveNetworkInfo();
            if(networkInfo!=null&&networkInfo.isAvailable()){
                Toast.makeText(context,"    ",Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(context,"     ",Toast.LENGTH_SHORT).show();
            }
        }
    }
}

MainActivityでは、BroadcastReceiverから継承され、onReceiveメソッドを書き換えた内部クラスNetworkChangeReceiverを定義しました.これにより,ネットワーク状態が変化すればonReceiveメソッドが実行される.
onReceiveメソッドでは、getSystemService()メソッドでConnectivityManagerのインスタンス(ネットワーク接続の管理)を取得し、現在ネットワークがあるかどうかを判断できます.
onCreateメソッドでは,ネットワーク状態の変化を傍受するためのIntentFilterインスタンスを作成した.ブロードキャスト受信機は、どのブロードキャストを傍受したいのか、ここで対応するActionを追加します.最後にregisterReceiverメソッドを呼び出して登録します.
動的登録のアナウンスは必ずonDestroy()メソッドでキャンセルしてくださいO(∩∩)O~
プログラムがユーザーにとって敏感な操作を行う必要がある場合は、プロファイルに権限を宣言する必要があります.そうしないと、プログラムは直接クラッシュします.システムのネットワーク状態にアクセスするには、まず権限を宣言してAndroidManifestを開く必要があります.xml :
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

プログラムを実行し、ホームキーを押す→Menuキーを押す→System settings→Data usageデータ使用詳細画面に入り、Cellular Dataを閉じるとネットワークが使用できないというメッセージが表示されます.
Cellular Dataを再度開くと、ネットワークで使用可能なヒントが表示されます.
2静的登録
動的に登録されたブロードキャスト受信機は、登録とログアウトを自由に制御することができ、柔軟性の面で大きな利点があるが、登録の論理はonCreate()メソッドに書かれているため、プログラムが起動した後にブロードキャストを受信しなければならないという欠点もある.
静的登録を使用すると、プログラムが起動せずにブロードキャストを受信することができる.
プログラムにシャットダウンブロードキャストを受信させ,このブロードキャストを受信するとonReceive()メソッドを実行する.Android Studioでは、パケット名→New→Other→Broadcast Receiver、ポップアップウィンドウを右クリックしてブロードキャスト受信機を作成できます.
ここではブロードキャスト受信機に名前を付け、Exportedはこのブロードキャストが本プログラム以外のブロードキャストを受信することを許可するかどうかを示し、Enabledはこのブロードキャスト受信機を有効にするかどうかを示す.
Finishをクリックして作成が完了したら、ShutdownReceiverのコードを変更します.
public class ShutdownReceiver extends BroadcastReceiver {

    public ShutdownReceiver() {
    }

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

静的な放送受信機はAndroidManifestにある必要があります.xmlファイルに登録してこそ使用できますが、Android Studioを使用して作成されたブロードキャスト受信機を使用すると、自動的に登録が完了します.
<receiver
            android:name=".ShutdownReceiver"
            android:enabled="true"
            android:exported="true">receiver>

すべての静的ブロードキャスト受信機はここに登録されています.
AndroidManifestにもxmlファイルを変更し、ラベルに対応するActionを追加します.
<receiver
    android:name=".ShutdownReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.ACTION_SHUTDOWN" />
    intent-filter>
receiver>

注意:onReceive()メソッドに論理を追加したり、時間のかかる操作をしたりしないでください.ブロードキャスト受信機ではスレッドを開くことは許されません.onReceive()メソッドが長く実行され、終了しない場合、プログラムはエラーを報告します.したがって、ブロードキャスト受信機は、ステータスバーを作成する通知など、プログラムの他のコンポーネントを開くために主に使用される.