从后台线程启动活动

时间:2014-02-13 12:16:24

标签: android websocket android-activity

我有一个andoid-app,当用户登录时连接到WebSocket服务器。 如果用户空闲一段时间或由于某种原因他的会话到期/终止,应用程序将通过WebSocket连接得到通知,我想让他回到登录活动(如果他是,则应用程序中没有任何功能)没有登录)。

我已经研究过广泛的Intents和runOnUIThread(),但似乎无法让它工作。 我的想法是简单地注册正在运行的活动(例如,所有这些都实现了一个接口)并进行调用,但这意味着所有活动都必须实现该接口。它们中的大多数已经从BaseActivity类继承但不是全部。

我意识到突然破坏用户流的不良做法,但除非用户有有效的会话,否则这些功能都不起作用。

我使用android-websocket(https://github.com/koush/android-websockets)库作为客户端,如果这有任何区别。

先谢谢托马斯

编辑:有时我也想以Toast或Dialog的形式通知用户服务器上发生了某个事件。

3 个答案:

答案 0 :(得分:5)

我做了测试

  • 你可以从非ui线程
  • 启动活动
  • 您可以完成非ui线程的活动

查看ACRA项目 - 很好的异常处理。在第217行的ReportExecutor中(https://github.com/ACRA/acra/blob/master/acra/src/main/java/org/acra/builder/ReportExecutor.java#L217),活动在全新的线程中启动(没有runOnUiThread)。

我为什么工作太惊讶了。)

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

我认为这两种方法中的任何一种都应该有效:

  • 使用Handler:在Handler中设置Activity,覆盖其handleMessage,这样当您向其发送消息时,只需携带{ {1}}到前面(或开始)。把它带到前面:

    Activity
  • 使用Intent i = new Intent(this, MyMainActivity.class); i.setAction(Intent.ACTION_MAIN); i.addCategory(Intent.CATEGORY_LAUNCHER); startActivity(i); :没有理由不这样做,只需声明您的接收器,注册它以进行某些操作(可能是自定义的)并以与上述相同的方式启动活动。一旦完成或关闭应用程序,请不要忘记取消注册。

如果您需要任何示例,请提出要求。