【问题标题】:How Can I call ShowForm from android native code?如何从 android 本机代码调用 ShowForm?
【发布时间】:2017-07-30 07:06:01
【问题描述】:

我正在使用 codenameone,我需要在 android 中执行一些本机代码,但这涉及更改内容视图,当我尝试让应用程序返回 codenameone 表单时,使用本机代码我最终会出现白屏,

无论如何我可以使用showForm 那codenameone 处理来自android 本机代码的导航??

在尝试了下面的 cmets 之后,这里是模拟案例时应用程序的日志猫:

??-?? ??:??:??.???: INFO/<unknown>(<unknown>): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.mycompany.myapp/.MyApplicationStub bnds=[540,672][786,960]} from uid 10010 on display 0 from pid 1738 ??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Start proc 31254:com.mycompany.myapp/u0a352 for activity com.mycompany.myapp/.MyApplicationStub ??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Gaining focus: Window{252c6842 u0 com.mycompany.myapp/com.mycompany.myapp.MyApplicationStub} ??-?? ??:??:??.???: INFO/<unknown>(<unknown>): [AppLaunch] Displayed Displayed com.mycompany.myapp/.MyApplicationStub: +335ms ??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Thread[1,tid=31254,WaitingForJniOnLoad,Thread*=0x7facc9a000,peer=0x760befb0,"main"] recursive attempt to load library "/data/app/com.mycompany.myapp-1/lib/arm64/libopentok.so" ??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Thread[1,tid=31254,WaitingForJniOnLoad,Thread*=0x7facc9a000,peer=0x760befb0,"main"] recursive attempt to load library "/data/app/com.mycompany.myapp-1/lib/arm64/libopentok.so" ??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Thread[1,tid=31254,WaitingForJniOnLoad,Thread*=0x7facc9a000,peer=0x760befb0,"main"] recursive attempt to load library "/data/app/com.mycompany.myapp-1/lib/arm64/libopentok.so" ??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Thread[1,tid=31254,WaitingForJniOnLoad,Thread*=0x7facc9a000,peer=0x760befb0,"main"] recursive attempt to load library "/data/app/com.mycompany.myapp-1/lib/arm64/libopentok.so" ??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Thread[1,tid=31254,WaitingForJniOnLoad,Thread*=0x7facc9a000,peer=0x760befb0,"main"] recursive attempt to load library "/data/app/com.mycompany.myapp-1/lib/arm64/libopentok.so" ??-?? ??:??:??.???: INFO/<unknown>(<unknown>): setMode: mode = 3; packageName = com.mycompany.myapp ??-?? ??:??:??.???: INFO/<unknown>(<unknown>): setMode: mode = 0; packageName = com.mycompany.myapp ??-?? ??:??:??.???: INFO/<unknown>(<unknown>): at com.mycompany.myapp.VideoChat$1.run(Unknown Source) ??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Process: com.mycompany.myapp, PID: 31254 ??-?? ??:??:??.???: INFO/<unknown>(<unknown>): at com.mycompany.myapp.NativeVideoChatImpl$VideoChat$4.onClick(NativeVideoChatImpl.java:234) ??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Force finishing activity 1 com.mycompany.myapp/.MyApplicationStub ??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Losing focus: Window{252c6842 u0 com.mycompany.myapp/com.mycompany.myapp.MyApplicationStub} ??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Process com.mycompany.myapp (pid 31254) has died ??-?? ??:??:??.???: INFO/<unknown>(<unknown>): channel '252c6842 com.mycompany.myapp/com.mycompany.myapp.MyApplicationStub (server)' ~ Consumer closed input channel or an error occurred. events=0x9 ??-?? ??:??:??.???: INFO/<unknown>(<unknown>): channel '252c6842 com.mycompany.myapp/com.mycompany.myapp.MyApplicationStub (server)' ~ Channel is unrecoverably broken and will be disposed! ??-?? ??:??:??.???: INFO/<unknown>(<unknown>): WIN DEATH: Window{252c6842 u0 com.mycompany.myapp/com.mycompany.myapp.MyApplicationStub} ??-?? ??:??:??.???: INFO/<unknown>(<unknown>): Attempted to unregister already unregistered input channel '252c6842 com.mycompany.myapp/com.mycompany.myapp.MyApplicationStub (server)'

【问题讨论】:

    标签: java android mobile cross-platform codenameone


    【解决方案1】:

    请参阅标题为“本机代码回调”的 advanced section in the developer guide

    创建一个静态方法,例如showForm() 在您创建表单的类中。在您的原生 Android 代码中,您可以使用实现该方法的类的完整包名来调用该方法,例如:com.mycompany.myapp.MyFormClass.showForm()

    实现该方法的类需要有一个对表单的引用,所以它可以是创建表单并保持对表单的静态引用的类。为了保留内存,您可能希望在表单被关闭时释放引用。

    在 iOS 和其他平台中,请遵循开发者指南中的指南,例如在这种情况下,iOS showForm() 看起来像这样(在您的 .m 文件的顶部:

    #include "com_mycompany_myapp_MyFormClass.h"
    

    那么当你想打电话给showForm()

    com_mycompany_myapp_MyFormClass_showForm__(CN1_THREAD_STATE_PASS_SINGLE_ARG);
    

    【讨论】:

    • 好答案 James,我对其进行了一些编辑,以便为 iOS 提供示例以及开发者指南的上下文
    • 我试过了,它没有调用它刚刚冻结的静态方法,因为 showForm not static 这里是我使用的代码的 sn-p public static void showForm(){ Dialog.show("hello", "testing if function called", null,null); UIBuilder ui=new UIBuilder(); ui.setResourceFilePath("/theme"); ui.showForm("Main", null); }@James H @Shai Almog
    • 我也试过这种方式:public static void showForm(){ Dialog.show("hello", "testing if function called", null,null); UIBuilder ui=new UIBuilder(); ui.setResourceFilePath("/theme"); Form mainForm = (Form)ui.createContainer(ui.getResourceFilePath(), "Main"); mainForm.show(); //ui.showForm("Main", null); }
    • 我忘了提到您可能需要将 show() 调用包装在 callSerially() 中,以便在 EDT 上完成。来自 Android 的回调可能在不同的线程上。
    • 好吧,我试过 Display.getInstance().callSerially(new Runnable() { @Override public void run() { // TODO Auto-generated method stub UIBuilder ui=new UIBuilder(); ui.showForm("Main", null); } }); 应用程序仍然冻结,当再次按下按钮时它崩溃 @James H
    【解决方案2】:

    在尝试了所有的场景之后,我注意到它实际上回到了表单但没有显示内容,所以这是我在另一个应用程序中遇到这个问题后所做的, 代码是在本机端实现的 -- 尝试改变时间段,当我少去的时候问题又回来了,所以这对我来说已经足够好了

    getActivity().finish();
                intent = new Intent(getContext(), MyApplicationStub.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
                handler = new Handler();
                timer = new Timer();    
                initializeTimerTask();
                timer.schedule(timerTask, 500);
    
    public void initializeTimerTask() {
    
                timerTask = new TimerTask() {
                    public void run() {
    
                        //use a handler to run a toast that shows the current timestamp
                        handler.post(new Runnable() {
                            public void run() {
                                getContext().startActivity(intent);
                            }
                        });
                    }
                };
            }
    

    感谢@JamesH 和@Shai 的所有帮助

    【讨论】:

    • @ShaiAlmog 做到了,但我没有使用那种方法 :) ,从原生修复
    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2013-06-09
    相关资源
    最近更新 更多