按下主页按钮后从系统覆盖窗口启动 Activity

Posted

技术标签:

【中文标题】按下主页按钮后从系统覆盖窗口启动 Activity【英文标题】:Starting an Activity from a system overlay window after pressing home button 【发布时间】:2015-05-14 02:52:36 【问题描述】:

我有一个系统覆盖窗口,一个类似于 Facebook 聊天头的浮动视图。

当用户按下窗口时,会启动一个 Activity 来显示内容。

问题是如果用户通过按主页按钮离开我的应用程序,那么由于系统限制(https://code.google.com/p/android/issues/detail?id=4536),Activity 无法在 5 秒内启动。 Activity 会在 5 秒后显示。

我在之前的 SO 问题上没有找到任何解决方案。但是,有一个应用程序,Link Bubble,可以解决这个问题。当用户按下浮动气泡视图时,总是可以立即弹出一个 Activity。

有人知道怎么做吗?

这是我的系统覆盖窗口的 LayoutParams:

windowParams = new WindowManager.LayoutParams(
            width, height,
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
            WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED | 
               WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
                   WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, 
            PixelFormat.TRANSLUCENT);

windowParams.gravity = Gravity.TOP | Gravity.LEFT;
windowParams.x = 0;
windowParams.y = 0;

我得到了 WindowManager

windowManager = (WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE);

并添加浮动视图

windowManager.addView(MY_VIEW, windowParams);

MY_VIEW 有一个 OnTouchListener 在用户按下它后启动一个 Activity。

【问题讨论】:

【参考方案1】:

解决此问题的一种可能方法是将 Home/Launcher 意图过滤器添加到您尝试启动的活动中。你可以通过添加这个来做到这一点

<intent-filter>

    <!-- The following two intent-filters are the key to set homescreen -->
    <category android:name="android.intent.category.HOME" />   
    <category android:name="android.intent.category.DEFAULT" /> 


</intent-filter>

当您这样做时,用户基本上可以选择将应用程序用作主屏幕。然后,无论何时开始活动,这都不会导致任何延迟。这是最接近这个问题的无根解决方案。

更新

另一种可能的解决方案是有一个中间助手活动,它反过来有一个 startActivity()。这将绕过 5 秒的延迟。确保中间活动具有透明的布局,以避免用户混淆。

【讨论】:

我尝试添加意图过滤器,但 Activity 仍然有 5 秒的延迟。有一个中间助手活动是什么意思? Activity 不能总是在所有其他应用程序之上运行,如果尝试重新启动它,它也会有 5 秒的延迟。【参考方案2】:

首先,将其添加到您的启动器活动中。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
    if (keyCode == KeyEvent.KEYCODE_BACK) 
        moveTaskToBack(false);
        return true;
    
    return super.onKeyDown(keyCode, event);

然后,将其添加到 AndroidManifest.xml 中的叠加活动中。

android:launchMode="singleInstance"

【讨论】:

以上是关于按下主页按钮后从系统覆盖窗口启动 Activity的主要内容,如果未能解决你的问题,请参考以下文章

覆盖后退按钮以充当主页按钮

按下主页按钮时,Swift CLLocationManager 弹出窗口不会停留

在android中检测主页按钮按下

试图按下主页上的应答按钮但窗口冻结:Tkinter

android 在一个Activity 中按下返回键,不结束这个Activity 而是返回上个页面,如何实现?

当用户按下主页按钮但在应用程序进入后台之前,如何从应用程序窗口的 rootViewController 呈现 viewController? [复制]