IntentAndroid

注:IntentAndroid现已过时,请使用跨平台的Linking组件。

IntentAndroid提供了一个通用接口来调用外部链接。

基本用法#

处理深度链接(deep link)#

如果你的应用是通过一个已注册的外部链接调起的,那么可以用下面的方法来读取和处理这个链接:

componentDidMount() {
  var url = IntentAndroid.getInitialURL(url => {
    if (url) {
      console.log('Initial url is: ' + url);
    }
  });
}

注:要了解更多如何支持深度链接的说明,请参阅Enabling Deep Links for App Content - Add Intent Filters for Your Deep Links。 下面是一个添加深度链接的例子,编辑android/app/src/main/AndroidManifest.xml文件:

  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />

    <!-- 以下设置用于接受一个以http://www.facebook.com/react 开头的url-->
    <data android:scheme="http"
       android:host="www.facebook.com"
       android:pathPrefix="/react" />
    <!-- 注意:pathPrefix中的"/"符号是必须的-->

    <!-- 以下设置用于接受以"facebook://react 开头的url-->
    <!-- <data android:scheme="facebook" android:host="react" /> -->
  </intent-filter>

打开外部链接#

要启动链接对应的活动(网址、邮件或是联系人等),直接调用以下方法即可:

IntentAndroid.openURL(url)

如果想在打开链接前先检查是否安装了对应的应用,则调用以下方法:

IntentAndroid.canOpenURL(url, (supported) => {
  if (!supported) {
    console.log('无法打开这个url: ' + url);
  } else {
    IntentAndroid.openURL(url);
  }
});

方法#

static openURL(url: string) #

根据给定的URL启动对应的应用。

比如一个这样的URL:"https://www.facebook.com"会启动系统浏览器,或是弹出一个“选择打开程序”的对话框。

你还可以使用其他类型的URL,比如一个地理位置(形如"geo:37.484847,-122.148386"或是一个通讯录名片,只要是可以通过{@code Intent.ACTION_VIEW}打开的即可。

注:如果系统不知道如何处理给定的URL,则此方法会调用失败。如果你传入的URL不是一个http链接,则最好先通过{@code canOpenURL}方法检查一下。

注:对于web链接来说,协议头("http://", "https://")不能省略!

static canOpenURL(url: string, callback: Function) #

判断是否有已安装的应用可以处理传入的URL。

static getInitialURL(callback: Function) #

如果当前应用是通过深度链接和{@code Intent.ACTION_VIEW}调起的,则此方法会返回这个链接的值,否则返回null

更多说明可参阅http://developer.android.com/training/app-indexing/deep-linking.html#handling-intents

例子#

'use strict';

var React = require('react-native');
var {
  IntentAndroid,
  StyleSheet,
  Text,
  TouchableNativeFeedback,
  View,
} = React;
var UIExplorerBlock = require('./UIExplorerBlock');

var OpenURLButton = React.createClass({

  propTypes: {
    url: React.PropTypes.string,
  },

  handleClick: function() {
    IntentAndroid.canOpenURL(this.props.url, (supported) => {
      if (supported) {
        IntentAndroid.openURL(this.props.url);
      } else {
        console.log('Don\'t know how to open URI: ' + this.props.url);
      }
    });
  },

  render: function() {
    return (
      <TouchableNativeFeedback
        onPress={this.handleClick}>
        <View style={styles.button}>
          <Text style={styles.text}>Open {this.props.url}</Text>
        </View>
      </TouchableNativeFeedback>
    );
  }
});

var IntentAndroidExample = React.createClass({

  statics: {
    title: 'IntentAndroid',
    description: 'Shows how to use Android Intents to open URLs.',
  },

  render: function() {
    return (
      <UIExplorerBlock title="Open external URLs">
        <OpenURLButton url={'https://www.facebook.com'} />
        <OpenURLButton url={'http://www.facebook.com'} />
        <OpenURLButton url={'http://facebook.com'} />
        <OpenURLButton url={'geo:37.484847,-122.148386'} />
      </UIExplorerBlock>
    );
  },
});

var styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: 'white',
    padding: 10,
    paddingTop: 30,
  },
  button: {
    padding: 10,
    backgroundColor: '#3B5998',
    marginBottom: 10,
  },
  text: {
    color: 'white',
  },
});

module.exports = IntentAndroidExample;