很久没搞第三方调起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, "启动成功。。。")
}
网友评论