我正在开发一个 Android 项目,该项目由几个不同的活动组成,这些活动都与同一个应用程序相关联。我们在应用程序中编码了一些常见任务,因此我们不必复制它们,其中一项任务是定期验证与专用服务器的 TCP 连接——我想是心跳。
如果检测到与服务器的连接丢失,我需要通知用户,并且我希望以一种不需要我检查所有可能的活动来查看当前“最重要”的方式来执行此操作.
有没有办法在不明确知道的情况下对 UI 线程上的任何活动调用 runOnUiThread()?
谢谢,
R。
我正在开发一个 Android 项目,该项目由几个不同的活动组成,这些活动都与同一个应用程序相关联。我们在应用程序中编码了一些常见任务,因此我们不必复制它们,其中一项任务是定期验证与专用服务器的 TCP 连接——我想是心跳。
如果检测到与服务器的连接丢失,我需要通知用户,并且我希望以一种不需要我检查所有可能的活动来查看当前“最重要”的方式来执行此操作.
有没有办法在不明确知道的情况下对 UI 线程上的任何活动调用 runOnUiThread()?
谢谢,
R。
定期验证 TCP 连接
听起来应该使用服务来实现..
如果警报非常简单,并且重要性最小,我建议使用Toast。
如果警报很重要,但不需要用户立即注意,请使用Notification。
如果警报需要立即引起用户注意,则应使用Dialog。您将无法直接从服务或广播接收器启动对话,因为它们没有与之关联的窗口,但您可以使用意图启动新任务的活动。您可以将活动设置为您想要的任何样式。它甚至可能看起来像一个对话框(或在启动时显示一个对话框)。在新任务中启动活动将确保用户可以导航回他们正在做的任何事情。
您可以通过发送 Intent 并在要通知的每个 Activity 中注册 BroadcastReceiver 来通知您的 Activity。
服务或应用程序可以是您的上下文:
Intent i = new Intent("MY_ACTION_FROM_SERVICE_STRING");
context.sendBroadcast(i);
活动:
public class MyActivity extends Activity {
private ActivityBroadcastReceiver recvr;
public void onReceiveCommand() {
//do something
}
@Override
public void onCreate(Bundle b) {
super.onCreate(b);
recvr = new ActivityBroadcastReceiver(this);
this.registerReceiver(recvr,
new IntentFilter("MY_ACTION_FROM_SERVICE_STRING"));
}
}
接收者:
public class ActivityBroadcastReceiver extends BroadcastReceiver {
private MyActivity target;
public ActivityBroadcastReceiver(MyActivity target) {
this.target = target;
}
@Override
public void onReceive(Context context, Intent intent) {
target.onReceiveCommand();
}
}
一种简单的方法(我的项目也采用了这种方法)是创建一个基Activity
类(最好是Abstracted),然后为extend
它创建正常的活动类。这样,您可以在抽象类中放置一段通用代码,这可以帮助您检测当前可见的活动。
此外,您可以BroadcastReceiver
在基本活动类中设置一个,无论在您的子活动中单独设置它,它都将始终准备好收听广播,然后将其设置为收听从您的 tcp thinggy 发送的广播。
不要做任何诡计。实施观察者模式,因此任何活动都会在其中注册其侦听器onResume()
并取消注册onPause()
,无论您的Application
目标代码发生什么,您只需将其告知已注册的侦听器,无论它们在什么活动中