首页 > 解决方案 > 使用 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;
}

标签: javaandroidcordovacordova-plugins

解决方案


推荐阅读