如何从JavaScript /或Cordova插件调用/启动Android onResume?

时间:2014-07-09 16:02:45

标签: android broadcastreceiver ibm-mobilefirst cordova-plugins

1. Javascript file ------ calls -------> CORDOVA PLUGIN(plugin.java)
2. CORDOVA PLUGIN(plugin.java) file -------calls-------> Android BroadcastReceiver file(Broadcast_Receiver.java)

Broadcast_Receiver.java包含onResume 如何从Javascript文件中调用/启动它?

请参阅底部的示例代码

问题#1:我无法组合plugin.java和amp; Broadcast_Receiver.java因为它们正在扩展CordovaPlugin& WLDroidGap分别。

问题#2:当我在worklight应用程序的页面之间导航时;因为onResume是原生Android代码,所以Broadcast_Receiver.java的onResume永远不会被触发

我无法实施的可能解决方案:

  1. 使用cordova onResume,即:document.addEventListener("resume", function() { });
  2. 合并plugin.java& Broadcast_Receiver.java
  3. 简而言之:如何使用Cordova插件启动android生命周期?

    示例代码

    Javascript文件调用插件

        //some code
        currentPage.myfunction= function() {
            cordova.exec(Success, Failure, "plugin","someMETHOD", []);
    }
    

    plugin.java

    public class plugin extends CordovaPlugin
    {
    //some code
    
        float value= Broadcast_Receiver.Variable_Name;
    
    //some code
    }
    

    Broadcast_Receiver.java

    public class roamingadvisor extends WLDroidGap {
    
    //some code
    
    onCreate(){}
    onResume(){}
    onPause(){}
    
    
    //some code
    }
    

    我想要实现的目标
    我的应用程序一旦收到广播数据被激活就开始计算数据使用情况

    1. 我可以计算数据使用量 一旦我按下主页按钮&重新启动我的应用程序(即在android中触发原生onResume)

    2. 但是当我继续使用我的应用程序时(即在UI屏幕之间导航)本机android onResume永远不会被触发

    3. 或者

      我应该使用完全不同的方法吗?

      *******R&D *******
      

      我在下面使用了两个链接

      https://apache.googlesource.com/cordova-android/+/2.6.x/framework/src/org/apache/cordova/Device.java
      https://github.com/apache/cordova-android/blob/master/framework/src/org/apache/cordova/CordovaPlugin.java
      

      并为我的需要编写了以下代码

      public class Myclass extends CordovaPlugin {
      
      
      
          IntentFilter intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
          boolean multitasking=true;
          BroadcastReceiver mReceiver=null;
      
          //constructor
          public MyDataUsage(){
      
          }
      
      
          public void initialize(CordovaInterface cordova, CordovaWebView webView) {
      
              super.initialize(cordova, webView);
              //Device.uuid = getUuid();
              this.initReceiver();
          }
      
          @Override
          public void onPause(boolean multitasking) {
      
              super.onPause(multitasking);
              this.cordova.getActivity().unregisterReceiver(this.mReceiver);
          }
      
          @Override
          public void onResume(boolean multitasking) {
      
              super.onResume(multitasking);
              this.cordova.getActivity().registerReceiver(this.mReceiver, intentFilter);
          }
      
      
      
          public void onDestroy() {
      
              this.cordova.getActivity().unregisterReceiver(this.mReceiver);
          }
      
      
          private void initReceiver() {
      
              this.mReceiver=new BroadcastReceiver(){
      
                  @Override
                  public void onReceive(Context context, Intent intent) {
                      ctb=context;
                      if (intent.getAction().equals("android.net.conn.CONNECTIVITY_CHANGE"))
                              {
                      //My code
      
      
                      }
      
      
      
                  }
                  }
      
              };
      
              this.cordova.getActivity().registerReceiver(this.mReceiver, intentFilter);
          }
      
      
      
          public boolean execute(String action, JSONArray arr,
                  final CallbackContext callbackcontext) throws JSONException {
      
      
              if (action.equals("getDataUsage")) {
      
                  try {
                       //code
                      callbackcontext.success(""+dataUsed+ ":" +timeElapsed+":"+StartTime);
                  } catch (Exception e) {
                      callbackcontext.error("ERROR :");
                  }
      
                  return true;
              }
      
              return false;
      
          }
      
      }
      

      但onPause& onResume只有在我按HOME键和时才会被调用RELAUNCH我的APP

      Should i CONCLUDE that " I can not implement ACTIVITY LIFECYCLE while naviagting in my UI/html SCREEN/pages" ???
      

1 个答案:

答案 0 :(得分:4)

默认情况下,Cordova应用程序由一个托管单个WebView的Activity组成。当您在Web中导航页面/更改内容时,您将无法从Activity获取任何生命周期事件,因为从技术上讲,您仍处于同一活动的上下文中。

请注意,CordovaPlugin类具有许多Activity生命周期方法的回调,您可以利用它们(https://github.com/apache/cordova-android/blob/master/framework/src/org/apache/cordova/CordovaPlugin.java)。例如,使用initialize()方法开始计算,使用onDestroy()方法检测应用程序何时关闭。您还可以根据您尝试实现的逻辑使用其他CordovaPlugin方法,如onResume()和onPause()。