java - 使用 Cordova 创建一个插件,用于在用户解锁屏幕时启动应用程序活动
问题描述
我想为基本的 Cordova 应用程序创建一个 Cordova 插件,当用户解锁屏幕并调用 javascript 函数来通知屏幕操作时,它将启动应用程序活动。问题是我不确定也不知道如何正确地实现这一点。我想我应该为此构建一个插件?这将为intent.action.SCREEN_ON(和OFF)或android.intent.action.USER_PRESENT注册一个java函数。但是我应该把所有的java代码放在 ActionScreenPlugin.java 的什么地方呢?
请指出构建此插件的正确方法,该插件简单地启动应用程序活动并在手机解锁或唤醒后调用 javascript 函数,也许有一个可行的解决方案,所以我可以更好地理解。
这是我在 Windows 命令提示符下所做的:
cordova create app com.myapp.test MyApp
cd app
cordova platform add android
plugman create --name ActionScreenPlugin --plugin_id cordova-plugin-actionscreen --plugin_version 0.0.1
cd ActionScreenPlugin
plugman platform add --platform_name android
plugman createpackagejson .
然后我在 plugin.xml 中为 intent.action.SCREEN_ON 和 intent.action.SCREEN_OFF 注册 ScreenReceiver:
<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns:android="http://schemas.android.com/apk/res/android" xmlns="http://apache.org/cordova/ns/plugins/1.0" version="0.0.1" id="cordova-plugin-actionscreen">
<name>ActionScreenPlugin</name>
<js-module src="www/ActionScreenPlugin.js" name="ActionScreenPlugin">
<clobbers target="cordova.plugins.ActionScreenPlugin"/>
</js-module>
<platform name="android">
<config-file target="res/xml/config.xml" parent="/*">
<feature name="ActionScreenPlugin">
<param name="android-package" value="cordova-plugin-actionscreen.ActionScreenPlugin"/>
</feature>
<receiver android:name=".ScreenReceiver">
<intent-filter>
<action android:name="android.intent.action.SCREEN_OFF"/>
<action android:name="android.intent.action.SCREEN_ON"/>
<action android:name="android.intent.action.USER_PRESENT"/>
</intent-filter>
</receiver>
</config-file>
<config-file target="AndroidManifest.xml" parent="/*"/>
<source-file src="src/android/ActionScreenPlugin.java" target-dir="src/cordova-plugin-actionscreen/ActionScreenPlugin"/>
</platform>
</plugin>
这是 ActionScreenPlugin.java
package cordova-plugin-actionscreen;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CallbackContext;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* This class echoes a string called from JavaScript.
*/
public class ActionScreenPlugin extends CordovaPlugin {
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
if (action.equals("coolMethod")) {
String message = args.getString(0);
this.coolMethod(message, callbackContext);
return true;
}
}
private void coolMethod(String message, CallbackContext callbackContext) {
if (message != null && message.length() > 0) {
callbackContext.success(message);
} else {
callbackContext.error("Expected one non-empty string argument.");
}
}
}
public class ScreenReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_ON))
{
Intent intent = new Intent();
intent.setClass(context, ScreenLockActivity.class);
startActivity(intent);
}
}
}
这是 ActionScreenPlugin.js
var exec = require('cordova/exec');
exports.coolMethod = function (arg0, success, error) {
exec(success, error, 'ActionScreenPlugin', 'coolMethod', [arg0]);
};
var ActionScreenPlugin = function() {
console.log('ActionScreenPlugin instanced');
};
ActionScreenPlugin.prototype.show = function(msg, onSuccess, onError) {
var errorCallback = function(obj) {
onError(obj);
};
var successCallback = function(obj) {
onSuccess(obj);
};
exec(successCallback, errorCallback, 'ActionScreenPlugin', 'show', [msg]);
};
if (typeof module != 'undefined' && module.exports) {
module.exports = ActionScreenPlugin;
}
解决方案
推荐阅读
- sqlite - SQLite - 使用批处理文件将 SQL 查询应用于随机数据库的问题
- python - Pycharm管理存储库是空白的?
- bash - 从 10 到 n 生成 >100 的偶数
- c# - 有没有办法在任何地方使用 onSelect 事件?
- go - 多次渲染定义相同块的golang模板
- java - 在 Android/iOS 中使用动态行构建表单
- android - 尝试从本地服务器加载数据时,模拟器显示空白屏幕
- c# - Xamarin.Forms 中 TabbedPage 上的 Android.Views.InflateException
- replace - 将优先级列值替换为“是”应为 1,“否”应为 0
- python - 有没有办法在你的主文件中使用另一个 Python 文件中的变量?