Android組件——Broadcast Receiver

Android中的每個應用程序都可以對自己感興趣的廣播進行註冊,這樣改程序就只會接收到自己所關心的廣播內容,廣播內容可能來自系統和其他應用程序。

廣播接收器可以自由地對自己感興趣的廣播進行註冊。註冊廣播的方式一般有兩種,在代碼中註冊和在AndroidManifest.xml中註冊,前者也叫動態註冊,後者也叫靜態註冊。

創建一個廣播接收器

創建一個廣播接收器需要新建一個類,繼承BroadcastReceiver,並重寫父類的onReceive()方法

public class MyBroadCastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"接收到了廣播",Toast.LENGTH_LONG).show();
    }
}

廣播接收器的註冊

在代碼中註冊

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button mButtonSend;
    private Button mButtonAlarm;
    private Button mButtonCancelAlarm;
    private IntentFilter mIntentFilter;
    private MyBroadCastReceiver mMyReceiver;
    private AlarmManager mAlarmManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButtonSend= (Button) findViewById(R.id.button_send);
        mButtonSend.setOnClickListener(this);
        mButtonAlarm= (Button) findViewById(R.id.button_alarm);
        mButtonAlarm.setOnClickListener(this);
        mButtonCancelAlarm= (Button) findViewById(R.id.button_cancel_alarm);
        mButtonCancelAlarm.setOnClickListener(this);
        mIntentFilter=new IntentFilter();
        mMyReceiver=new MyBroadCastReceiver();
        mIntentFilter.addAction("com.broadcastreceiver");
        registerReceiver(mMyReceiver,mIntentFilter);//在代碼中註冊廣播接收器,也叫動態註冊
        mAlarmManager= (AlarmManager) getSystemService(ALARM_SERVICE);
         Intent intent=new Intent();
        intent.setAction("com.broadcastreceiver");
        sendBroadcast(intent);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mMyReceiver);//當活動關閉時,要取消註冊
    }

動態註冊的廣播接收器一定都要取消註冊纔行

在Manifest中註冊

 <receiver android:name=".MyBroadCastReceiver">
            <intent-filter>
                <action android:name="com.broadcastreceiver"/>
            </intent-filter>
        </receiver>

利用廣播寫一個小鬧鐘的例子

首先還是要寫一個繼承自BrodcastReceiver類的一個廣播接收類

package com.example.administrator.mybroadcast;


import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private Button mButtonAlarm;
    private Button mButtonCancelAlarm;
    private IntentFilter mIntentFilter;
    private MyBroadCastReceiver mMyReceiver;
    private AlarmManager mAlarmManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mButtonAlarm= (Button) findViewById(R.id.button_alarm);
        mButtonAlarm.setOnClickListener(this);
        mButtonCancelAlarm= (Button) findViewById(R.id.button_cancel_alarm);
        mButtonCancelAlarm.setOnClickListener(this);
        mIntentFilter=new IntentFilter();
        mMyReceiver=new MyBroadCastReceiver();
        mIntentFilter.addAction("com.broadcastreceiver");
        registerReceiver(mMyReceiver,mIntentFilter);//在代碼中註冊廣播接收器,也叫動態註冊
        mAlarmManager= (AlarmManager) getSystemService(ALARM_SERVICE);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()){

            case R.id.button_alarm:
                alarm();
                break;
            case R.id.button_cancel_alarm:
                cancelAlarm();
                break;
            default:
                break;
        }
    }

    private void cancelAlarm() {
        Intent intent=new Intent();
        intent.setAction("com.broadcastreceiver");
        PendingIntent pendingIntent=PendingIntent.getBroadcast(getApplicationContext(),121,intent,PendingIntent.FLAG_UPDATE_CURRENT);
        mAlarmManager.cancel(pendingIntent);
    }

    private void alarm() {
        Intent intent=new Intent();
        intent.setAction("com.broadcastreceiver");
        PendingIntent pendingIntent=PendingIntent.getBroadcast(getApplicationContext(),121,intent,PendingIntent.FLAG_UPDATE_CURRENT);
        mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+3000,4000,pendingIntent);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mMyReceiver);//當活動關閉時,要取消註冊
    }
}

接收來自系統的廣播

在Manifest中添加action,需要監聽什麼就些什麼,需要注意到的是有些是需要權限的。

//權限
<uses-permission android:name="android.permission.broadcast_package_removed"/>
    <uses-permission android:name="ANDROID.PERMISSION.CHANGE_NETWORK_STATE"/>
    //action
 <receiver android:name=".MyBroadCastReceiver">
            <intent-filter>

                <action android:name="android.intent.action.PACKAGE_REMOVED"></action>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"></action>
            </intent-filter>
        </receiver>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章