Titanium Android深度链接:Ti SDK6.2.0+中Intent.getData()返回null
解决Ti SDK 6.2.0+ Android深度链接
getData()返回null的问题 我之前也碰到过这个棘手的问题——在Ti SDK 6.2.0及更高版本的Android应用里,通过深度链接唤起应用后,调用Ti.Android.currentActivity.getIntent().getData()总是返回null,但降级到6.1.2就一切正常。这其实是SDK版本更新后Activity启动逻辑的变化导致的,下面给你详细的解决方案:
问题根源
从Ti SDK 6.2.0开始,Appcelerator调整了Android应用的启动机制:当通过深度链接唤起应用时,新的Intent会通过onNewIntent()方法传递,而不会直接覆盖当前Activity的原始Intent。如果你还是在页面open事件里直接读取currentActivity.getIntent(),拿到的只会是应用首次启动时的空Intent,自然返回null。
修复代码方案
你需要监听Activity的newintent事件来获取最新的Intent数据,同时保留首次启动时的Intent读取逻辑,具体修改如下:
1. 更新alloy.js中的方法
Alloy.Globals.getDeepLinkURL = function(intent) { // 优先使用传入的新Intent,没有则 fallback 到当前Activity的初始Intent const targetIntent = intent || Ti.Android.currentActivity.getIntent(); Alloy.Globals.deepLinkURLAndroid = targetIntent.getData(); console.log("Alloy.Globals.deepLinkURLAndroid:", Alloy.Globals.deepLinkURLAndroid); console.log("当前处理的Intent:", targetIntent); }; // 针对Android监听newintent事件,处理后续唤起的深度链接 if (OS_ANDROID) { Ti.Android.currentActivity.addEventListener('newintent', function(e) { // 传入最新的Intent到处理方法中 Alloy.Globals.getDeepLinkURL(e.intent); // 可选:更新当前Activity的Intent,确保后续调用getIntent()也能拿到最新数据 Ti.Android.currentActivity.setIntent(e.intent); }); }
2. 修改index.js的open事件逻辑
$.index.addEventListener('open', function(){ if(OS_ANDROID){ // 应用首次启动时,读取初始Intent的深度链接数据 Alloy.Globals.getDeepLinkURL(); } });
验证步骤
- 用修改后的代码重新编译应用,安装到Android设备
- 在浏览器中访问你的深度链接(比如
appname://videoURL,注意替换成你实际的Scheme) - 查看应用日志,此时
getData()应该能正确返回对应的深度链接URL了
额外提示
如果你的应用支持多次通过深度链接唤起,一定要处理newintent事件,否则后续每次唤起都拿不到最新的链接;调用setIntent(e.intent)是为了让后续调用currentActivity.getIntent()时也能拿到最新的Intent数据,避免重复处理逻辑。
内容的提问来源于stack exchange,提问作者Miti shah
相关产品推荐
相关产品推荐

