当前位置: 首页 > 知识库问答 >
问题:

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

祝英博
2023-03-14

我有一个在手表上运行的应用程序,如果有来电,它会在操作系统的来电屏幕上显示一个半透明的覆盖活动。

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)为什么有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个答案

赵晟睿
2023-03-14

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

楚宇
2023-03-14

TL;DR:您想在手机窗口出现时检测准确的时刻,或者给您的视图赋予高于WindowManager的优先级。布局参数。键入电话。前者在新的Android版本上很难实现,但仍有可能实现。以后需要权限,但。。。见下文。

使用SYSTEM\u ALERT\u窗口很容易,而且有很多应用程序出于平凡的原因需要此权限。你真的比Facebook更受约束吗?您不必将视图置于活动中以这种方式显示,只需创建一个窗口,将其类型设置得足够高,然后将其附加到WindowManager即可。查看此应用程序的源代码以了解此类方法的示例

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

  • 用于监视android上其他应用程序的应用程序

这是相当丑陋和特别的,但在所有Android版本上仍然是可能的。

但是你真的需要一个活动来完成你的这个技巧吗?吐司有很高的视图优先级,可以包含你想要的任何状态。

谭卜鹰
2023-03-14

问题1)为什么有5%的时间会暂停()呢?

这是一个时间问题,调用应用程序也会听到一些启动意图,以及您的应用程序。首先显示您的活动,然后显示呼叫屏幕。是否检查活动管理器日志

问题2)有人对我的问题的解决方案有什么建议吗?我如何总是让我的活动始终显示在进线量屏幕的顶部?

获得通话意图后,检查正在运行的应用程序,确保显示通话应用程序,然后启动活动。

下面是一个检查另一个应用程序是否正在运行的示例

或者在达到目的后,增加一点延迟并显示您的活动?

 类似资料:
  • 问题内容: 我的PC上没有太多内存,处理器也很弱。尽管到目前为止,netbeans是我最喜欢的IDE,但在我现有的计算机上使用它几乎是难以忍受的,因为打开程序时,项目扫描会自动开始。 有没有办法防止Netbeans扫描项目? 问题答案: 嗨,乔治,我不知道这是否是答案,但是我右键单击并在不需要打开的项目上选择“关闭”。将您过去的所有项目都列出在那里是没有意义的。只需将您正在开发的那个打开。您始终可

  • 我是一名学生,我想知道是否有一种方法可以将一个变量从它的范围块中取出,用于本地范围?我正在尝试对一个商店进行编码,在那里用户可以选择他们想要购买什么,他们想要购买多少,并给他们同一商品的总付款。现在在块范围之外,我想给出他们购买每件商品的总金额。这是我的代码: 感谢:

  • 问题内容: 有谁知道如何修理它。我正在使用Mac OS 10.8.2 问题答案: 在Python 3中是一个函数;它应该是: 正确安装或使用新版本(如果存在错误)。 在Python 3.3上工作正常。

  • assertEquals(“Amsterdam,Noord-Holland”,Driver.FindElement(by.id(“van”)).getText()); 然而,这导致: org.junit.comparisonfailure:预期:<[荷兰阿姆斯特丹]>但实际:<[]> 所以看起来比较失败是正确的,但我不知道为什么我不能断言我在屏幕上看到的东西。 我正在使用Java、Selenium

  • 问题内容: 我是ElasticSearch的新手,对停用词有疑问。我有一个索引,其中包含美国的州名。例如:纽约/纽约州,加利福尼亚/加拿大,俄勒冈州/俄勒冈州。我相信俄勒冈州的缩写“ OR”是一个停用词,因此当我将状态数据插入索引时,无法搜索“ OR”。有什么办法可以为此设置自定义停用词,还是我做错了什么? 这是我建立索引的方式: 搜索“ NY”,效果很好。例如: 但是搜索“ OR”会返回零命中: