編輯:關於Android編程
BroadcastReceiver,顧名思義就是“廣播接收者”的意思,它是Android四大基本組件之一,這種組件本質上是一種全局的監聽器,用於監聽系統全局的廣播消息。它可以接收來自系統和應用的的廣播。
由於BroadcastReceiver是一種全局的監聽器,因此它可以非常方便地實現系統不同組件之間的通信。比如Activity與通過startService()方法啟動的Service之間通信,就可以借助於BroadcastReceiver來實現。
BroadcastReceiver用於接收程序(包括系統程序和一般應用)通過sendBroadcast()方法發出的Broadcast intents。
1) 創建需要啟動BroadcastReceiver的Intent。
2) 調用Context的sendBroadcast
()或sendOrderedBroadcast
()方法來啟動指定的BroadcastReceiver。其中sendBroadcast
發送的是普通廣播,sendOrderedBroadcast發送的是有序廣播。
當應用發出一個Broadcast Intent之後所匹配該Intent的組件都可能被啟動。
第一步:創建BroadcastReceiver的子類:
由於BroadcastReceiver本質上是一種監聽器,所以創建BroadcastReceiver的方法也非常簡單,只需要創建一個BroadcastReceiver的子類然後重寫onReceive (Context context, Intentintent)方法即可。
具體代碼如下:
public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String msg=intent.getExtras().get("msg").toString(); Toast.makeText(context,"intent.getAction()"+intent.getAction().toString(), Toast.LENGTH_LONG).show(); System.out.println("msg:"+msg); } }
一旦實現了BroadcastReceiver,接下就應該指定該BroadcastReceiver能匹配的Intent即注冊BroadcastReceiver。注冊BroadcastReceiver的方式有兩種:
第一種是靜態注冊:這種方法是在配置AndroidManifest.xml配置文件中注冊,通過這種方式注冊的廣播為常駐型廣播,也就是說如果應用程序關閉了,有相應事件觸發,程序還是會被系統自動調用運行。例如:
//通過代碼的方式動態注冊MyBroadcastReceiver MyBroadcastReceiver receiver=new MyBroadcastReceiver(); IntentFilter filter=new IntentFilter(); filter.addAction("android.intent.action.MyBroadcastReceiver"); //注冊receiver registerReceiver(receiver, filter);
@Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); //當Activity銷毀的時候取消注冊BroadcastReceiver unregisterReceiver(receiver); }
BroadcastReceiver的生命周期,從對象調用它開始,到onReceiver方法執行完成之後結束。另外,每次廣播被接收後會重新創建BroadcastReceiver對象,並在onReceiver方法中執行完就銷毀,如果BroadcastReceiver的onReceiver方法中不能在10秒內執行完成,Android會出現ANR異常。所以不要在BroadcastReceiver的onReceiver方法中執行耗時的操作。
如果需要在BroadcastReceiver中執行耗時的操作,可以通過Intent啟動Service來完成。但不能綁定Service。
特別是,您可能無法從一個BroadcastReceiver中顯示一個對話框,或綁定到服務。對於前者,則應該使用NotificationManager的API。對於後者,你可以使用Context.startService()來啟動一個Service。
Broadcast的類型有兩種:普通廣播和有序廣播。
Normal broadcasts(普通廣播):Normal broadcasts是完全異步的可以同一時間被所有的接收者接收到。消息的傳遞效率比較高。但缺點是接收者不能講接收的消息的處理信息傳遞給下一個接收者也不能停止消息的傳播。
Ordered broadcasts(有序廣播):Ordered broadcasts的接收者按照一定的優先級進行消息的接收。如:A,B,C的優先級依次降低,那麼消息先傳遞給A,在傳遞給B,最後傳遞給C。優先級別聲明在
發送並接收普通和有序廣播:
運行效果圖:
實例代碼:
MainActivity.java:發送廣播:
package com.jph.broadcastreceiverdemo; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.app.Activity; import android.content.Intent; /** * Describe: *MyBroadcastReceiver.java:接收廣播
本實例有兩個優先級別不同的廣播接收器 *
通過發送普通廣播,和有序廣播來學習 *
BroadcastReceiver的原理 *
@author jph *
@Date:2014.08.05 * */ public class MainActivity extends Activity { MyBroadcastReceiver receiver; Button btnSend,btnSend2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnSend=(Button)findViewById(R.id.btnSend); btnSend2=(Button)findViewById(R.id.btnSend2); receiver=new MyBroadcastReceiver(); OnClickListener listener=new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.btnSend: Intent intent=new Intent(); intent.setAction("android.intent.action.MyBroadcastReceiver"); intent.putExtra("msg", "我在發送廣播!這只是一個普通的廣播," + "你們無法通過abortBroadcast()的方式停止廣播的傳播," + "也無法往Broadcast中存入數據因為它是異步的"); sendBroadcast(intent); break; case R.id.btnSend2: Intent intent2=new Intent(); intent2.setAction("android.intent.action.MyBroadcastReceiver"); intent2.putExtra("msg", "我在發送個有序的廣播," + "你們可以通過abortBroadcast()的方式停止廣播的傳播," + "也可以往Broadcast中存入數據"); sendOrderedBroadcast(intent2, null); break; default: break; } } }; btnSend.setOnClickListener(listener); btnSend2.setOnClickListener(listener); } }
package com.jph.broadcastreceiverdemo; import java.text.SimpleDateFormat; import java.util.Date; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; /** * Describe: *SecondBroadcastReceiver.java接收廣播
@author jph *
@Date:2014.08.05 * */ public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String msg=intent.getExtras().get("msg").toString(); setResultData("MyBroadcastReceiver接收到廣播"); Toast.makeText(context,"時間:"+new SimpleDateFormat("yyyy-MM-dd hh.mm.ss").format(new Date()) +"\nMyBroadcastReceiver收到Action名為:"+intent.getAction().toString() +"的廣播 \nComponent:"+intent.getComponent() +"\nmsg:"+msg, Toast.LENGTH_LONG).show(); } }
package com.jph.broadcastreceiverdemo; import java.text.SimpleDateFormat; import java.util.Date; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; /** * Describe: *配置文件AndroidManifest.xml:
@author jph *
@Date:2014.08.05 * */ public class SecondBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String msg=intent.getExtras().get("msg").toString(); String result=getResultData(); Toast.makeText(context,"時間:"+new SimpleDateFormat("yyyy-MM-dd hh.mm.ss").format(new Date()) +"\nSecondBroadcastReceiver收到Action名為:"+intent.getAction().toString() +"的廣播 \nComponent:"+intent.getComponent() +"\nmsg:"+msg+"\n上一個接受者傳來的reult:"+result, Toast.LENGTH_LONG).show(); } }
背景相信大家對Android Studio已經不陌生了,Android Studio是Google於2013 I/O大會針對Android開發推出的新的開發工具,目前很多
支付寶的快捷支付Android版業務流程比較麻煩,出現的意外情況比較多.在此,簡單說下開發流程以及出現錯誤的解決方案; 1.注冊支付業務.這裡不在贅述.建立數據安全傳輸所
概述:與Android的Animation控件相比,Animator與LayoutAnimator處理後的控件完成動畫效果後不會回復原狀。Animator只使用與View
CollapsingToolbarLayout作用是提供了一個可以折疊的Toolbar,它繼承至FrameLayout,給它設置layout_scrollFlags,它可