0

これは一種のいくつかの質問です。基本的に、3 つのタブを持つタブ付きアプリケーションがあります。各タブは、Web サービスと wifi API にアクセスする必要があります。3 つのアクティビティすべてが同じ静的クラスを使用できるように、このすべての共有機能に対して 2 つの静的ラッパー クラスを作成することで、これを簡素化したいと考えています。

私はAndroid/Javaでかなり慣れていないので、ここでいくつかのポインタを探しています.

例として、これが私の Wifi クラスです。リスナーを登録し、スキャン結果を受信するたびに投稿します。それらに注意を払いたいかどうかを決定するのは加入者次第です。

public final class WifiManagerActivity extends Activity {

    private static WifiManager _wm;
    private static List<OnWifiRecievedListener> _listeners;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        _wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
        if (!_wm.isWifiEnabled()) 
            _wm.setWifiEnabled(true);

        _listeners = new ArrayList<OnWifiRecievedListener>();

        IntentFilter i = new IntentFilter();
        i.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 
        registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                publishResults(_wm.getScanResults());
                _wm.startScan();
            }
        }, i);
        _wm.startScan();
    }

    private static void publishResults(List<ScanResult> results){
        for (int i = 0; i < _listeners.size(); i++)
             _listeners.get(i).onWifiRecieved(results);
    }

    public static void addWifiRecievedListener(OnWifiRecievedListener owrl) {
        if (!_listeners.contains(owrl))
            _listeners.add(owrl);
    }

    public static void removeWifiRecievedListener(OnWifiRecievedListener owrl){
        if (_listeners.contains(owrl))
            _listeners.remove(owrl);
    }   
}

これは有効ですか?それとも、Android アプリケーションのライフサイクルを知らないのでしょうか? 私のやり方に落とし穴はありますか?

また、WifiManagerActivity が別のスレッドにある場合、別のスレッドで変数を操作する必要があるメソッドの呼び出しをどのように処理するのでしょうか? C# では、ディスパッチャーを使用して呼び出しますが、java/android?? を使用します。

要約すれば:

1) 現在のプランに何か問題や提案はありますか?
2) あるスレッドからメソッドを呼び出して、別のスレッドに属する変数を変更するにはどうすればよいですか?

ありがとう!

4

2 に答える 2

2

あなたのアプローチには多くの問題があります。Activityオブジェクトは通常、UI を表示するために使用されます。あなたの場合、アクティビティのonCreate.

第二に、期待されるリスナーは何ですか? それらは他の活動ですか?あなたの意図は、wifiの状態が変化したときにUIで何かを変更することだと思います。一度にアクティブにできるアクティビティは 1 つだけなので、あまり意味がありません。

全体として、2 つの設計オプションを提案します。

  • トップ レベルのアクティビティに関係なく、WiFi の変更に対応する必要がある場合は、中間サービスを使用します。

    1. ブロードキャスト レシーバーを登録して WiFi の状態を監視する
    2. 次のメソッドを持つサービスを作成します。1 つは WiFi 変更メッセージに応答し、もう 1 つは最上位アクティビティからのコールバックを登録します。コールバックを登録解除するための追加の可能性があります。
    3. アクティビティでサービスに接続し、コールバックMessengeronResumeメソッドに登録します。で登録を解除しonPauseます。

また、トップになると、アクティビティの状態を更新する必要があります。

  • アクティビティがスタックの一番上に来たら、ブロードキャスト レシーバーを登録するだけです。
于 2011-07-06T23:03:07.277 に答える
0

.ではServiceなくActivity.

http://developer.android.com/reference/android/app/Service.html

于 2011-07-06T18:27:38.813 に答える