0

这是几个问题合而为一的问题。基本上我有一个带有三个选项卡的选项卡式应用程序。每个选项卡都需要访问 Web 服务和 wifi API。我想通过为所有这些共享功能创建两个静态包装类来简化这一点,以便所有三个活动都可以使用相同的静态类。

我在 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。在您的情况下,您可能希望将整个 WifiManager 实现为广播接收器,而不是在 Activity 中注册接收器onCreate

其次,你期望的听众是什么?他们是其他活动吗?我假设您的意图是在 wifi 状态更改时更改 UI 中的某些内容。由于一次只能激活一项活动,因此没有多大意义。

总的来说,我提出了两种设计方案:

  • 如果您需要响应 WiFi 更改而不考虑顶级活动,请使用中间服务。

    1. 注册广播接收器以查看 WiFi 状态
    2. 创建具有以下方法的服务。一个用于响应 WiFi 更改消息,另一个用于注册顶级活动的回调。可能需要额外的一个来取消注册回调。
    3. 在您的活动中连接到服务并MessengeronResume方法中注册回调。中注销onPause

当涉及到顶部时,您还需要刷新活动状态。

  • 一旦您的活动到达堆栈顶部,只需注册广播接收器。
于 2011-07-06T23:03:07.277 回答
0

听起来您希望这些东西在 aService而不是Activity.

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

于 2011-07-06T18:27:38.813 回答