編輯:關於android開發
廣播接收者的注冊
Android四大組件都要在清單文件中注冊
廣播接收者比較特殊,既可以在清單文件中注冊,也可以直接使用代碼注冊
有的廣播接收者,必須代碼注冊如 電量改變,屏幕鎖屏和解鎖
使用清單文件配置
<receiver android:name="接收廣播的實現類所在的包">
<intnt-filter>
<android:name="要接收的廣播">
<android:data="">
......
</intent-filter>
</receiver>
通過代碼的實現
//創建廣播接收者對象
receiver = new ScreenOnOffReceiver();
//通過IntentFilter對象指定廣播接收者接收什麼類型的廣播
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
//注冊廣播接收者
registerReceiver(receiver, filter);
解除注冊廣播接收者 解除注冊之後,廣播接收者將失去作用
unregisterReceiver(receiver);
廣播的接收
在Android中,Broadcast是一種廣泛運用的在應用程序之間傳輸信息的機制。
而BroadcastReceiver是對發送出來的Broadcast進行過濾接受並響應的一類組件。
廣播接收者(BroadcastReceiver)用於接收廣播Intent的, 廣播Intent的發送是通過調用sendBroadcast
/sendOrderedBroadcast來實現的。通常一個廣播Intent可以被訂閱了此Intent的多個廣播接收者所接收。
實現一個BroadcastReceiver 接收BroadCast發送的廣播
需求:監聽用戶撥打電話,在用戶撥打電話號碼前自動加上17951等
攔截的廣播:
<action android:name="android.intent.action.NEW_OUTGOING_CALL"></action>
需要的權限:
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
1.新創建一個Android工程《IPCaller》
2.在src目錄下新創建一個類IPCallerReceiver繼承BroadcastReceiver,重寫OnReceive方法。
public class IPCallReveiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//獲取撥打的電話號碼
String resultData = getResultData();
//在電話號碼前加上17951,然後返回數據
setResultData("17951"+resultData);
}
}
3.在AndroidManifest.xml中注冊廣播接收者
<receiver android:name="com.itheima.ipcaller.IPCallReveiver">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.NEW_OUTGOING_CALL"></action>
</intent-filter>
</receiver>
在下面的配置文件中 <intent-filter android:priority="1000">屬性代表著給當前接收者設置優先級,優先級越高越優先接收到廣播(只有有序廣播注冊才有效)
運行上面的代碼,然後撥打電話5556,發現撥出去的號碼已經變為179515556。 運行效果圖如下:
發送自定義廣播
發送無序廣播
無序廣播使用sendBroadcast方法來發送
public void sendBroadcast(View view){
//定義一個意圖
Intent intent = new Intent();
//設置Action 可以接受到該廣播的意圖過濾器
intent.setAction("com.itheima.broadcast");
//綁定數據
intent.putExtra("data", "我是無序廣播數據");
//發送無序廣播
sendBroadcast(intent);
}
發送有序廣播
我們新創建一個項目,來演示無序廣播的發送和接收過程
2.在默認的MainActivity的布局中添加一個按鈕,綁定事件,該事件的核心功能是發送一個有序廣播,MainActivity類代碼清單如下:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void sendOrder(View view) {
// 意圖
Intent intent = new Intent();
//定義動作
intent.setAction("com.itheima.data");
//發送有序廣播
//第一個參數 Intent類型:意圖
//第二個參數 String類型 receiverPermission,接收器需要的權限
//第三個參數BroadcastReceiver類型,自己定義的接收器作為最終接收器
//第四個參數Handler類型,用於執行接收器的回調,如果為null則在主線程中執行
//第五個參數int類型,結果代碼的初始碼
//第六個參數初始化參數
//第七個參數Bundle類型,額外的數據
sendOrderedBroadcast(intent, null, null,
null, RESULT_OK, "1萬元錢", null);
}
3.分別編寫MyReceiver和MyReceiver2類,繼承BroadcastReceiver類
MyReceiver類代碼清單:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
String resultData = getResultData();
Toast.makeText(context, "MyReceiver接收到"+action+"發布的廣播:"+resultData, 1).show();
System.out.println("MyReceiver接收到"+action+"發布的廣播:"+resultData);
}
}
MyReceiver2類代碼清單:
public class MyReceiver2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
String resultData = getResultData();
Toast.makeText(context, "MyReceiver2接收到"+action+"發布的廣播:"+resultData, 1).show();
System.out.println("MyReceiver2接收到"+action+"發布的廣播:"+resultData);
}
}
4.在AndroidManifest.xml中注冊MyReceiver和MyReceiver2:
<receiver android:name="com.itheima.broadcastAndreceiver.MyReceiver">
<intent-filter android:priority="1000">
<action android:name="com.itheima.data"></action>
</intent-filter>
</receiver>
<receiver android:name="com.itheima.broadcastAndreceiver.MyReceiver2">
<intent-filter android:priority="-1000">
<action android:name="com.itheima.data"></action>
</intent-filter>
</receiver>
在上面清單文件中我們給MyReceiver設置了最高優先級1000,給MyReceiver2設置了最低優先級-1000。
5.下面我們分多鐘情況,分別演示有序廣播的接收規律
直接部署上面的工程到模擬器,點擊發送廣播按鈕,控制台結果為:
6.修改MyReceiver類的代碼:在onReceive方法中添加abortBroadcast()方法,
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
String resultData = getResultData();
Toast.makeText(context, "MyReceiver接收到"+action+"發布的廣播:"+resultData, 1).show();
System.out.println("MyReceiver接收到"+action+"發布的廣播:"+resultData);
abortBroadcast();
}
}
然重新部署該工程,運行,點擊發送廣播按鈕。這時控制台打印信息為
這說明優先級高的的廣播接收者可以修改或攔截廣播 優先級低的廣播接收者收到修改後的廣播或收不到廣播
7.在第二種情況的基礎上,我們修改MainActivity類中sendOrder方法,修改sendOrderedBroadcast中第三個參數,指定一個最終接收器
public void sendOrder(View view) {
// 意圖
Intent intent = new Intent();
intent.setAction("com.itheima.data");
sendOrderedBroadcast(intent, null, new MyReceiver2(),
null, RESULT_OK, "1萬元錢", null);
}
運行上面的項目,我們可以控制台輸出如下信息:
雖然在MyReceiver中我們調用了abortBroadcast();方法,但是廣播依然被MyReceiver2接收到。原因是我們在sendOrderedBroadcast方法中指定了MyReceiver2接收器為最終接收器,因此該廣播被終止的時候MyReceiver2接收器依然可以接收到廣播。
8.在第3種情形的基礎上,我們修改MyReceiver類,我們將該類中的onReceive方法中的abortBroadcast();方法去掉。然後運行上面工程。發現控制台輸入如下信息
我們發現MyReceiver第一個接收到廣播,MyReceiver2第二個接收到廣播,然後MyReceiver2又接收到一次廣播。對的,結果確實是這樣,因為我們在sendOrderedBroadcast方法中,將MyReceiver2作為最終接收器,那麼我們發出的廣播會被所有符合條件的接收器接收,最後指定的最終接收器不管是否已經接收過信息依然會再次接收。
Adroid: getExternalStorageDirectory 不一定是你想要的外部存儲SdCard,adroidsdcard 前情提要:我的測試機是華為榮耀6
分析和優化應用電量 在Android項目中, 較難監控應用的電量消耗, 但是用戶卻非常關心手機的待機時間. 過度耗電的應用, 會遭到用戶無情的卸載, 不要存在僥幸心理
如何正確配置Nginx+PHP導讀對很多人而言,配置Nginx+PHP無外乎就是搜索一篇教程,然後拷貝粘貼。聽上去似乎也沒什麼問題,可惜實際上網絡上很多資料本身年久失修,
Android之自動文本輸入識別提示,android文本識別 相信大家都熟悉自動識別提示吧,在我們的生活中隨處可見,今天就讓我為大家簡單介紹一下它是如何設計的。 所
[FastDev4Android框架開發]神器ViewGragHelpe