dialog延迟显示,被activity覆盖不显示

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dialog延迟显示,被activity覆盖不显示相关的知识,希望对你有一定的参考价值。

如果您想让Dialog在Activity覆盖的情况下也能正常显示,并且避免延迟显示的问题,可以尝试使用以下方法:

1. 在创建Dialog的时候,使用ApplicationContext而不是Activity本身的Context来创建Dialog。例如:

```
Dialog dialog = new Dialog(getApplicationContext());
```

2. 使用Handler的post()方法来创建Dialog。在Activity执行onResume()方法后,使用Handler.post()方法来创建Dialog,这样就可以避免在Activity启动期间出现的延迟显示问题。

```
Handler handler = new Handler();
handler.post(new Runnable()
@Override
public void run()
Dialog dialog = new Dialog(MainActivity.this);
dialog.show();

);
```

3. 在Activity执行onResume()方法之前先创建Dialog,然后在Activity启动后再显示Dialog。

```
Dialog dialog = new Dialog(this);

@Override
protected void onResume()
super.onResume();
dialog.show();

```

以上这些方法都可以解决Dialog延迟显示、被Activity覆盖的问题,您可以根据自己的需求选择其中一种方法来优化您的应用。
参考技术A 最容易的办法就是给 dialog 再设置一次 setContentView() 。通常情况下如果 dialog 消失,在重新显示的时候,会自动调用上次使用的布局。

但是针对 activity 覆盖的情况,可以在 onResume 方法里面重新设置一次 dialog 的内容,也就是重新调用一次 setContentView 这样可以保证 dialog 的内容总是可见的。

另外也可以考虑在 dialog 中加入一个回调函数,当 dialog 显示的时候回调这个函数,然后在函数里面重新调用 setContentView 方法来重新显示 dialog 。
参考技术B 你好!在这种情况下,可以尝试的解决办法包括实现一个DialogFragment,而不是一个普通的Dialog,将它添加到当前Activity,并在覆盖activity时可以显示出来。同时,还可以尝试使用android:windowIsFloating属性强制dialog浮动于当前activity上方。 参考技术C 原由是在Act中,跳转到其他Act时,回传参数后显示Dialog,
1.其他跳转的ACt在选择后都会finsh掉
2.使用eventbus 进行传值传参
event回传参数后,进行显示Dialog,网上查的是在其他ACT在finsh时,未成功传值就挂掉了。
我也试过在回传值时做延迟finsh,但不行。
目前的解决方法是:
直接在该ACT中做延迟后显示即可

当接近传感器被覆盖时保持显示

【中文标题】当接近传感器被覆盖时保持显示【英文标题】:Keep display on when the proximity sensor is covered 【发布时间】:2014-11-26 11:20:53 【问题描述】:

我想在不关闭显示器的情况下拦截接近传感器。

我从文档中知道我有两个 Bool 变量:

proximityMonitoringEnabled
proximityState

还有这段代码

[UIDevice currentDevice].proximityMonitoringEnabled = YES;

当接近传感器检测到某些东西时,它会关闭显示屏,就像打电话时将手机放在耳边时一样。

当接近传感器被覆盖时,如何保持显示屏开启?

【问题讨论】:

您好,感谢您的回答。好的,通过您的代码,我可以知道接近传感器的状态,但如果状态为“是”,显示屏是否仍然不可见? 【参考方案1】:

在阅读了有关该主题的不同论坛后,我们目前无法在公共 api 中防止在接近传感器被覆盖时 iPhone 屏幕变黑。您对传感器唯一能做的就是通过通知中心判断它何时被覆盖,但您无法控制它的自然行为(当它使屏幕变暗/变黑时)。

【讨论】:

有趣的是,Google 和 PeekCalendar 都能够使用该功能并仍然让苹果发布他们的应用程序 - 请参阅 peekcalendar.com【参考方案2】:

Apple 的文档指出,“并非所有 iPhone OS 设备都有接近传感器。”要确定您的应用运行的设备是否支持接近监控,请将proximityMonitoringEnabled 属性设置为YES,然后检查其值:

UIDevice *device = [UIDevice currentDevice];
[device setProximityMonitoringEnabled:YES];

if (device.proximityMonitoringEnabled == YES) 
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(proximityChanged:) 
                                                 name:@"UIDeviceProximityStateDidChangeNotification"
                                               object:device];


- (void) proximityChanged:(NSNotification *)notification 
    UIDevice *device = [notification object];
    NSLog(@"In proximity: %i", device.proximityState);

来源:http://www.whatsoniphone.com/blog/new-in-iphone-30-tutorial-series-part-4-proximity-detection/

将有助于检测传感器的当前状态。

允许屏幕变暗的公共 API:

[UIScreen mainScreen].wantsSoftwareDimming = YES;
[UIScreen mainScreen].brightness = $your_brightness_value;

在这里找到:Change to wantsSoftwareDimming in iOS 6?

【讨论】:

嗨,我现在只能回复。当传感器被覆盖时我可以做点什么,但显示屏仍然关闭! @SimonePistecchia 为什么不更新您的问题,用您尝试过的方法,以便我们可以进一步为您提供更好的帮助。 Simone Pistecchia,编辑了我的答案如何使用公共 API 调暗屏幕。 问题询问如何在保持屏幕开启的同时仍然能够使用接近传感器检测接近度。这个答案导致屏幕仍然关闭。【参考方案3】:

虽然没有公共 API 可以执行此操作,但您可以连接到 IOKitIOHIDEventSystem 并监听屏幕变暗通知:

// Create and open an event system.
IOHIDEventSystemRef system = IOHIDEventSystemCreate(NULL);

// Set the PrimaryUsagePage and PrimaryUsage that the AppleProxShim service uses
int page = 65280;
int usage = 8;

// Create a dictionary to match the service with
CFStringRef keys[2];
CFNumberRef nums[2];
keys[0] = CFStringCreateWithCString(0, "PrimaryUsagePage", 0);
keys[1] = CFStringCreateWithCString(0, "PrimaryUsage", 0);
nums[0] = CFNumberCreate(0, kCFNumberSInt32Type, &page);
nums[1] = CFNumberCreate(0, kCFNumberSInt32Type, &usage);
CFDictionaryRef dict = CFDictionaryCreate(0, (const void**)keys, (const void**)nums, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
// Get the total of matching services with the above criteria
CFArrayRef srvs = (CFArrayRef)IOHIDEventSystemCopyMatchingServices(system, dict, 0, 0, 0, 0);

// Get the service
IOHIDServiceRef serv = (IOHIDServiceRef)CFArrayGetValueAtIndex(srvs, 0);
int interval = 1 ;

// Set an interval of 1 , to activate the sensor  
IOHIDServiceSetProperty((IOHIDServiceRef)serv, CFSTR("ReportInterval"), CFNumberCreate(0, kCFNumberSInt32Type, &interval));

// add your event handler
IOHIDEventSystemOpen(system, handle_event, NULL, NULL, NULL);
int defaultInterval = 0;
IOHIDServiceSetProperty((IOHIDServiceRef)serv, CFSTR("ReportInterval"), CFNumberCreate(0, kCFNumberSInt32Type, &defaultInterval));

// close handles and release the IOHIDEventSystemRef
IOHIDEventSystemClose(system, NULL);
CFRelease(system);

您的事件处理函数指针将如下所示:

void handle_event(void* target, void* refcon, IOHIDServiceRef service, IOHIDEventRef event) 
    if (IOHIDEventGetType(event) == kIOHIDEventTypeProximity)  // Proximity Event Received
        // not necessary, but if you want the value from the sensor, get it from IOHIDEventGetIntegerValue
        int proximityValue = IOHIDEventGetIntegerValue(event, (IOHIDEventField)kIOHIDEventFieldProximityDetectionMask); // Get the value of the ProximityChanged Field (0 or 64)

        // Call dimScreen with the boolean NO
        int (*SBSSpringBoardServerPort)() = (int (*)())dlsym(RTLD_DEFAULT, "SBSSpringBoardServerPort");
        int port = SBSSpringBoardServerPort(); 
        void (*_SBDimScreen)(int _port,BOOL shouldDim) = (void (*)(int _port,BOOL shouldDim))dlsym(RTLD_DEFAULT, "SBDimScreen");

        // This is where the logic to dim the screen based on the sensor value would go.  In this case, I'm hardcoding NO instead of the value of proximityValue from above
        // BOOL dim = proximityValue == 0 ? NO : YES;
        _SBDimScreen(port, NO); 
    

甚至可能不需要调用_SBDimScreen,因为函数指针为空可能会停止所有接近传感器事件。

从 iPhoneDevWiki 上 AppleProxShim 页面上的命令行工具示例修改的代码。

【讨论】:

感谢您的精彩回答!希望在某些时候不使用IOKit 也能实现。 感谢@DanielStorm,祝你好运!如果这曾经通过公共 API 公开,将会更新。 如何使用 swift 应用程序实现这样的 C++ 代码? @JAL 有没有关于在非 Objective-C 应用程序中实现私有 API 使用的好教程? 如果你使用这种方法,你的应用会被App Store拒绝吗?【参考方案4】:

使用以下 API 启用/禁用接近传感器。

[UIDevice currentDevice].proximityMonitoringEnabled = NO; // Disables the Proximity Sensor and won't turnoff the display when sensor covered

[UIDevice currentDevice].proximityMonitoringEnabled = YES; // Enables the Proximity Sensor and will turnoff the display when sensor covered

并非所有 iOS 设备都有接近传感器。要确定接近监控是否可用,请尝试启用它。如果proximityMonitoringEnabled 属性的值仍然为NO,则接近监控不可用。

【讨论】:

我已经用 iPhone 6 和 iOS 9.2.1 测试过。【参考方案5】:

快速/iOS 10/xcode 8.2

UIDevice.current.isProximityMonitoringEnabled = true/false..

【讨论】:

以上是关于dialog延迟显示,被activity覆盖不显示的主要内容,如果未能解决你的问题,请参考以下文章

SWT-File-Save-dialog:如何显示覆盖确认

android将activity设置成自定义的Dialog怎么调整大小

android中service显示dialog

android怎样防止当前应用activity被其它应用覆盖

从后台线程调用 startActivity 并且主线程被阻塞时,Activity 延迟启动

CSS图像覆盖延迟显示:无显示:块[重复]