編輯:關於Android編程
很多時候,我們希望一個應用程序在它沒有運行起來的時候,也能感知系統狀態的某些變化,如果條件合適,就讓這個應用就運行起來。
比如,一個攔截騷擾電話的應用,平時它可能並不需要運行起來,它只關心有電話來的時候,看看這個號碼是不是騷擾電話的號碼,如果是就給用戶發出一個提示,如果不是,那就和它沒有關系,啥也不做。
為了實現這類功能,安卓系統引入了四大組件之一的BroadcastReceiver
,設計了一套廣播與接收的機制,
Broadcast
; 信息在系統中按照一定的規則傳播(傳播的規則稍後會詳細介紹); 任何應用或者安卓系統的自身組件都擁有一台接收機
-Broadcast Receiver
,這台接收機
會告訴安卓系統,它能接收某種特定的廣播; 如果安卓系統辨別出當前系統中傳播的廣播,正是某台接收機
關注的廣播,那麼它就會把接收機
運行起來,讓接收機
決定下一步怎麼做?是讓接收機
運行別的組件(Service或者Activity
)繼續進一步的響應,還是忽略這條廣播。
無論是應用還是系統組件,它們定義Broadcast Receiver
的方式都是一樣。
定義Broadcast Receiver
有兩種方式,
靜態定義:將Broadcast Receiver
聲明到AndroidManifest.xml
配置文件當中,它的特點是應用不必運行起來,系統能通過配置文件的描述判斷當前系統中的廣播是否是這台接收機關注的;
動態定義:在代碼中動態生成Broadcast Receiver
,它的特點是應用要運行起來,在運行的過程當中判斷當前系統中的廣播是否是這台接收機關注的;
首先來看看如何定義一個靜態的Broadcast Receiver
。
繼承BroadcastReceiver
類,實現它的onReceive
接口,
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
//實現onReceive接口,當收到指定的廣播後被觸發
@Override
public void onReceive(Context context, Intent intent) {
//添加對應的邏輯處理
}
}
在AndroidManifest.xml
配置文件當中,聲明創建的Broadcast Receiver
,
---指定關注的廣播
這裡intent-filter
標簽中的android:name
屬性設置的值custom.action.mybroadcast
,就是這台接收機
關注的廣播。
當名稱為custom.action.mybroadcast
的廣播在系統中傳播的時候,MyReceiver
就會被運行起來,並觸發它的onReceive()
函數。開發者就需要在這裡添加對應邏輯處理。
當應用運行起來以後,即使AndroidManifest.xml
文件中沒有聲明過Broadcast Receiver
也沒有關系,它可以被動態的創建,
和創建靜態Broadcast Receiver
類似,首先要繼承BroadcastReceiver
類,實現它的onReceive
接口,
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
//實現onReceive接口,當收到指定的廣播後被觸發
@Override
public void onReceive(Context context, Intent intent) {
//添加對應的邏輯處理
}
}
注冊Broadcast Receiver
,並告訴系統這個Broadcast Receiver
關注哪些廣播,可以添加多種關心的廣播,
//設置過濾器,確定關心的廣播
IntentFilter filter = new IntentFilter();
filter.addAction("custom.action.mybroadcast");
//可以添加多種關心的廣播
filter.addAction(......);
//創建Receiver
MyReceiver receiver = new MyReceiver();
//注冊到系統當中,完成Receiver的設置
registerReceiver(receiver, filter);
使用完畢後,一定要注銷Broadcast Receiver
,否則系統會給出警告提示。
unregisterReceiver(receiver);
動態的Broadcast Receiver
在注冊使用完成之後一定要注銷,不然會占用系統資源、浪費資源。
/*******************************************************************/
* 版權聲明
* 本教程只在CSDN和安豆網發布,其他網站出現本教程均屬侵權。
/*******************************************************************/
任何應用或者安卓系統的自身組件可以向系統發出廣播信息Broadcast
,只要使用Context
的sendBroadcast()
方法就可以了,
unregisterReceiver(receiver);
Intent i = new Intent("custom.action.mybroadcast");
sendBroadcast(i);
發送出去的廣播可以分成兩類,一類是無序廣播,一類是有序廣播。
這是一種不需要考慮接收者接收順序的廣播,比如說有3個接收機
,都關注custom.action.mybroadcast
這種廣播,無所謂誰先收到誰後收到。接收機
不能阻止其它接收機
獲取到這條廣播。
發送無序廣播,只要使用Context
的sendBroadcast()
方法就可以了,
Intent i = new Intent("custom.action.mybroadcast");
sendBroadcast(i);
在AndroidManifest.xml
中聲明靜態Broadcast Receiver
的時候,
就像前面介紹的那樣,不用做什麼特別的處理。
這是一種需要考慮接收者接收順序的廣播,比如說有3個接收機
,都關注custom.action.mybroadcast
這種廣播,那麼安卓系統將根據這3個接收機
聲明的優先級進行廣播的投遞。
而且有序廣播是可以被阻截的。
比如,一個廣播按照順序傳遞給3個接收機
-A B C,但是B將廣播攔截了,因此C將不會收到這個廣播。
Intent i = new Intent("custom.action.mybroadcast");
sendOrderedBroadcast(i, null);
接收的時候,需要給intent-filter
標簽設置android:priority
屬性,表示這個接收機
的優先級。優先級從-1000到1000,數值越大,優先級越高。
接收到廣播以後,Broadcast Receiver
可以將廣播攔截,禁止它往下傳播,
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
//實現onReceive接口
@Override
public void onReceive(Context context, Intent intent) {
//禁止往下傳播
abortBroadcast();
}
}
如果接收機1
在onReceive()
中,希望把數據傳遞給下個接收機2
,
接收機1
可以使用setResultExtras()
方法,
public class MyReceiver1 extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Bundle b = new Bundle();
b.putString("data", "this data from MyReceiver");
setResultExtras(b);
}
}
在接收機2
中,
public class MyReceiver2 extends BroadcastReceiver {
public MyReceiver2() {
}
@Override
public void onReceive(Context context, Intent intent) {
Bundle b = getResultExtras(true);
if(b!=null)
{
//data就是前一個接收機1傳來的-this data from MyReceiver
String data = b.getString("data");
}
}
}
假如希望將數據放到onReceive()
傳入的Intent
當中,是不會傳遞成功的,
@Override
public void onReceive(Context context, Intent intent) {
//這是不會成功的
intent.putExtra("data", "this data from MyReceiver");
}
傳遞數據,一定要通過BroadcastReceiver
提供的setResultExtras()
方法。
另外,測試發現,只要不在有序廣播之間傳遞數據,使用sendBroadcast()
方法,也能成功發出有序廣播。
Intent i = new Intent("custom.action.mybroadcast");
sendBroadcast(i);
注意:本文中的代碼必須使用OpenCV3.0或以上版本進行編譯,因為很多函數是3.0以後才加入的。 問題簡化終於有時間來填坑了,這次一口氣將雙目重建擴展為多目重建吧。首先
前言:Android自定義View對於剛入門乃至工作幾年的程序員來說都是非常恐懼的,但也是Android進階學習的必經之路,平時項目中經常會有一些苛刻的需求,
PopupMenu基本用法PopupMenu是種顯示位置不固定的彈出菜單,因為它顯示在參照控件下方,所以展示位置隨著參照控件的位置變化而變化。而其他幾種菜單的顯示位置都是
3. public LineChartTools( LinkedList