【Android】Androidで放送される基本的な使い方

14302 ワード

システム放送を受ける
動的登録
JavaコードでIntentFilterを指定し、何かの放送を傍受したい場合は対応するActionを追加します.動的に登録されたブロードキャストは、unregisterReceiver()メソッドを呼び出して登録をキャンセルする必要があります.
次に動的登録でネットワークの変化を傍受する
AndroidManifestでxmlに権限を追加するには、次の手順に従います.
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

ActivityのJavaコード:
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);
    }


    //               
    class NetworkChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();

            if (networkInfo != null && networkInfo.isAvailable()) {
                Toast.makeText(context, "network is available", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, "network is unavailable", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

静的登録
動的登録はプログラムが起動してからブロードキャストを受信する必要があり,静的ブロードキャストはこのショートボードを補う.AndroidManifestでIntentReceiverを指定すると、プログラムが起動していない場合にブロードキャストを受信できます.
以下、静的登録で起動放送を受け付けます
新しいブロードキャスト受信機
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
    }
}

AndroidManifestでxmlでの権限の追加、ブロードキャスト受信機の登録、アクションの追加

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.broadcasttest">

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            intent-filter>
        activity>

        <receiver
            android:name=".BootCompleteReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            intent-filter>
        receiver>
    application>
manifest>

ブロードキャストの送信
標準放送の送信
受信機のJavaコード:
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
    }
}

受信機の登録コード:
<receiver
        android:name=".MyBroadcastReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="com.example.broadcasttest.MY_BROADCAST" />
        intent-filter>
receiver>

ActivityのJavaコード
public class MainActivity extends AppCompatActivity {
    private Button button;

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

        //       
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
                sendBroadcast(intent);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        //                
        unregisterReceiver(networkChangeReceiver);
    } 
}

秩序放送を送信
秩序化されたブロードキャストを送信する方法:
sendOrderedBroadcast(intent, null);

ブロードキャスト受信機の前後順をAndroidManifestに設定する.xmlのreceiverのintent-filterのpriorityプロパティ、優先度オプション値:-1000~1000
android:priority="100"

ローカルブロードキャストの使用
主にLocalBroadcastManagerでブロードキャストを管理し、ブロードキャスト受信機の送信と登録方法は以下の通りである.
  • LocalBroadcastManager.getInstance()取得例
  • ~.registerReceiver()登録ブロードキャスト
  • ~.sendBroadcast()送信ブロードキャスト
  • ~.unregisterReceiver()放送キャンセル
  • 注意事項:
  • ローカルブロードキャストは静的登録によって受信ことができず、システムグローバルブロードキャストよりも効率的である
  • .
  • ブロードキャストでアクティビティを開始するにはFLAG_を追加する必要がありますACTIVITY_NEW_TASKのマーク
  • ブロードキャストでAlertDialogをポップアップするにはTYPE_を追加する必要がありますSYSTEM_ALERT

  • Javaコード:
    public class MainActivity extends AppCompatActivity {
        private IntentFilter intentFilter;
        private LocalReceiver localReceiver;
        private LocalBroadcastManager localBroadcastManager;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //            
            localBroadcastManager = LocalBroadcastManager.getInstance(this);
    
            //           
            intentFilter = new IntentFilter();
            intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
            localReceiver = new LocalReceiver();
            localBroadcastManager.registerReceiver(localReceiver, intentFilter);
    
            //      
            Button button = (Button) findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
                    localBroadcastManager.sendBroadcast(intent);
                }
            });
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
    
            //                
            localBroadcastManager.unregisterReceiver(localReceiver);
        }
    
    
        class LocalReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show();
            }
        }
    }