1

私は Flex Mobile アプリの仕組みに慣れていないので、返信で説明してください。

私が作成したサービス アプリからインテントを受け取ることができる Android 用の Flex Mobile アプリを作成しようとしています。インテントには文字列が添付されており、アプリがその情報を取得することが非常に重要です。ただし、サービス アプリから送信されたインテントを Flex アプリで受信する方法がわかりません。

これまでのところ、 onReceive() が呼び出されるのに十分な時間を確保できることを期待して、アプリをネイティブ Android 側で 3 秒間一時停止させようとしました。これはうまくいきませんでした。

以下は私のコードです。私はあなたの助けに感謝します。

WiFi 機能は、サービスにインテントを送信して、Android で WiFi を有効にします。

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>
4

1 に答える 1

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();
        }
    }
}

編集:アクションスクリプト側でステータスイベントのリスナーを追加する

以下は、ネイティブ コードからステータス イベントを受信する際の重要な部分をまとめたすべての 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 );

        }
    }

}
于 2013-08-28T22:48:12.070 に答える