我有一个在手表上运行的应用程序,在有来电的情况下,它会在操作系统的来电屏幕上显示半透明的叠加活动。
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)是否有人对我的解决方案有任何建议 问题?我怎么总能让我的活动显示在 来电屏幕始终?
答案 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。