編輯:關於Android編程
1.發送廣播,這裡以Activity為例,在Activity的onCreate中發送一個廣播
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent(); //這條廣播的標志 intent.setAction("broadcast_test"); //攜帶數據 intent.putExtra("msg", "這是自定義靜態廣播消息"); //發送廣播 sendBroadcast(intent); } }
2.創建廣播接收者,新建一個類繼承於BroadCastReceiver,實現其中的onReceive方法
public class MyReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub //獲得廣播中的數據 String msg = intent.getStringExtra("msg"); //模擬響應 Toast.makeText(context, msg, 1000).show(); } }
3.在AndroidManifest.xml中注冊我們定義好的廣播
注意:action標簽的name一定要與第一步中intent所設置的action一致,才能收到廣播
運行
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //動態注冊receiver的Intent過濾器和action IntentFilter filter = new IntentFilter(); filter.addAction("broadcast_test"); registerReceiver(new MyReceiver(), filter); Intent intent = new Intent(); //這條廣播的標志 intent.setAction("broadcast_test"); //攜帶數據 intent.putExtra("msg", "這是自定義動態廣播消息"); //發送廣播 sendBroadcast(intent); } }
可以看到,這裡與靜態的不同就在於多了IntentFileter的生成和receiver的注冊,相當於將在xml中receiver的注冊變成用代碼來進行注冊
2.同樣需要有廣播接收者,新建一個類繼承於BroadCastReceiver,實現其中的onReceive方法
public class MyReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub //獲得廣播中的數據 String msg = intent.getStringExtra("msg"); //模擬響應 Toast.makeText(context, msg, 1000).show(); } }
運行
上面演示了如何靜態和動態發送自定義廣播,下面通過手機飛行模式的開關來演示如何靜態和動態接收來自系統的廣播
public class MyReceiver extends BroadcastReceiver{ //用來作為標志,判斷是開啟還是關閉 private static int count = 0; //如果是飛行模式狀態變化的廣播,就執行操作 @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub //每改變一次飛行狀態,count就+1 count++; switch (count%2) { //如果余數為1,說明count是奇數,也就是操作--->開啟飛行模式 case 1: Toast.makeText(context, "開啟飛行模式", 1000).show(); break; //如果余數為0,說明count是偶數,也就是操作--->關閉飛行模式 case 0: Toast.makeText(context, "關閉飛行模式", 1000).show(); break; } } }
2.在AndroidManifest中注冊該廣播接收者
注意這裡用的action是android.intent.action.AIRPLANE_MODE,這是由系統提供的當手機飛行狀態改變時發出的廣播,正是因為此處將MyReceiver注冊為接收指定的系統廣播,才會在onReceive中接收到這個廣播
public class MyReceiver extends BroadcastReceiver{ //用來作為標志,判斷是開啟還是關閉 private static int count = 0; //如果是飛行模式狀態變化的廣播,就執行操作 @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub //每改變一次飛行狀態,count就+1 count++; switch (count%2) { //如果余數為1,說明count是奇數,也就是操作--->開啟飛行模式 case 1: Toast.makeText(context, "開啟飛行模式", 1000).show(); break; //如果余數為0,說明count是偶數,也就是操作--->關閉飛行模式 case 0: Toast.makeText(context, "關閉飛行模式", 1000).show(); break; } } }
2.在Activity中對它進行注冊
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); IntentFilter filter = new IntentFilter(); //這裡將飛行模式改變的Action添加到過濾器中 filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); registerReceiver(new MyReceiver(), filter); } }
運行
在上面的動態注冊自定義廣播的例子中,如果你嘗試將當前應用程序kill掉,就會發現Logcat報出如下錯誤:
從報錯信息中可以看出,是由於我們是動態注冊的自定義廣播,所以在Activity被銷毀時,廣播接收者將不再接收相應的廣播,系統要求必須注銷該廣播
解決方法很簡單,只需要在Activity的onDestroy方法中,調用unregisterReceiver(myreceiver);就可以在Activity退出時注銷廣播:
@Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); unregisterReceiver(myreceiver); }
有序廣播
上面所演示的廣播都是通過sendBroadcast發送出去的,是無序的廣播,有時候廣播接收者是有多個的,如果我們需要將它們設定一定的優先級,就需要通過sendOrderedBroadcast()來發送有序廣播
下面通過自定義三個廣播接收者和一個廣播發送者,演示如何使用有序廣播:
1.創建三個廣播接收者
MyFirstReceiver.java:
public class MyFirstReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String msg = intent.getStringExtra("msg"); Log.d("MyFirstReceiver", msg); //將數據傳輸給下一個廣播接收者 setResultData("This is the Second Msg From MyFirstReceiver"); } }
MySecondReceiver.java:
public class MySecondReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub //獲得上一個廣播接收者傳過來的數據 String msg = getResultData(); Log.d("MySecondReceiver", msg); //將數據傳輸給下一個廣播接收者 setResultData("This is the Third Msg From MySecondReceiver"); } }
MyThirdReceiver.java:
public class MyThirdReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub //獲得上一個廣播接收者傳過來的數據 String msg = getResultData(); Log.d("MyThirdReceiver", msg); } }
2.在AndroidManifest.xml中注冊三個廣播接收者:
注意到這裡每個接收者都多加了一個屬性:priority,這個屬性表示有序廣播中的優先級,值越高表示優先級越高,那麼當廣播發出時,優先級最高的便會第一個接收到廣播並攔截下來。然後才會繼續往優先級低的傳遞下去。
3.發送有序廣播
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent("OrderBroadcast"); intent.putExtra("msg", "This is the First Msg From Activity"); sendOrderedBroadcast(intent, null); } }
運行,查看Logcat打印結果:
public class MainActivity extends Activity { private MyReceiver receiver = new MyReceiver(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this); IntentFilter filter = new IntentFilter(); filter.addAction("broadcasttest"); //注冊局部廣播 manager.registerReceiver(receiver , filter); Intent intent = new Intent(); intent.setAction("broadcasttest"); //發送廣播 manager.sendBroadcast(intent); } }
Shutdown 跟 reboot流程很類似,所以這裡以reboot分析:reboot的類型:1、手動長按power鍵選擇reboot;2、adb reboot;3、手動
在android中提供了一種異步回調機制Handler,使用它,我們可以在完成一個很長時間的任務後做出相應的通知 handler基本使用: 在主線
前言ImageView是android開發中非常常用的一種控件,在顯示圖片時,我們可以直接拿來用,也可以根據使用場景,結合幾種不同的顯示方式ScaleType,來對顯示的
Android特效專輯(十二)——仿支付寶咻一咻功能實現波紋擴散特效,精細小巧的View 先來看看這個效果 這是我的在Only上添加的效果,說實話