2010-08-30 26 views
12

Tôi mới sử dụng Android. Tôi biết điều gì để biết sự khác biệt giữa IntentBroadcastReceiver. Tôi bối rối hơn với BroadcastReceiver hơn Intent.Máy phát Android-Broadcast

Hãy giúp tôi. Mã đơn giản sẽ hữu ích.

+0

** Vui lòng xem liên kết này ** https://stackoverflow.com/questions/15698790/broadcast-receiver-for-checking-internet-connection-in-android-app/44881551#44881551 –

Trả lời

30

Ok, tôi sẽ giải thích nó với một ví dụ.

Giả sử tôi muốn tạo ứng dụng để kiểm tra trạng thái tàu điện ngầm từ trang web của trang web đó. Tôi cũng muốn có một thông báo hệ thống nếu tàu điện ngầm không hoạt động tốt.

tôi sẽ có:

  • Một Activity để hiển thị kết quả.
  • A Service để kiểm tra xem tàu ​​điện ngầm có hoạt động hay không và hiển thị thông báo nếu nó không hoạt động.
  • A Broadcast Receiver gọi là Alarm Receiver để gọi dịch vụ sau 15 phút.

Hãy để tôi chỉ cho bạn một số mã:

/* 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); 
    } 
} 

Giải thích: Như bạn thấy, bạn có thể thiết lập một báo động. và khi nhận được báo thức, chúng tôi sử dụng intent để bắt đầu service. Về cơ bản, intent là một thông điệp có thể có hành động, một thứ được sắp xếp theo thứ tự.

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); 
    } 

} 

Giải thích:

Các service bắt đầu và:

  • Cài báo thức cho cuộc gọi tiếp theo. (Kiểm tra mục đích nó được sử dụng Chỉ cần một msg.)
  • kêu gọi một AsyncTask mà sẽ chăm sóc của việc cập nhật một thông báo cho Activity

Nó không có ý nghĩa để dán AsyncTask nhưng khi nó đã hoàn thành nó gọi:

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

     sendBroadcast(intent); 
} 

này tạo ra một mới Intent với một NEW_SUBWAYS_STATUS hành động nhất định, đặt bên trong ý định của tàu điện ngầm và sendBroadcast. Nếu ai đó quan tâm đến việc nhận được thông tin đó, nó sẽ có một người nhận.

Tôi hy vọng tôi đã tự làm rõ.

PS: Một số ngày trước, một người nào đó đã giải thích phát sóng và dự định theo cách rất hay. Ai đó muốn chia sẻ bia của anh ấy, vì vậy anh ấy sẽ gửi một phát sóng với mục đích có hành động: "FREE_BEER" và kèm thêm: "Một ly bia".

+0

Bạn có chắc chắn rằng chúng tôi có thể kiểm tra nó với báo động tàu điện ngầm? – Sayka

3

Các trạng thái API:

Một BroadcastReceiver là một lớp cơ sở cho mã mà sẽ nhận được ý đồ gửi bởi sendBroadcast().

Mục đích là mô tả trừu tượng về một thao tác sẽ được thực hiện.

Vì vậy, BroadcastReceiver chỉ là một Hoạt động phản hồi mục đích. Bạn có thể gửi các chương trình phát sóng của riêng bạn hoặc thậm chí Thiết bị Android có thể gửi các chương trình phát sóng rộng của hệ thống này bao gồm những thứ như pin yếu hoặc thiết bị chỉ khởi động.

+0

Tôi cảm thấy rằng BroadcastReceivers thực sự bối rối như là một phần của dịch vụ. Tuy nhiên, tôi đã sử dụng chúng một vài lần để có các thông điệp liên hoạt động đơn giản, như gửi đến một trong ngăn xếp lại. Không có dịch vụ nào cần thiết để sử dụng nó. "Này, đã có sự thay đổi của người dùng. Trả lời nó đi!" –

+1

BroadcastReceiver không phải là một hoạt động! – Shatazone