- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有了 Crosswalk,我有一个非常方便的 javascript-to-app 接口(interface),所以我可以从 javascript 调用 java 函数并将数据从我的 webapp 共享到我的 android 应用。
如何使用自定义选项卡(或受信任的网络 Activity )实现这一点?
好像根本就没有办法。应该有,特别是当我的应用程序和我的游戏/网络应用程序来自同一作者时。
比如我不信任LocalStorage,尤其是现在有了Custom Tabs,它可能会被清理,或者用户可能会卸载浏览器并安装另一个,这样保存的数据就会丢失,用户会生气应用程序丢失了保存的数据,甚至不了解数据在浏览器中,而不是在应用程序中。所以我曾经让我的网络应用程序调用该应用程序来保存数据。
另一个例子,当自定义选项卡使用 Firefox 而不是 Chrome 时,语音合成将不可用。我可以在我的网络应用程序中轻松检测到它。但我希望我的 webapp 调用该应用程序并将单词发送给它发音。这就是我对 Crosswalk 所做的,因为它也不支持语音。
我知道 webview 比自定义选项卡更适合我使用,但是当 webview 不能在设备(尤其是 Android <5)上使用时,我的应用程序除了打开一个改为自定义选项卡(或受信任的 Web Activity ,如果可用)。我不能再使用 Crosswalk,它已经停产并且仍然充满严重的错误。而 GeckoView 或 Alibaba Gcanvas 等其他解决方案还没有准备好。
编辑:
在这篇关于可信网络 Activity 的文章中 https://developers.google.com/web/updates/2017/10/using-twa我读了
Nevertheless, you can coordinate with the web content by passing data to and from the page in URLs (e.g. through query parameters, custom HTTP headers, and intent URIs.)
编辑:
我已经阅读了很多页面,但 Intents 和深层链接对我来说仍然很模糊,但这是我尝试过的。
我为自定义操作添加了一个 Intent 过滤器:
<receiver android:name=".OutgoingReceiver" android:enabled="true">
<intent-filter>
<action android:name="custom_tabs_js_interface" />
</intent-filter>
</receiver>
我为那个接收器创建了一个类:
public class OutgoingReceiver extends BroadcastReceiver {
public static final String CUSTOM_INTENT = "custom_tabs_js_interface";
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received" , Toast.LENGTH_SHORT).show();
}
我在 javascript 中用
调用它location.href="intent:#Intent;action=custom_tabs_js_interface;end";
我现在甚至不传递数据,我只是尝试调用它。但什么也没发生...
最佳答案
是的,广播接收器由于某种原因无法工作,可能是出于安全原因。但是你可以使用 Activity代替 Broadcast Receiver如下所示。
使用自定义 Android Intent Uri具有自定义主机、查询参数、包、方案 和 Intent 操作。从您的 javascript/html 代码中调用此 intent uri。例子
"intent://myhost?key=value#Intent;scheme=myscheme;package=my.app.package;action=someaction;end"
同时声明一个 activity在manifest文件 intent filter处理特定的 host、scheme 和 action。示例
<activity android:name="my.app.package.ReceiverActivity">
<intent-filter>
<action android:name="someaction" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="myhost"
android:scheme="myscheme" />
</intent-filter>
</activity>
现在在 Activity 中,处理 Intent 并从查询参数中提取数据。对数据做任何你想做的事,并可能完成 Activity ,以防你想返回到同一屏幕。示例
public class ReceiverActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String value = getIntent().getData().getQueryParameter("key");
if (value != null) {
// value is basically your data
}
// in case you want to go back to same screen
finish();
}
}
就是这样。在 Android Activity 中,您有可供处理的数据。此 ReceiverActivity 可以(最好)属于同一个 TWA 应用程序。现在,通过这个Receiver Activity,您可以轻松地将数据发送/共享到任何其他应用程序。希望这会有所帮助。
关于android - 如何将数据从我的 TWA 网络应用程序发送到我的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52042295/
我是一名优秀的程序员,十分优秀!