我正在开发一个Android项目,该项目由几个与同一个应用程序关联的不同活动组成。我们在应用程序中编写了一些常见任务,这样我们就不必复制它们了,其中一个任务就是定期验证与专用服务器的TCP连接 - 我想是一个心跳。
如果检测到与服务器的连接丢失,我需要通知用户,并且我想以不要求我检查所有可能活动的方式执行此操作,以查看当前“在顶部“。
有没有办法在UI线程上的任何活动上调用runOnUiThread()而不明确知道它?
谢谢,
R上。
答案 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
目标代码只需告诉已注册的侦听器,无论是什么他们所在的活动