如何检测状态栏的展开?

11

我的应用程序可以从我的应用程序启动另一个应用程序。 我的任何活动都不显示状态栏。 但是,当启动其他应用程序(例如相机)时,用户可以访问状态栏。 因此,我尝试了以下代码片段来折叠服务中的状态栏(这样它每次折叠,代码始终在运行)。

int currentapiVersion = android.os.Build.VERSION.SDK_INT;
Object service = getSystemService("statusbar");
Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
Method collapse = null;
if(currentapiVersion <= 16){
    collapse = statusbarManager.getMethod("collapse");
}else{
    collapse = statusbarManager.getMethod("collapsePanels");
}
collapse.setAccessible(true);
collapse.invoke(service);

现在我只想在用户尝试展开状态栏时才折叠状态栏。是否存在任何用于检测状态栏展开的意图或意图过滤器?


请查看以下链接以获取可行的解决方案:https://stackoverflow.com/questions/53509108/how-to-detect-when-the-notification-system-bar-is-opened/53509109#53509109 - The Hungry Androider
2个回答

15

在你的活动中覆盖onWindowFocusChanged()方法并编写以下代码。

这将使用以下权限:

<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />

@Override
public void onWindowFocusChanged(boolean hasFocus)
{
    try
    {
        if(!hasFocus)
        {
            Object service  = getSystemService("statusbar");
            Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
            Method collapse = statusbarManager.getMethod("collapse");
            collapse .setAccessible(true);
            collapse .invoke(service);
        }
    }
    catch(Exception ex)
    {
        if(!hasFocus)
        {
            try {
                Object service  = getSystemService("statusbar");
                Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
                Method collapse = statusbarManager.getMethod("collapse");
                collapse .setAccessible(true);
                collapse .invoke(service);

            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();                
            }
            ex.printStackTrace();
        }
    }
}

1
我无法使用onWindowFocusChanged()。因为这个焦点只针对我的活动,并且我在问题中指定可以从我的应用程序启动其他应用程序。那么这样就行不通了。 - Devu Soman
如果您的窗口除了启动器之外还有其他活动,您可以折叠状态栏。您可以查询PackageManager并获取顶部活动。如果顶部活动不是启动器,则必须折叠状态栏。 - Lalith B
@LalithB 我有一个基于RemoteViews的通知,当我打开通知面板并向下滑动时,我可以从smallContentView更改通知视图为BigContentView。但是,一旦通知面板关闭(向上滑动),我希望我的通知返回到SmallContentView。这可能吗? - Vivek Kumar
那将是另一个问题,是的,可以在远程视图本身处理。 - Lalith B
没有这样的方法叫做“collapse”。 - G. Ciardini

7

在Android上拖动通知栏时没有任何回调。

这是因为Android应用程序的设计意图是,通知栏的出现和消失不会以任何方式影响其功能。


我有一个基于RemoteViews的通知,当我打开通知面板并向下滑动时,我可以从smallContentView更改为BigContentView。但是,一旦通知面板关闭(向上滑动),我希望我的通知返回到SmallContentView。这可能吗? - Vivek Kumar
@dearvivekkumar 你如何检测通知面板的打开和向下滑动? - hasnain_ahmad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接