Hitting a download link and displaying text in the same menu item page callback (7)
A particularly low-tech solution using meta refresh (which should work cross-browser):

function download_icon_page_callback() {
  $element = array(
    '#tag' =&gt; 'meta', 
    '#attributes' =&gt; array( 
      'http-equiv' =&gt; 'refresh',
      'content' =&gt; '5', // Timeout in seconds
      'url' =&gt; '/path/to/my/file.zip'
    ),
  );

  drupal_add_html_head($element, 'download_icon_refresh');

  return array(
    'instructions' =&gt; array(
      '#markup' =&gt; t('Some instructions')
    ),
    'backup_link' =&gt; array(
      '#markup' =&gt; l('Click here if the file download does not automatically start.', 'path/to/my/file.zip'),
      '#prefix' =&gt; '&lt;p&gt;',
      '#suffix' =&gt; '&lt;/p&gt;'
    )
  );
}


Although returning a string from a page callback function works fine (the return is run through render() which accepts a string or render array), returning a render array is preferred as it gives other parts of the system the chance to alter the output while it's still in a structured manner. The documentation for render arrays is a great place to start if you haven't used them before.