Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓广播接收机_Android - Fatal编程技术网

Android 安卓广播接收机

Android 安卓广播接收机,android,Android,我是android新手。我想知道Intent和BroadcastReceiver之间的区别。我对BroadcastReceiver比对Intent更困惑 请帮帮我。简单的代码会很有帮助。好的,我将用一个例子来解释它 假设我想创建一个应用程序,从它的网页检查地铁状态。如果地铁不正常,我还需要一个系统通知 我将: 显示结果的活动 一项服务,用于检查地铁是否正常运行,如果不正常则显示通知 一个广播接收器呼叫报警接收器,每15分钟呼叫一次服务 让我向您展示一些代码: /* AlarmReceiver

我是android新手。我想知道
Intent
BroadcastReceiver
之间的区别。我对
BroadcastReceiver
比对
Intent
更困惑


请帮帮我。简单的代码会很有帮助。

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

假设我想创建一个应用程序,从它的网页检查地铁状态。如果地铁不正常,我还需要一个系统通知

我将:

  • 显示结果的
    活动
  • 一项
    服务
    ,用于检查地铁是否正常运行,如果不正常则显示通知
  • 一个
    广播接收器
    呼叫
    报警接收器
    ,每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
是一个可以有动作的消息,一个序列化的东西

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

}
说明:

服务
启动并:

  • 为下次通话设置闹钟。(检查它的使用意图。只是一条消息)
  • 调用负责更新通知
    活动的
    异步任务
粘贴
AsyncTask
没有意义,但是当它完成时,会调用:

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

      sendBroadcast(intent);
}
private void sendSubwayUpdates(链接列表地铁){
意向意向=新意向(新地铁状态);
意向。额外收费(“地铁”,地铁);
发送广播(意图);
}
这将创建一个新的
Intent
,带有特定的
new\u SUBWAYS\u STATUS
操作,将其放入Intent中,然后
sendBroadcast
。如果有人对获取这些信息感兴趣,它将有一个接收器

我希望我说清楚了

几天前,有人用一种很酷的方式解释了广播和意图。 有人想分享他的啤酒,所以他发了一个广播 有意向的行动:“免费啤酒”和额外的“一杯啤酒”。

API声明:

BroadcastReceiver
是用于接收由
sendBroadcast()
发送的意图的代码的基类

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


因此,
BroadcastReceiver
只是一个响应意图的活动。您可以发送自己的广播,甚至安卓设备也可以发送这些系统范围的广播,包括电池电量不足或设备刚刚启动等情况。

我觉得广播接收器作为服务的一部分确实会感到困惑。但是,我已经多次使用它们来生成简单的活动间消息,比如发送到后堆栈中的消息。使用它根本不需要任何服务。“嘿,用户发生了变化。响应它!”BroadcastReceiver不是活动!你确定我们可以用地铁报警器测试它吗?请看这个链接