編輯:關於Android編程
BroadcastReceiver是用用於接受程序所放出的Broadcast Intent,與應用程序啟動的Activity、Service相同。也只需要兩步:
①、創建需要啟動的Broadcast的Intent
②、創建一個類繼承BroadcastReceiver,在清單文件中注冊Receiver,調用content的SendBroadcast()或sendOrderedBroadcast()(發送有序廣播)的方法來啟動指定的BroadcastReceiver
注:當應用程序發出一個Broadcast Intent之後,所有匹配該Intent的BroadcastReceiver都會啟動。如果你不需要發送廣播跨應用程序,考慮使用 這類 LocalBroadcastManager
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_startbroadcast
= (Button) this.findViewById(R.id.bt_startbroadcast);
bt_startbroadcast.setOnClickListener(new View.OnClickListener()
{
public void onClick(View
v) {
Intent
intent = new Intent(MainActivity.this,
myBroadcast.class);
intent.putExtra("broadcast", "hello,world!
broadcast");
sendBroadcast(intent);
}
});
}
public void onReceive(Context
context, Intent intent) {
Toast.makeText(context,"receiver-----" +
intent.getStringExtra("broadcast"), 1).show();
}
正常播放 (發送 Context.sendBroadcast )是完全異步的。 所有的BroadcastReceiver是運行在一個未定義的順序,常常在同一時間。 這時效率更高,但是意味著BroadcastReceiver器,不能使用結果或中止 。
有序廣播 (發送 Context.sendOrderedBroadcast )交付給一個BroadcastReceiver。 因為每個BroadcastReceiver執行後返回值,它可以傳播到下一個BroadcastReceiver,也可以完全通過abortBroadcast()方法終止廣播,這樣它就不會通過再通過後面的BroadcastReceiver兩人。 在清單文件中可以控制運行 android:priority="" 的屬性匹配intent-filter;BroadcastReceiver相同的優先級將運行在一個任意的順序。
public class MainActivity extends Activity
{
private Button
bt_start;
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_start
= (Button) this.findViewById(R.id.bt_start);
bt_start.setOnClickListener(new View.OnClickListener()
{
public void onClick(View
v) {
Intent
intent = new Intent();
intent.setAction("abc");
intent.putExtra("name", "hello,BroadcastReceivcer");
sendBroadcast(intent);
}
});
}
1
2
3
4
public void onReceive(Context
arg0, Intent intent) {
String
name = intent.getStringExtra("name");
System.out.println("one=======" +
name);
}
<receiver android:name="com.example.broadcast_order.One" >
<intent-filter android:priority="10" >
<action android:name="abc" />
intent-filter>
receiver>
public class Two extends BroadcastReceiver
{
public void onReceive(Context
arg0, Intent intent) {
String
name = intent.getStringExtra("name");
System.out.println("Two=======" +
name);
//
取消Broadcast繼續傳遞
abortBroadcast();
}
}
<receiver android:name="com.example.broadcast_order.Two" >
<intent-filter android:priority="12" >
<action android:name="abc"/>
intent-filter>
receiver>
由於BroadcastReceiver本質上屬於一個監聽器,因此實現BroadcastReceiver的方法也十分簡單,只要重寫BroadcastReceiver方法中的onReceiv(Content content,Intent intent)方法即可。
每次系統Broadcast事件發生後,系統就會創建對應的BroadcastReceiver的實例,並且自動觸發他的onReceive()方法,onReceive()方法執行完後,Broadcast的實例就會被銷毀。也就是說Broadcast的生命周期就是onReceive()這個方法。
如果Broadcast的onReceive()方法不能在10秒內執行完成,Android會認為該程序無響應。所以不要在BroadcastReceiver的onReceive()方法中執行一些耗時操作,否則會彈出ANR的對話框。若必須要執行比較耗時的操作,則要考慮Intent的啟動一個Service來完成操作。不應該考慮使用新線程去完成耗時的操作,因為BroadcastReceiver的生命周期太短了。
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_startbroadcast
= (Button) this.findViewById(R.id.bt_startbroadcast);
bt_startbroadcast.setOnClickListener(new View.OnClickListener()
{
public void onClick(View
v) {
//
指定Broadcast能匹配Intent的方法有兩種,一種是清單文件中寫配置,一種是代碼指定如下
IntentFilter
filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
myBroadcast
receiver = new myBroadcast();//
new出自定義BroadcastReceiver的類
registerReceiver(receiver,filter);
}
});
}
public void onReceive(Context
context, Intent intent) {
if (intent.getAction().equals(intent.ACTION_BATTERY_CHANGED))
{
//
獲取當前電量
int level
= intent.getIntExtra("level", 0);
//
獲取總的電量
int scale
= intent.getIntExtra("scale", 100);
Toast.makeText(context, "電池電量為:" +
((level * 100)
/ scale) + "%", 1).show();
}
注意要在清單文件中添加獲取電量權限狀態的權限:
在自定義的BroadcastReceiver中啟動activities或Service
1 2 3 4 5public void onReceive(Context
context, Intent intent) {
Intent
intent1 = new Intent(context,
BootActivity.class);
intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//注冊Activity時要使用setFlag()。Service不用
context.startActivity(intent1);
}
清單文件中注冊Receiver
1 2 3 4 5 6<receiver android:name="com.example.BroadcastReceiverDemo.myBroadcast" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.HOME" />
intent-filter>
receiver>
增加開機訪問的權限:
Android編程開發之RadioGroup用法實例
本文實例講述了Android編程開發之RadioGroup用法。分享給大家供大家參考,具體如下:RadioGroup 有時候比較有用.主要特征是給用戶提供多選一機制。Ma
仿墨跡天氣在Android App中實現自定義zip皮膚更換
在這裡談一下墨跡天氣的換膚實現方式,不過首先聲明我只是通過反編譯以及參考了一些網上其他資料的方式推測出的換膚原理, 在這裡只供參考. 若大家有更好的方式, 歡迎交流.墨跡
如何借助 HealthKit 打造一款健身應用?
根據新聞報導,健康與健美在今時今日的重要程度比已往任何時候都高。說起來有點可笑,似乎就在幾天之前,筆者就見到過類似的新聞。或許,這是當人逐漸變老之後揮之不去的感覺吧&md
Android仿微信圖片選擇器
很多項目要用到圖片選擇控件,每次都要寫一大堆邏輯。於是基於圖片選擇組件(PhotoPicker)封裝了一個控件PhotoUploadView。方便簡易,一鍵集成,幾句代碼