【问题标题】:How to create plugin in phonegap to run the application in background?如何在 phonegap 中创建插件以在后台运行应用程序?
【发布时间】:2012-02-23 11:51:12
【问题描述】:

我在 phonegap 中创建了后台服务插件(在后台运行应用程序)。

这是我的插件java代码:

public class BackgroundService extends Plugin {
    @Override
    public PluginResult execute(String action, JSONArray args, String callbackId)
    {
        PluginResult.Status status = PluginResult.Status.OK;
        String result = "";

        try {
            if (action.equals("onCreate")) {
                this.onCreate();
            }
            else if (action.equals("onBind")) {
                Intent intent = null;
                this.onBind(intent);
            }
            else if (action.equals("onDestroy")) {
                this.onDestroy();
            }
            else if (action.equals("onStart")) {
                Intent intent = null;
                this.onStart(intent,args.getInt(1));
            }
            else if (action.equals("onUnbind")) {
                Intent intent = null;
                this.onUnbind(intent);
            }
            return new PluginResult(status, result);
        } catch(JSONException e) {
            return new PluginResult(PluginResult.Status.JSON_EXCEPTION);
        }
    }
    public void onCreate() {

        // TODO Auto-generated method stub



        }
    public IBinder onBind(Intent intent) {

        // TODO Auto-generated method stub



        return null;

        }
    public void onDestroy() {

        // TODO Auto-generated method stub

        super.onDestroy();



        }
    public void onStart(Intent intent, int startId) {

        // TODO Auto-generated method stub

        //super.onStart(intent, startId);



        }
    public boolean onUnbind(Intent intent) {

        // TODO Auto-generated method stub



        }
    public void onPause()
    {
        super.webView.loadUrl("javascript:navigator.BackgroundService.onBackground();");
    }

    public void onResume()
    {
        super.webView.loadUrl("javascript:navigator.BackgroundService.onForeground();");
    }

}

我的js文件是:

function BackgroundService() {
};

BackgroundService.prototype.create = function() {
    PhoneGap.exec(null, null, "BackgroundService", "onCreate", []);
};

BackgroundService.prototype.destroy = function() {
    PhoneGap.exec(null, null, "BackgroundService", "onDestroy", []);
};

BackgroundService.prototype.start = function(intent,startId) {
    PhoneGap.exec(null, null, "BackgroundService", "onStart", [intent,startId]);
};

BackgroundService.prototype.bind = function(intent) {
    PhoneGap.exec(null, null, "BackgroundService", "onBind", [intent]);
};

BackgroundService.prototype.unbind = function(intent) {
    PhoneGap.exec(null, null, "BackgroundService", "onUnbind", [intent]);
};
PhoneGap.addConstructor(function() {
    PhoneGap.addPlugin("BackgroundService", new BackgroundService());
});

在我的 index.html 中。我在按钮单击中添加了以下代码

navigator.BackgroundService.onCreate(); navigator.BackgroundService.onStart(intent,1);

我的错误是:

ERROR/AndroidRuntime(14981): FATAL EXCEPTION: main

ERROR/AndroidRuntime(14981): java.lang.RuntimeException: Unable to instantiate service com.app.newly.BackgroundService: java.lang.ClassCastException: com.app.newly.BackgroundService

ERROR/AndroidRuntime(14981):at android.app.ActivityThread.handleCreateService(ActivityThread.java:2943)

ERROR/AndroidRuntime(14981):at android.app.ActivityThread.access$3300(ActivityThread.java:125)

ERROR/AndroidRuntime(14981):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2087)
ERROR/AndroidRuntime(14981):     at android.os.Handler.dispatchMessage(Handler.java:99)

ERROR/AndroidRuntime(14981):     at android.os.Looper.loop(Looper.java:123)

ERROR/AndroidRuntime(14981):     at android.app.ActivityThread.main(ActivityThread.java:4627)
ERROR/AndroidRuntime(14981):     at java.lang.reflect.Method.invokeNative(Native Method)

ERROR/AndroidRuntime(14981):     at java.lang.reflect.Method.invoke(Method.java:521)

ERROR/AndroidRuntime(14981):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)

ERROR/AndroidRuntime(14981):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
ERROR/AndroidRuntime(14981):     at dalvik.system.NativeStart.main(Native Method)
ERROR/AndroidRuntime(14981): Caused by: java.lang.ClassCastException: com.app.newly.BackgroundService
ERROR/AndroidRuntime(14981):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2940)
ERROR/AndroidRuntime(14981):     ... 10 more

如果我从 java 文件中删除 startService(new Intent(this,MyService.class)); 我得到以下错误:

ERROR/Web Console(4785): ReferenceError: Can't find variable: SqlitePlugin at file:///android_asset/www/BackgroundService.js:31
ERROR/Web Console(4785): TypeError: Result of expression 'window.plugins.SqlitePlugin' [undefined] is not an object. at file:///android_asset/www/index.html:26

否则我无法运行应用程序我在 java 文件中收到错误。我在此行的左角出现红十字标记(如 'X')' startService(new Intent(this,MyService.class));'请告诉我我哪里错了,请指导我,提前谢谢。

我在启动服务中遇到错误。当我将光标移动到 startService 时,我正在创建方法“startService(intent)”

我对这个插件有疑问,我能否在后台运行 javascript。如果有可能如何在后台获取警报。请告诉我我错在哪里,请指导我,谢谢前进。

【问题讨论】:

  • 她的慈悲,我们能让这个工作吗?有机会您可以为其他人发布示例项目吗?

标签: android plugins cordova


【解决方案1】:

插件的创建很好。您可以像创建普通的 java 文件一样创建服务。 然后只要你调用这个插件。您只需启动您的服务,就像

startService(new Intent(this, MyService.class));

然后您的服务将在后台运行。这是一种简单的方法。

如果你单独创建服务,那么

你的插件应该是这样的

public class BackgroundService extends Plugin {

private static final String TAG = "BackgroundService";
private static final String CALL_SERVICE_ACTION = "callService";

@Override
public PluginResult execute(String action, JSONArray args, String callbackId)
{
    Log.i(TAG, "Plugin Called");
PluginResult result = null;

if (CALL_SERVICE_ACTION.equals(action)) {
    Log.d(TAG, "CALL_SERVICE_ACTION");
    startService(new Intent(ctx, MyService.class));
}

else {
    result = new PluginResult(Status.INVALID_ACTION);
    Log.d(TAG, "Invalid action : " + action + " passed");
}

return result;
}
}

您的 .js 文件应如下所示

function BackgroundService() {
};

BackgroundService.prototype.callService = function(successCallback, failCallback) {

return PhoneGap.exec(successCallback, failCallback, "BackgroundService",
    "callService", [ null ]);
};

PhoneGap.addConstructor(function() {
PhoneGap.addPlugin("BackgroundService", new BackgroundService());
});

您的 HTML 文件应如下所示

function callServiceFunction() {
window.plugins.BackgroundService.callService('callService',
        callServiceSuccessCallBack, callServiceFailCallBack);

}
function callServiceSuccessCallBack(e) {
alert("Success");
}

function callServiceFailCallBack(f) {
alert("Failure");
}

你还需要在你的 res/xml/plugins.xml 中注册你的 phonegap 插件

<plugin name="BackgroundService" value="package-structure.BackgroundService"/>

【讨论】:

  • 感谢您的回复,我试试这个,但我的应用程序被强制关闭。在 logcat 中出现以下提到的错误请告诉我解决方案,请指导我。提前致谢。
  • 感谢您的回复,我试试这个,但我的应用程序被强制关闭。在 logcat 中出现错误请告诉我解决方案,请指导我。提前谢谢。
  • 我在日志中编辑了我的帖子 cat 错误。请验证并提前告诉我解决方案。
  • 嘿,你至少应该自己弄清楚这个。你必须使用上下文。 ctx.startService(new Intent(this,MyService.class));
  • 这个问题是“如何在 phonegap 中创建插件以在后台运行应用程序?”您的服务开始了。对于单独的问题,请启动一个新线程。这个问题已经变得复杂了。请接受答案并为新事物开始新线程。这对其他人会有所帮助...
【解决方案2】:

在从 DroidGap 扩展的 Java 类的 onCreate 方法中,确保您已正确设置“keepRunning”。

        super.setBooleanProperty("keepRunning", true);

【讨论】:

    猜你喜欢
    • 2013-03-17
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多