如果你知道活动的生命周期,当另一个活动(来自同一个应用程序或来自另一个应用程序)出现在前台时,后台活动会进入onPause状态。
我希望我的活动在前台行动时好像它是一个浮动窗口,它不会中断其他正在运行的应用程序。
是否有为我的活动设置的标志是这样的?
我想过使用" Service"作为全屏浮动窗口,但是" Service"不能使用按下的硬件按钮(作为后退键按钮),这就是我需要使用活动的原因。
修改
问题仍然存在,所需要的是: -
1-当我的服务处于全屏模式和前台时,如何将使用过的按钮用作(后退,菜单等)?
OR
2-当我的活动结束/在其上面时,如何避免前台活动进入onPause状态?
我会回答150分来解决我的问题。
谢谢:)
答案 0 :(得分:2)
如果您想将之前的应用保留在前台并让您的应用显示在顶部,则可以使用SYSTEM_ALERT_WINDOW机制。这就是Facebook Messenger("聊天头"),Evernote,Pocket等用来在前台的应用程序顶部绘制一个窗口,通常只是简单地向用户显示在应用程序中发生的操作那个目前不在前台。
然而,这并不能创造一个完整的应用程序,因为这会破坏用户期望Android应用程序的工作方式,并可能导致一些可用性问题。它也是known to be open to abuse,所以有些用户反对使用它的应用,这可能会失去你的用户'如果您不清楚为什么希望您的应用以这种方式运作,请相信。但是,如果您希望为用户提供一些无法作为丰富通知有效完成的操作选项,则可以达到目的。
这里是example of how to implement it。 此外,还有一篇较长的文章解释了what it is and how it works。
更新信息以回应评论(放在这里以便我可以使用降价)
在示例中,有一个名为Main的 Activity 仅用于启动服务,因此 Service 属于应用程序包
Android上的权限是按包处理的,因此您需要在服务所属的项目的AndroidManifest.xml文件中声明您希望服务有权访问的权限。
运行后,OverlayShowingService会获取当前显示的WindowManager句柄。系统的 WindowManager 作为系统服务运行 - WINDOW_SERVICE,是操作系统用于显示当前正在运行的应用和活动的内容。
每个应用程序都在其自己的窗口内有效运行(顺便说一下,为什么Android N的新multi-window feature可以让多个应用程序同时运行而无需更改应用程序生命周期 - 它们已经存在于单独的窗口中,只是在彼此的顶部,而不是并排)。
因此,一旦运行, OverlayShowingService 以编程方式创建视图以显示在顶部(在示例的情况下,按钮) ,并通过调用 addView(..)将该视图添加到系统范围的 WindowManager :
wm.addView(overlayedButton, params);
这会立即将视图添加到坐标specified by x and y的屏幕上。
如果 Service 此时没有 SYSTEM_ALERT_WINDOW 权限,则不允许将视图添加到系统级WindowManager,否则任何恶意或制作成熟的应用程序可以在所有其他正在运行的应用程序的顶部添加视图到屏幕,并捕获屏幕输入。
Re:通知如何运作
它们也是使用系统服务创建的。通知的添加方式与将视图添加到WindowManager的方式类似:
如果你想制作一个与自定义Notification阴影等效的东西,你需要创建一个自己的系统服务,这将是编译你自己的ROM并替换部分操作系统的途径。特殊目的。如果达到这一点,您的用户将需要植根和/或运行自定义ROM。
更新 - 工作示例
今天早上我有几分钟的时间,所以将a working demo放在一起拦截来自SYSTEM_ALERT_WINDOW的后退按钮。您可以克隆它并直接运行它以查看拦截是如何工作的,并且代码中有一些简短的注释来解释这些步骤。
仅拦截后退按钮,但您可以使用相同的方法来处理其他键类型。但请注意,有许多不同类型的Android设备,其中有硬件和软件密钥,在不同版本的Android上运行,可能无法在每台设备上制作出可靠的解决方案。特别是对于菜单按钮这样的东西,大多数新设备不再拥有;当你在大多数应用程序中看到菜单点时,它在应用程序本身内处理,而不是作为系统级交互处理,因此除非你直接修改这些应用程序,否则不能拦截该操作。
有一个好的。