关于唤起其他App的那点事(Android)

在App内或web端唤起其他App的情况很常见,能够很方便的进行不同场景之间的切换,提升用户体验。

那我们是如何实现的呢

首先要确认需求,一种是只唤起App打开首页就完事的,一种是能够切换到App的内页。
第一种只需要唤起App打开首页比较简单,有两种实现方式,一是通过包名打开,一种是deeplink,但其实原理是一样的。

1.只需唤起App主页

通过包名唤起其他App

//native 实现
@ReactMethod
    public void  openApk(String packageName){
        Activity currentActivity = getCurrentActivity();
        PackageManager packageManager = this.ctx.getPackageManager();
        try{
            Intent intent= packageManager.getLaunchIntentForPackage(packageName);
            currentActivity.startActivity(intent);
        }catch (Exception e){

        }
    }

// react-native实现
function(){
  NativeModules.OpenApk(packageName);
}

通过deeplink schema唤起

//在android中配置schema 以及被唤起的能力
<intent-filter>        
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT"/>
            <category android:name="android.intent.category.BROWSABLE"/> 
            <data android:scheme="dianmoge"/>      
   </intent-filter>
// react-native
 function(){
   Linking.openURL("dianmoge://");
}
2.需唤起App内页

因为我们使用的react-native,只有MainActivity,子页面由react-navigation构建路由导航,不像原生android使用多个Activity,所以不能采用包名+类名的方式唤起App内页,deeplink也不能按照原生android的方式配置使用。

DeepLink实现方式

基础schema配置和上面的保持一致,需在react-navigation中额外的子页面路径

// 在路由中配置deeplink的路径
    TaskDrinkWater: {
        screen: TaskDrinkWaterScreen,
        path: 'task/TaskDrinkWater',
    },
    TaskSleep: {
        screen: TaskSleepScreen,
        path: 'task/TaskSleep',
    },
    TaskRewardVideo: {
        screen: TaskRewardVideo,
        path: 'task/TaskRewardVideo',
    },
//唤起方式
 function(){
   Linking.openURL("dianmoge://task/TaskRewardVideo");
}

如何唤起内页并传递参数呢?

 Setting: {
        screen: SettingsScreen,
        path: 'setting/:route',
    },

//使用方式
 function(){
   Linking.openURL("dianmoge://setting/this is data");
}

//接收参数
 const route = navigation.getParam('route');

asd

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

赞赏支持
被以下专题收入,发现更多相似内容