我正在 Sencha Touch 2.0.1 和 PhoneGap 上开发一个应用程序。
我需要捕获 Sencha Touch 内部触发的事件并将其传输到原生 Android 环境。
即:一些sencha 触摸控制按钮需要触发点击意图以启动另一个活动(非PhoneGap 活动)。
到目前为止,我已经找到了各种示例,例如webintents和this。但据我所知,这些不适用于我的情况。
我寻求要么放弃 PhoneGap 并使用另一个包装器,要么以某种方式规避这个问题。提前致谢!
我正在 Sencha Touch 2.0.1 和 PhoneGap 上开发一个应用程序。
我需要捕获 Sencha Touch 内部触发的事件并将其传输到原生 Android 环境。
即:一些sencha 触摸控制按钮需要触发点击意图以启动另一个活动(非PhoneGap 活动)。
到目前为止,我已经找到了各种示例,例如webintents和this。但据我所知,这些不适用于我的情况。
我寻求要么放弃 PhoneGap 并使用另一个包装器,要么以某种方式规避这个问题。提前致谢!
我认为您需要制作自己的 phonegap 插件,从它的执行方法内部启动本机活动。
有一个 ContactView 插件,您应该可以将其用作编写自己的指南。
https://github.com/phonegap/phonegap-plugins/blob/master/Android/ContactView/ContactView.java
具体这两种方法
@Override
public PluginResult execute(String action, JSONArray args, String callbackId) {
startContactActivity();
PluginResult mPlugin = new PluginResult(PluginResult.Status.NO_RESULT);
mPlugin.setKeepCallback(true);
this.callback = callbackId;
return mPlugin;
}
public void startContactActivity() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
this.ctx.startActivityForResult((Plugin) this, intent, PICK_CONTACT);
}
看看这个,显式和隐式意图部分(1.2、1.3): http ://www.vogella.de/articles/AndroidIntent/article.html
然后看一下WebIntent.java的源码,特别是startActivity函数: https ://github.com/phonegap/phonegap-plugins/blob/master/Android/WebIntent/WebIntent.java
void startActivity(String action, Uri uri, String type, Map<String, String> extras) {
Intent i = (uri != null ? new Intent(action, uri) : new Intent(action));
然后这里的意图构造函数(搜索构造函数):http: //developer.android.com/reference/android/content/Intent.html
WebIntent 不支持采用 Android 类的 Intent 构造函数。
但是您可以扩展该函数以使其具有明确的意图(下面的代码快速而肮脏且未经测试):
void startActivity(String action, Uri uri, String type, String className, Map<String, String> extras) {
Intent i;
if (uri != null)
i = new Intent(action, uri)
else if (className != null)
i = new Intent(this.ctx, Class.forName(className));
else
new Intent(action));
上面,在执行函数中,还必须在“解析参数”部分解析出新参数
// Parse the arguments
JSONObject obj = args.getJSONObject(0);
String type = obj.has("type") ? obj.getString("type") : null;
Uri uri = obj.has("url") ? Uri.parse(obj.getString("url")) : null;
String className = obj.has("className") ? obj.getString("className") : null;
JSONObject extras = obj.has("extras") ? obj.getJSONObject("extras") : null;
然后在调用 startActivity 时将新的 className 字符串传递给下面几行:
startActivity(obj.getString("action"), uri, type, className, extrasMap);
然后你应该能够使用类名调用一个android活动,比如:
Android.callByClassName = function(className) {
var extras = {};
extras[WebIntent.EXTRA_CUSTOM] = "my_custom";
extras[WebIntent.EXTRA_CUSTOM2] = "my_custom2";
window.plugins.webintent.startActivity({
className: className,
extras: extras
},
function() {},
function() {
alert('Failed to send call class by classname');
}
);
};
类名类似于:com.company.ActivityName
免责声明:粗略的代码,未经测试。