標籤:
BroadcastReceiver:廣播接收者。用來接收系統或應用中的廣播。
在Android系統中,廣播體現在方方面面,例如當開機完成後系統會產生一條廣播,接收到這條廣播就能實現開機啟動服務的功能;當網路狀態改變時系統會產生一條廣播,接收到這條廣播就能及時地做出提示和儲存資料等操作;當電池電量改變時,系統會產生一條廣播,接收到這條廣播就能在電量低時告知使用者及時儲存進度,等等。
Android中的廣播機制設計的非常出色,很多事情原本需要開發人員親自操作的,現在只需等待廣播告知自己就可以了,大大減少了開發的工作量和開發週期。而作為應用開發人員,就需要數練掌握Android系統提供的一個開發利器,那就是BroadcastReceiver。下面我們就對BroadcastReceiver逐一地分析和演練,瞭解和掌握它的各種功能和用法。
靜態註冊:
1 <receiver android:name=".MyReceiver">2 <intent-filter>3 <action android:name="android.intent.action.MY_BROADCAST" />4 <category android:name="android.intent.category.DEFAULT" />5 </intent-filter>6 </receiver>
廣播接收者:
1 package com.example.hxdn.broadcastreceivertest; 2 3 import android.content.BroadcastReceiver; 4 import android.content.Context; 5 import android.content.Intent; 6 import android.util.Log; 7 8 /** 9 * Created by hxdn on 2015/9/17.10 */11 public class MyReceiver extends BroadcastReceiver {12 private static final String TAG="MyReceiver";13 @Override14 public void onReceive(Context context,Intent intent)15 {16 String msg=intent.getStringExtra("msg");17 Log.i(TAG,msg);18 }19 }
Activity:
1 package com.example.hxdn.broadcastreceivertest; 2 3 import android.content.Intent; 4 import android.content.IntentFilter; 5 import android.support.v7.app.AppCompatActivity; 6 import android.os.Bundle; 7 import android.view.Menu; 8 import android.view.MenuItem; 9 import android.view.View;10 import android.widget.Button;11 12 public class MainActivity extends AppCompatActivity {13 14 15 MyReceiver myReceiver=null;16 IntentFilter intentFilter=null;17 private Button btn1=null;18 @Override19 protected void onCreate(Bundle savedInstanceState) {20 super.onCreate(savedInstanceState);21 setContentView(R.layout.activity_main);22 init();//動態註冊時加入23 btn1=(Button)findViewById(R.id.btn1);24 btn1.setOnClickListener(new View.OnClickListener() {25 @Override26 public void onClick(View v) {27 send();28 }29 });30 31 }32 public void init()33 {34 35 myReceiver=new MyReceiver();36 intentFilter=new IntentFilter();37 intentFilter.addAction("android.intent.action.MY_BROADCAST");38 registerReceiver(myReceiver,intentFilter);39 }40 41 @Override42 public boolean onCreateOptionsMenu(Menu menu) {43 // Inflate the menu; this adds items to the action bar if it is present.44 getMenuInflater().inflate(R.menu.menu_main, menu);45 return true;46 }47 48 @Override49 public boolean onOptionsItemSelected(MenuItem item) {50 // Handle action bar item clicks here. The action bar will51 // automatically handle clicks on the Home/Up button, so long52 // as you specify a parent activity in AndroidManifest.xml.53 int id = item.getItemId();54 55 //noinspection SimplifiableIfStatement56 if (id == R.id.action_settings) {57 return true;58 }59 60 return super.onOptionsItemSelected(item);61 }62 public void send()63 {64 Intent intent=new Intent("android.intent.action.MY_BROADCAST");65 intent.putExtra("msg","Hello Receiver");66 sendBroadcast(intent);67 }68 @Override69 public void onDestroy()70 {71 super.onDestroy();72 unregisterReceiver(myReceiver);73 }74 }
動態註冊:
public void init()33 {34 35 myReceiver=new MyReceiver();36 intentFilter=new IntentFilter();37 intentFilter.addAction("android.intent.action.MY_BROADCAST");38 registerReceiver(myReceiver,intentFilter);39 }
需要解除綁定:
public void onDestroy()70 {71 super.onDestroy();72 unregisterReceiver(myReceiver);73 }
否則會拋出異常。
普通廣播:普通廣播對於多個接收者來說是完全非同步,通常每個接收者都無需等待即可以接收到廣播,接收者相互之間不會有影響。對於這種廣播,接收者無法終止廣播,即無法阻止其他接收者的接收動作。且再次點擊發送按鈕,我們會發現,控制台中三個接收者仍然都列印了自己的日誌,表明接收者並不能終止廣播。abortBroadcast(); //不可用。
有序廣播:有序廣播比較特殊,它每次只發送到優先順序較高的接收者那裡,然後由優先順序高的接受者再傳播到優先順序低的接收者那裡,優先順序高的接收者有能力終止這個廣播。
在AndroidManifest.xml的廣播註冊時加上<intent-filter android:priority="1000">
- <receiver android:name=".FirstReceiver">
- <intent-filter android:priority="1000">
- <action android:name="android.intent.action.MY_BROADCAST"/>
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </receiver>
android:priority的值從-1000到1000值越大許可權越大。
- public void send(View view) {
- Intent intent = new Intent("android.intent.action.MY_BROADCAST");
- intent.putExtra("msg", "hello receiver.");
- sendOrderedBroadcast(intent, "scott.permission.MY_BROADCAST_PERMISSION"); //第二參數不為null則需要許可權
- }
使用sendOrderedBroadcast方法發送有序廣播時,需要一個許可權參數,如果為null則表示不要求接收者聲明指定的許可權,如果不為null,則表示接收者若要接收此廣播,需聲明指定許可權。這樣做是從安全形度考慮的,例如系統的簡訊就是有序廣播的形式,一個應用可能是具有攔截垃圾簡訊的功能,當簡訊到來時它可以先接受到簡訊廣播,必要時終止廣播傳遞,這樣的軟體就必須聲明接收簡訊的許可權。
設定許可權則發出的廣播只有當你有許可權時才能收到。
android:priority值越大則代表這個接受者優先順序越高。優先順序越高可先處理廣播。
優先順序高的廣播可用abortBroadcast();終止這個廣播。
Android開發之BroadcastReceiver