2010-08-30 251 views
12

我是android新手。我怎麼知道IntentBroadcastReceiver之間的區別。 BroadcastReceiverIntent更令我困惑。Android廣播接收器

請幫我一把。簡單的代碼將會有所幫助。

+0

**請參閱此鏈接** https://stackoverflow.com/questions/15698790/broadcast-receiver-for-checking-internet-connection-in-android-app/44881551#44881551 – 2017-09-12 12:16:55

回答

30

好吧,我會用一個例子來解釋它。

讓我們假設我想創建一個應用程序來檢查其網頁的地鐵狀態。如果地鐵工作不正常,我還想要系統通知。

我將有:

  • Activity顯示結果。
  • A Service檢查地鐵是否正常工作,如果不工作,則顯示通知。
  • A Broadcast Receiver調用Alarm Receiver每15分鐘致電該服務。

讓我告訴你一些代碼:

/* AlarmReceiver.java */ 
public class AlarmReceiver extends BroadcastReceiver { 
    public static final String ACTION_REFRESH_SUBWAY_ALARM = 
      "com.x.ACTION_REFRESH_SUBWAY_ALARM"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent startIntent = new Intent(context, StatusService.class); 
     context.startService(startIntent); 
    } 
} 

說明: 正如你可以看到你可以設置鬧鐘。當收到警報時,我們使用intent啓動service。基本上intent是一個味精,可以有行動,一個序列化的東西。

public class StatusService extends Service { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mAlarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     Intent intentToFire = new Intent(AlarmReceiver.ACTION_REFRESH_ALARM); 
     mAlarmIntent = PendingIntent.getBroadcast(this, 0, intentToFire, 0); 
    } 

    @Override 
    public void onStart(Intent intent, int arg1) { 
     super.onStart(intent, arg1); 
     Log.d(TAG, "SERVICE STARTED"); 
     setAlarm(); 
     Log.d(TAG, "Performing update!"); 
     new SubwayAsyncTask().execute(); 
     stopSelf(); 
    } 

    private void setAlarm() { 
     int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP; 
     mAlarms.setInexactRepeating(alarmType, SystemClock.elapsedRealtime() + timeToRefresh(), 
        AlarmManager.INTERVAL_HALF_DAY, mAlarmIntent); 
    } 

} 

說明:

service開始和:

  • 爲下一個撥打了報警。 (檢查它的使用意圖只是味精。)
  • 召喚一個AsyncTask這需要更新的護理的通知Activity

它沒有意義粘貼AsyncTask但是當它完成它調用:

private void sendSubwayUpdates(LinkedList<Subway> subways) { 
     Intent intent = new Intent(NEW_SUBWAYS_STATUS); 
     intent.putExtra("subways", subways); 

     sendBroadcast(intent); 
} 

這將創建一個新Intent具有一定NEW_SUBWAYS_STATUS動作,把意圖內的地鐵和sendBroadcast。如果有人有興趣獲得該信息,它將有一個接收器。

我希望我明確自己。

PS:幾天前有人以非常酷的方式解釋廣播和意圖。 有人想分享他的啤酒,所以他發送了一個廣播 意圖採取行動:「FREE_BEER」,並與一個額外的:「一杯啤酒」。

+0

您確定我們可以用地鐵報警器進行測試嗎? – Sayka 2016-04-11 19:58:12

3

的API狀態:

BroadcastReceiver爲代碼,將接收由發送sendBroadcast()意圖的基類。

意圖是要執行的操作的抽象描述。

因此,BroadcastReceiver只是一個響應Intents的Activity。您可以發送自己的廣播,甚至Android設備也可以發送這些系統廣播,包括電池電量不足或設備剛剛啓動等。

+0

我覺得BroadcastReceivers作爲服務的一部分非常困惑。但是,我已經使用了它們幾次來獲得簡單的活動間消息,例如發送給後端堆棧中的一個。根本不需要任何服務來使用它。 「嘿,用戶發生了變化,迴應它!」 – 2012-10-08 14:39:14

+1

BroadcastReceiver不是一項活動! – Shatazone 2013-02-22 13:48:55