从后台线程启动活动

问题描述 投票:0回答:3

我有一个 android 应用程序,当用户登录时它会连接到 WebSocket 服务器。 如果用户闲置一段时间或由于某种原因他的会话过期/终止,应用程序会通过 WebSocket 连接收到通知,我想将他带回登录活动(如果他处于登录状态,则应用程序中没有任何功能)未登录)。

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

我意识到突然中断用户流程是一种不好的做法,但除非用户拥有有效的会话,否则所有功能都无法工作。

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

提前感谢托马斯

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

android websocket android-activity
3个回答
10
投票

我做了测试

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

看看 ACRA 项目 - 很好的异常处理。在

ReportExecutor.dialogAndEnd()
中,一个活动在一个全新的线程中启动(没有
runOnUiThread
)。

我很惊讶它为什么有效:)


2
投票

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

  • 使用

    Handler
    :在
    Handler
    中设置
    Activity
    ,覆盖其
    handleMessage
    ,这样当您向其发送消息时,只需将
    Activity
    置于前面(或启动它)即可。将其置于前面:

    Intent i = new Intent(this, MyMainActivity.class);
    i.setAction(Intent.ACTION_MAIN);
    i.addCategory(Intent.CATEGORY_LAUNCHER);
    startActivity(i);
    
  • 使用

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

如果您需要任何示例,请索取。


2
投票

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

  Intent newIntent= new Intent(getBaseContext(), MainActivity.class);
  newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  getApplication().startActivity(newIntent);
© www.soinside.com 2019 - 2024. All rights reserved.