websocket 从后台线程启动Activity

umuewwlo  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(162)

我有一个andoid应用程序,当用户登录时连接到WebSocket服务器。如果用户空闲一段时间或由于任何原因他的会话到期/终止,应用程序将通过WebSocket连接得到通知,我想让他回到登录活动(如果他没有登录,应用程序中没有功能)。
我已经研究过广播Intents和runOnUIThread(),但似乎无法让它工作。我的一个想法是简单地注册正在运行的Activity(例如,让它们都实现一个接口)并进行调用,但这意味着所有Activity都必须实现该接口。它们中的大多数已经从BaseActivity类继承,但不是全部。
我意识到突然中断用户流是不好的做法,但是除非用户有一个有效的会话,否则没有一个功能可以工作。
我使用android-websocket(https://github.com/koush/android-websockets)库作为客户端,如果这有什么区别的话。
提前感谢托马斯
编辑:有时我也想以吐司或对话框的形式通知用户服务器上发生了某个事件。

5sxhfpxr

5sxhfpxr1#

我做了测试

  • 您可以从非ui线程启动Activity
  • 您可以从非ui线程完成Activity

看看ACRA项目--很好的异常处理。在ReportExecutor.dialogAndEnd()中,一个Activity是在一个全新的线程中启动的(没有runOnUiThread)。
我很惊讶为什么它会起作用:)

ars1skjm

ars1skjm2#

我认为这两种方法都应该起作用:

  • 使用Handler:在Activity中设置一个Handler,覆盖它的handleMessage,这样当你向它发送消息时,你只需将Activity放在前面(或启动它)。要将它放在前面:
Intent i = new Intent(this, MyMainActivity.class);
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);

字符串

  • 使用BroadcastReceiver:这没有理由不起作用,只需声明您的接收器,为某些操作注册它(可能是自定义的),然后以与上述相同的方式启动Activity。完成后或关闭应用时,请不要忘记取消注册。

如果你需要一个例子,只要问它。

wgmfuz8q

wgmfuz8q3#

要从后台启动活动,请尝试以下代码

Intent newIntent= new Intent(getBaseContext(), MainActivity.class);
  newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  getApplication().startActivity(newIntent);

字符串

相关问题