Android-广播接收器

16

我是android新手,想了解 IntentBroadcastReceiver 的区别。我对 BroadcastReceiverIntent 更加困惑。

请帮帮我。代码示例会很有帮助。


请查看此链接:https://dev59.com/U2Uo5IYBdhLWcg3w3yqi#44881551 - user8203509
2个回答

34

好的,我将用一个例子来解释。

假设我想创建一个应用程序来从地铁网页上检查地铁状态。 如果地铁不正常工作,我还希望获得系统通知。

我需要:

  • Activity 来显示结果。
  • Service 来检查地铁是否正常工作并在不正常时显示通知。
  • 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);
}

这将创建一个带有特定NEW_SUBWAYS_STATUS操作的新Intent,将地铁信息放入意图中并sendBroadcast。如果有人对获取该信息感兴趣,就会有一个接收器。

希望我表述清楚了。

附注:几天前,有人以一种非常酷的方式解释广播和意图。 有人想分享他的啤酒,所以他发送了一个带有操作:“FREE_BEER”和额外信息:“一杯啤酒”的意图广播。


3

API中说明:

BroadcastReceiver是一个基类,用于接收由sendBroadcast()发送的意图。

意图是要执行的操作的抽象描述。

因此,BroadcastReceiver只是一个响应意图的活动。您可以发送自己的广播,甚至Android设备可以发送这些系统范围的广播,包括诸如电池电量低或设备刚刚启动等内容。


我觉得BroadcastReceivers作为服务的一部分会变得非常混乱。然而,我已经使用它们几次来发送简单的活动间消息,比如发送到后台堆栈中的一个消息。完全不需要使用服务。 “嘿,用户发生了变化。请回应!” - Joe Plante
2
BroadcastReceiver不是一个Activity! - Shatazone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接