社区有很多小伙伴都有此需求,有人实现了但是没有分享经验,经过半天的踩坑,在此分享一下。
- 首先最大的跨越是将在线打包改成了离线打包的形式,这一点一定要注意申请 AppKey 且各处 appId 正确。
- 找到在 官方的离线打包教程 中关于
AndroidManifest.xml
的部分,找到如下代码:
<activity
android:name="io.dcloud.PandoraEntry"
android:configChanges="orientation|keyboardHidden|keyboard|navigation"
android:hardwareAccelerated="true"
android:label="@string/app_name"
android:launchMode="singleTask"
android:screenOrientation="user"
android:theme="@style/TranslucentTheme"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
添加一个 intent-filter
:
<!-- 接收分享 -->
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/*" />
</intent-filter>
虽然注册很简单,但是离线打包是一个大坎,如果官方云打包支持就很方便了!
这里接收的是文本,可参考 Android把自己应用加入到系统文件分享中 中的其他类型
- 在 vue/js 业务代码中使用
plus.runtime.arguments
即可获取到分享的内容了!唤醒启动时可以在 vue 页面中的 onReady 接收到,也可以在 onShow 时获取,但是这里有个坑:
如果 app 在后台直接切回来, onShow 会再次获取到本次以分享形式冷启动时的内容,但如果没有完全退出,保留后台,以分享的形式切回,则是此次分享的内容,需要做好判断。
分享一下代码:
// 两个变量在 vue 代码之外
let launchArgs = '' // 存储启动时的参数,用于在 onShow 中判断,如果一致则不使用
let ready = false // 因为 onShow 在 onReady 之前触发,所以可能会有没渲染完成的情况,直接跳过
// 省略...
onReady() {
ready = true
this.onShared()
},
onShow() {
if (launchArgs !== plus.runtime.arguments) {
this.onShared()
}
},
methods: {
onShared() {
if (ready && plus.runtime.arguments) {
launchArgs = plus.runtime.arguments
const sharedText = JSON.parse(launchArgs)['android.intent.extra.TEXT']
// console.log('分享的文本内容是:',sharedText)
}
},
}
8 个评论
要回复文章请先登录或注册
1***@163.com
FullStack
yinghuoc
百里守约
yinghuoc
1***@qq.com
Kytrun (作者)
七年期限