1

Я новичок в работе приложений Flex Mobile, поэтому, пожалуйста, будьте описательными в своих ответах.Как использовать BroadcastReceivers в приложении Flex Mobile?

Я пытаюсь создать приложение Flex Mobile для Android, которое может получить намерение от созданного мной сервисного приложения. У намерения есть строка, прикрепленная к ней, и очень важно, чтобы мое приложение получало эту информацию. Тем не менее, я не могу понять, как заставить приложение Flex получать намерения, отправленные сервисом.

До сих пор я пытался сделать паузу приложения на родной стороне Android в течение 3 секунд в надежде, что это позволит достаточно времени для вызова onReceive(). Это не сработало.

Ниже приведен мой код. Я ценю вашу помощь.

Функция WiFi посылает намерение службе активировать WiFi на Android.

Функция WiFi_info должна возвращать данные, которые прикреплены к намерению, которое получит это приложение.

ANESimpleApp.as - ActionScript, библиотека

package com.example.anesimpleapp 
{ 
    import flash.external.ExtensionContext; 

    public class ANESimpleApp 
    { 
     // This will hold the context for the Native Android side of the plugin 
     private var context:ExtensionContext; 

     // Get a context of the ANE 
     public function ANESimpleApp() 
     { 
      // Checks if the context was already setup 
      if(!context) 
      { 
       context = ExtensionContext.createExtensionContext("com.example.anesimpleapp", null); 
      } 
     } 

     // Turn On/Off the Wifi 
     public function WiFi(): void 
     { 
      context.call("WiFi", null); 
     } 

     // Get WiFi information 
     public function WiFi_Info(): String 
     { 
      return String (context.call("WiFi_info", null)); 
     } 
    } 
} 

WiFi_info.java - Родные Android код

public class WiFi_info implements FREFunction { 

    // This will retrieve information about the WiFi network the phone is currently connected to 
    public String connectionData = "EMPTY"; 

    // This is used to reference the string value describing the WiFi network the phone is currently connected to. 
    public final String KEY_WiFi_Info = "Update_WiFi_Info"; 

    // The expected intent 
    public final String WiFi_Data = "com.example.Obtain_WiFi_Data"; 

    // Created a Runnable object 
    Runnable myRun; 


    @Override 
    public FREObject call(FREContext context, FREObject[] object) { 

     // The runnable object will be used to allow enough time for the BroadcastReceiver to set itself up 
     myRun = new Runnable() { 
      @Override 
      public void run() 
      { 
       // Causes this activity to wait 3 second. 
       try { 
        Thread.sleep(3000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 


     // Sets up intent filter and BroadcastReceiver 

     // This intent filter will allow the application to receive certain intents 
     IntentFilter filter = new IntentFilter(); 

     // This allows the application to receive data about the WiFi 
     filter.addAction(WiFi_Data); 

     // Registers the BroadcastReceiver onReceive() in this app 
     context.getActivity().registerReceiver(mybroadcast, filter); 


     // Generates a 3 second pause 
     Thread myThread = new Thread(myRun); 
     myThread.start(); 


     // Returns the information obtained from onReceive() 

     // This will be used to hold the value returned from the function 
     FREObject returnValue = null; 

     try { 
      // Obtains a string containing information about the WiFi network the phone is 
      // currently connected to. 
      returnValue = FREObject.newObject(connectionData); 

     } catch (FREWrongThreadException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 

      return null; 
     } 

     // Unregisters the BroadcastReceiver (Don't want any leaked receivers) 
     context.getActivity().unregisterReceiver(mybroadcast); 

     // Returns value 
     return returnValue; 
    } 


    // Receives the intent and places extra in class variable 
    public BroadcastReceiver mybroadcast = new BroadcastReceiver() 
    { 
     @Override 
     public void onReceive(Context context, Intent intent) 
     { 
      if(intent.getAction().equalsIgnoreCase(WiFi_Data)) 
      { 
       connectionData = intent.getStringExtra(KEY_WiFi_Info); 
      } 
     } 
    }; 
} 

ANESimpleAppTestHomeView.mxml

<?xml version="1.0" encoding="utf-8"?> 
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" title="HomeView"> 
    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 
    <fx:Script> 
     <![CDATA[ 
      import com.example.anesimpleapp.ANESimpleApp; 

      [Bindable(event="UpdateTime")] 
      private function WifiUpdate(): String 
      { 
       var ane:ANESimpleApp = new ANESimpleApp(); 
       return ane.WiFi_info(); 
      } 

      public function button1_WiFiActivation(event:MouseEvent):void 
      { 
       var ane:ANESimpleApp = new ANESimpleApp(); 
       ane.WiFi(); 
      } 

      public function button2_WiFiUpdater(event:MouseEvent):void 
      { 
       dispatchEvent(new Event("UpdateTime")); 
      } 
     ]]> 
    </fx:Script> 
     <s:VGroup> 
      <s:HGroup> 
       <s:Button id="button1" 
        x="25" 
        y="27" 
        label="WiFi" 
        click="button1_WiFiActivation(event)"/> 

       <s:Button id="button2" 
        x="25" 
        y="27" 
        label="WiFi Info" 
        click="button2_WiFiUpdater(event)"/> 
      </s:HGroup> 

      <s:TextArea id="WiFiInfo" 
       width="65%" 
       editable="false" 
       borderVisible="false" 
       contentBackgroundColor="0xFFFFFF" 
       contentBackgroundAlpha="0" 
       height="400" 
       text="{WifiUpdate()}"/> 
    </s:VGroup> 
</s:View> 

ответ

0

Я думаю, что ваш код не будет корректно останавливаться на 3 секунды. Похоже, что вы запускаете другой поток, чтобы сделать задержку, которая будет означать, что ваш код зарегистрируется и отменит регистрацию получателя до того, как будут предприняты какие-либо действия.

Было бы лучше вообще не использовать задержку и вместо этого отменить регистрацию приемника в реальной функции BroadcastReceiver onReceive. Для этого вам может потребоваться сохранить ссылку на контекст в вашем классе расширения Extension.context (хотя вы, вероятно, уже это делаете).

Также я предлагаю вам разбить BroadcastReceiver на отдельный класс, чтобы лучше очистить код, и вы должны ссылаться на него где-то более глобальным, чем FREFunction, например, в вашем FREContext.Я просто пишу некоторые псевдо-код здесь, чтобы дать Вам идею:

Расширение:

public class ANEExtension implements FREContext 
{ 
    public static FREContext context; 

    public FREContext createContext(String arg0) 
    { 
     context = new ANEContext(); 
     return context; 
    } 

    // Other functions... 
} 

Контекст:

public class ANEContext implements FREContext 
{ 
    public WifiReceiver receiver = null; 

    public void registerWifiReceiver() 
    { 
     if (receiver == null) 
     { 
      receiver = new WifiReceiver(); 
      IntentFilter filter = new IntentFilter(); 
      filter.addAction("com.example.Obtain_WiFi_Data"); 
      getActivity().registerReceiver(receiver, filter); 
     } 
    } 

    public void unregisterWifiReceiver() 
    { 
     if (receiver != null) 
     { 
      getActivity().unregisterReceiver(receiver); 
      receiver = null; 
     } 
    } 

    // .. Map<> getFunctions etc... 
} 

Функция класса: класс

public class WiFi_info implements FREFunction 
{ 
    @Override 
    public FREObject call(FREContext context, FREObject[] object) 
    { 
     ((ANEContext)context).registerWifiReceiver(); 

     // return stuff... 
     return NULL; 
    } 
} 

Приемник:

public class WifiReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     if(intent.getAction().equalsIgnoreCase(WiFi_Data)) 
     { 
      connectionData = intent.getStringExtra(KEY_WiFi_Info); 

      // 
      // Return Data 
      if (ANEExtension.context) 
      { 
       ANEExtension.context.dispatchStatusEventAsync( 
        "some:event:type", 
        connectionData 
       ); 
      } 
      // 
      // 


      ((ANEContext)ANEExtension.context).unregisterWifiReceiver(); 
     } 
    } 
} 

Edit: Добавление слушателя для статусных событий на Actionscript стороны

Ниже все AS3 коды подведения важных частей приема события состояния от родного кода.

public class WifiExtension extends EventDispatcher 
{ 
    public static const EXT_CONTEXT_ID : String = "the.extension.id"; 

    public function WifiExtension() 
    { 
     _extContext = ExtensionContext.createExtensionContext(EXT_CONTEXT_ID, null); 
     _extContext.addEventListener(StatusEvent.STATUS, extension_statusHandler, false, 0, true); 
    } 

    private function extension_statusHandler(event:StatusEvent):void 
    { 
     switch (event.code) 
     { 
      case "some:event:type": 
       trace("The data from the native code = " + event.level); 

     } 
    } 

} 
+0

Я ценю ваш ответ, и я сожалею, что не ответил раньше. Я попробовал вашу идею, но, к сожалению, это не сработало. Кроме того, в созданном BroadcastReceiver вы не отправили полученную строку из полученного намерения функции WiFi_info(), чтобы она могла быть передана пользователю, и это то, что мне нужно, чтобы ANE выполнял. Есть ли у вас какие-либо другие идеи, которые я могу попробовать? –

+0

Что именно не сработало, я использую эту точную технику в нескольких своих собственных ANE. Что касается отправки данных назад, вы не можете отправить их обратно в функцию, вам нужно будет использовать асинхронное событие, чтобы отправить его обратно в ActionScript. Я отредактирую ответ, чтобы показать пример – Michael

+0

Я имел в виду, что процесс отправки данных на сторону ActionScript не работал. Я также попробовал то, что вы предложили, отправив данные как часть события. Однако это не сработало. Я все еще очень новичок в ActionScript, поэтому я, возможно, не смог реализовать это правильно. Не могли бы вы привести пример того, как отправлять данные через событие? –

Смежные вопросы