这是一个集几个问题于一体的问题。基本上,我有一个有三个选项卡的选项卡应用程序。每个选项卡都需要访问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应用程序的生命周期一无所知?我的路上有什么陷阱吗?
此外,如果wiimanageractivity是在一个单独的线程,它如何处理调用一个方法,需要与另一个线程上的变量工作?在c#中,我会使用分派器来调用它,但在java/android中??
在简介:对我目前的计划有什么问题或建议吗?2)我如何从一个线程调用一个方法,并让它改变属于另一个线程的变量?
谢谢!
你的方法有很多问题。Activity
对象通常用于显示UI。在你的情况下,你可能想要实现整个WifiManager作为广播接收器,而不是在活动的onCreate
中注册接收器。
其次,你期望什么样的听众?是其他活动吗?我假设你的意图是在wifi状态改变时改变UI中的一些东西。由于一次只能激活一个活动,因此没有多大意义。
总的来说,我提出了两个设计方案:
-
使用中间服务,如果你需要响应WiFi的变化,而不管顶层的活动。
- 注册广播接收器查看WiFi状态
- 创建具有以下方法的服务。一个响应WiFi更改消息,另一个从顶层活动注册回调。可能需要额外一个来取消回调。
- 在您的活动中连接服务并在
onResume
方法中注册回调Messenger
。撤销onPause
.
当它出现在顶部时,你还需要刷新活动状态。
- 只要注册广播接收器,一旦你的活动到达堆栈的顶部。
听起来你想让这些东西在Service
而不是Activity
中运行。