第三方调起APP方式代码

2021-11-01  本文已影响0人  见字如晤一

很久没搞第三方调起APP的流程了,特别是转了kotlin之后,写起代码来有些生疏了,在此记录一下:
第一种方式:调起LAUNCHER页面:

//通过包名启动第三方应用启动页
    fun startLaunchAPK(context: Context, packageName: String) {
        Log.d(tag, "启动中。。。" + packageName)
        var mainAct: String? = null
        val pkgMag = context.packageManager
        val intent = Intent(Intent.ACTION_MAIN)
        intent.addCategory(Intent.CATEGORY_LAUNCHER)
        intent.flags = Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED or Intent.FLAG_ACTIVITY_NEW_TASK
        //如果已经启动apk,则直接将apk从后台调到前台运行(类似home键之后再点击apk图标启动),如果未启动apk,则重新启动
        @SuppressLint("WrongConstant")
        val list = pkgMag.queryIntentActivities(
            intent,
            PackageManager.GET_ACTIVITIES
        )
        for (i in list.indices) {
            val info = list[i]
            if (info.activityInfo.packageName == packageName) {
                mainAct = info.activityInfo.name
                break
            }
        }
        if (TextUtils.isEmpty(mainAct)) {
            return
        }
        //启动到app的主页或启动到原来留下的位置
        intent.component = ComponentName(packageName, mainAct!!)
        //启动app
        context.startActivity(intent)
        Log.d(tag, "启动成功。。。")
    }

注意:这种方式需要在被调起的页面的清单上加入允许被第三方(外部)调起标识

android:exported="true"

第二种方式:知道第三方包名和需要被调起的页面名称(是完整路径哦!!!)

/**
     * 该方法,通过包名,调起指定类
     */
    fun startLaunchAPK(context: Context, packageName: String, activityName: String) {
        val intent = Intent()
        Log.d(tag, "指定类名跳转 >>> pkgName " + packageName + "   activityName >>> " + activityName)
        // 启动指定的activity页面
        intent.component = ComponentName(packageName, activityName)
        //启动app
        context.startActivity(intent)
        Log.d(tag, "启动成功。。。")
    }

第三种方式:也是我觉得最灵活好用的方式,通过schema方式配置调用
1、在第三方清单上配置schema,通常自己新建一个SchemeFilterActivity类,专门用来过滤处理schema跳转:

<activity android:name=".SchemeFilterActivity">
            <intent-filter>
                <data
                    android:host="xx.zzz.yy"
                    android:scheme="arouter" />

                <action android:name="android.intent.action.VIEW" />

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

2、调起方代码方式:

fun startAPKBySchema(context: Context) {
        val data: Uri =
            Uri.parse("arouter://xx.zzz.yy/boot/BootActivity?token='xxxx'&name='jjjj'")
        val intent = Intent(Intent.ACTION_VIEW, data)
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        //启动app
        context.startActivity(intent)
        Log.d(tag, "启动成功。。。")
    }

上一篇 下一篇

猜你喜欢

热点阅读