如果活动刚刚停止,有没有办法将活动移回前台?

时间:2015-03-27 17:27:31

标签: android android-activity

我有一个在手表上运行的应用程序,在有来电的情况下,它会在操作系统的来电屏幕上显示半透明的叠加活动。

95%的时间效果很好,但对于其他5%的时间,我的活动在来电时看不到。不同之处在于,当它不起作用时,我的活动onPause()和onStop()会在onCreate()后立即调用,即

成功显示时记录:

03-27 10:04:41.958 onCreate() 
03-27 10:04:41.981 onStart()
03-27 10:04:41.981 onResume()

不显示时记录:

03-27 09:54:53.346     onCreate() 
03-27 09:54:53.367     onStart()
03-27 09:54:53.367     onResume()
03-27 09:54:53.373     onPause()
03-27 09:54:53.437     onStop()

了解它如何直接从onResume()跳转到onPause()。 我这样做的猜测可能是它的时间问题,并且在这5%的失败中,我的活动在来电屏幕的活动之前启动了几分之一秒,这导致它转移到onPause()状态。虽然onResume()和onPause()

之间只有微秒
  

问题1)是否有任何其他原因导致其进入onPause()   5%的时间?

我尝试添加此代码以纠正这种情况:

protected  void onStop()
{
    Log.i(TAG, "  ACTIVITY onStop()");
    super.onStop();
    if (/*activity isn't being stopped because I am dismissing it*/)
    {
        moveToFront();
    }
}

private void moveToFront()
{
    final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    final List<ActivityManager.AppTask> tasks = activityManager.getAppTasks();
    Integer count = tasks.size();
    // There should only ever be one task as a launchMode of singleInstance is used
    ActivityManager.AppTask task = tasks.get(0);
    task.moveToFront();
}

然而,这不起作用,因为在调用moveToFront()后我的活动不可见。

  

问题2)是否有人对我的解决方案有任何建议   问题?我怎么总能让我的活动显示在   来电屏幕始终?

3 个答案:

答案 0 :(得分:1)

  

问题1)是否有任何其他原因导致其进入onPause()   5%的时间?

这是一个时间问题,Call app也会听取一些启动意图和你的应用程序。 首先显示您的活动,然后调用屏幕。检查活动管理器日志?

  

问题2)是否有人对我的解决方案有任何建议   问题?我怎么总能让我的活动显示在   来电屏幕始终?

获取通话意图后,请浏览正在运行的应用程序并确保显示通话应用,然后启动您的活动。

检查另一个应用是否正在运行的示例是here

或者在获得意图后添加一点延迟并显示您的活动?

答案 1 :(得分:0)

您可以尝试延迟启动活动,以便在系统调用屏幕后始终启动您的活动。但这可能会在设备速度慢的情况下失败,或者可能需要更长的时间才能显示您的活动。 更好的方法是使用来自服务的SYSTEM_ALERT_WINDOW等标志在屏幕上显示视图。

答案 2 :(得分:0)

TL; DR:您想要检测精确的时刻,手机窗口何时出现,或者让您的视图优先级高于WindowManager.LayoutParams.TYPE_PHONE。对于新的Android版本,前者很难避开,但仍有可能完成。以后需要获得许可,但是......见下文。

使用SYSTEM_ALERT_WINDOW非常简单,并且有很多应用程序需要此权限才能解决这些问题。你真的比Facebook更受限制吗?您不必将视图放在Activity中以这种方式显示它,只需创建一个窗口,将其类型设置得足够高并将其附加到WindowManager。有关此类方法的示例,请参阅this app's source code

关于检测当前前景活动的详细研究可以在对这些问题的回答中找到:

这是相当丑陋和临时性的,但仍然可以在所有Android版本上使用。

但你真的需要一个活动来解决这个问题吗? Toast具有高视图优先级,可以包含您想要的任何状态blabber。