Android应用程序,活动和UI线程

时间:2012-09-12 14:34:05

标签: android android-ui

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

如果检测到与服务器的连接丢失,我需要通知用户,并且我想以不要求我检查所有可能活动的方式执行此操作,以查看当前“在顶部“。

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

谢谢,
R上。

4 个答案:

答案 0 :(得分:2)

  

定期验证TCP连接

听起来应该使用service ..

来实现

如果提醒非常简单且重要性最低,我建议使用Toast

如果提醒至关重要,但并不需要用户立即关注,请使用Notification

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

答案 1 :(得分:1)

您可以通过发送Intent并在每个要通知的活动中注册BroadcastReceiver来通知您的活动。

服务或应用程序可以是您的上下文:

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();
    }
}

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

不要做任何诡计。实现Observer模式,因此任何活动都会在onResume()中注册其侦听器并在onPause()中取消注册,并且无论发生什么,Application目标代码只需告诉已注册的侦听器,无论是什么他们所在的活动