0

我正在开发一个 Android 项目,该项目由几个不同的活动组成,这些活动都与同一个应用程序相关联。我们在应用程序中编码了一些常见任务,因此我们不必复制它们,其中一项任务是定期验证与专用服务器的 TCP 连接——我想是心跳。

如果检测到与服务器的连接丢失,我需要通知用户,并且我希望以一种不需要我检查所有可能的活动来查看当前“最重要”的方式来执行此操作.

有没有办法在不明确知道的情况下对 UI 线程上的任何活动调用 runOnUiThread()?

谢谢,
R。

4

4 回答 4

2

定期验证 TCP 连接

听起来应该使用服务来实现..

如果警报非常简单,并且重要性最小,我建议使用Toast

如果警报很重要,但不需要用户立即注意,请使用Notification

如果警报需要立即引起用户注意,则应使用Dialog。您将无法直接从服务或广播接收器启动对话,因为它们没有与之关联的窗口,但您可以使用意图启动新任务的活动。您可以将活动设置为您想要的任何样式。它甚至可能看起来像一个对话框(或在启动时显示一个对话框)。在新任务中启动活动将确保用户可以导航回他们正在做的任何事情。

于 2012-09-12T14:39:03.007 回答
1

您可以通过发送 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();
    }
}
于 2012-09-12T14:38:25.813 回答
1

一种简单的方法(我的项目也采用了这种方法)是创建一个基Activity类(最好是Abstracted),然后为extend它创建正常的活动类。这样,您可以在抽象类中放置一段通用代码,这可以帮助您检测当前可见的活动。

此外,您可以BroadcastReceiver在基本活动类中设置一个,无论在您的子活动中单独设置它,它都将始终准备好收听广播,然后将其设置为收听从您的 tcp thinggy 发送的广播。

于 2012-09-12T14:41:53.387 回答
0

不要做任何诡计。实施观察者模式,因此任何活动都会在其中注册其侦听器onResume()并取消注册onPause(),无论您的Application目标代码发生什么,您只需将其告知已注册的侦听器,无论它们在什么活动中

于 2012-09-12T14:36:35.703 回答