文章出處

注冊

靜態注冊

  • 新建一個Java類,繼承于android.content.BroadcastReceiver,并實現他的onReceiver()方法,下面就是一個名為MBroadcast的廣播接收者:

    public class MyBroadcast extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,intent.getStringExtra("msg"),Toast.LENGTH_SHORT).show();
    }
    }
    <receiver android:name=".MyBroadcast">
      <intent-filter>
      <action android:name="android.intent.action.MY_BROADCAST"/>
      <category android:name="android.intent.category.DEFAULT"/>
      </intent-filter>
    </receiver>

動態注冊

public class MainActivity extends Activity {

    private MyBroadcast myBroadcast;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myBroadcast = new MyBroadcast();
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.intent.action.MY_BROADCAST");
        registerReceiver(myBroadcast,filter);
    }


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

發送廣播:

        Intent intent = new Intent("android.intent.action.MY_BROADCAST");
        intent.putExtra("msg","hello receiver");
        sendBroadcast(intent);

當收到廣播之后,廣播接收者就會執行onReveiver()方法;

廣播的種類

普通廣播(Normal Broadcast)

  • 普通廣播對于多個接收者來說,完全是異步的,通常每個對象都無需等待即可接受到廣播,接收者直接相互不會有影響,接收者無法終止廣播

有序廣播

  • 我們重點說說有序廣播,有序廣播是按一定的優先級順序發送的(根據android:priority,最大值是int的最大值),廣播一層一層的往下發送,中間可以停在向下發送(abortBroadcast(); ),下面我們創建三個廣播接收者:

    public class FirstBroad extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,intent.getStringExtra("msg")+1,Toast.LENGTH_SHORT).show();
        setResultData("我已經被接受過一次了");
    }
    }
    public class SecondBroad extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,getResultData()+intent.getStringExtra("msg")+2,Toast.LENGTH_SHORT).show();
        setResultData("我已經被接受過二次了");
        //abortBroadcast();
    }
    }
    public class ThirdBroad extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,getResultData()+intent.getStringExtra("msg")+3,Toast.LENGTH_SHORT).show();
    }
    }
  • 注冊有序廣播:

    <receiver android:name=".FirstBroad">
            <intent-filter android:priority="1000">
                <action android:name="android.coderwei.orderbroadcast"/>
            </intent-filter>
        </receiver>
        <receiver android:name=".SecondBroad">
            <intent-filter android:priority="800">
                <action android:name="android.coderwei.orderbroadcast"/>
            </intent-filter>
        </receiver>
    
        <receiver android:name=".ThirdBroad">
            <intent-filter android:priority="500">
                <action android:name="android.coderwei.orderbroadcast"/>
            </intent-filter>
        </receiver>
  • 發送有序廣播:

    Intent intent = new Intent("android.coderwei.orderbroadcast");
        intent.putExtra("msg","hello receiver");
        sendOrderedBroadcast(intent,null);

    其中setResultData可以向下一個廣播接收者發送數據。
    sendOrderedBroadcast(intent,null);中的第二個參數為null的時候,不需要接收者聲明指定的權限,不為null則需要聲明指定的權限,在AndroidManifest.xml中定義一個權限:

    <permission android:name="permission.MY_BROADCAST_PERMISSION" />  

    然后使用這個權限:

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

    然后null改成"permission.MY_BROADCAST_PERMISSION"


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()