这是一个问题。基本上我有一个带有三个选项卡的选项卡式应用程序。每个选项卡都需要访问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)如何从一个线程调用一个方法并让它改变属于另一个线程的变量?
谢谢!
答案 0 :(得分:2)
您的方法存在许多问题。 Activity
个对象通常用于显示UI。在您的情况下,您可能希望将整个WifiManager实现为广播接收器,而不是在活动的onCreate
内注册接收器。
其次,你期待的听众是什么?他们是其他活动吗?我假设你的目的是在wifi状态改变时改变UI中的某些东西。由于一次只能激活一个活动,因此没有多大意义。
总的来说,我提出了两种设计方案:
如果您需要响应WiFi更改,请使用中间服务,无论顶级活动如何。
Messenger
方法中注册回调onResume
。取消注册onPause
。当涉及到顶部时,您还需要刷新活动状态。
答案 1 :(得分:0)
听起来您希望这些内容在Service
而不是Activity
中运行。
http://developer.android.com/reference/android/app/Service.html