禁用隐藏演示文稿(辅助屏幕)

时间:2013-04-22 13:24:23

标签: android service presentation

我正在开展一个项目,该项目应在辅助显示屏上显示一些演示文稿(API 4.2)。直到现在一切正常。但是,如果我关闭应用程序,我无法阻止演示文稿被关闭。我想创建一个正在启动后台服务的应用程序,该服务正在初始化演示文稿。这样用户只需在状态栏中看到通知图标,但服务正在将内容流式传输到辅助显示器。

任何想法,如果这可以实现?我尝试使用backgroundservice,但不知道我应该使用哪种上下文。尝试用

getApplicationContext()

然后我得到一个例外:

Unable to add window -- token null is not for an application

如果我使用像getAppContext()这样的静态方法(我知道这样一个丑陋的黑客)它会显示演示文稿,但如果我关闭应用程序也会隐藏它。

有什么想法吗?

2 个答案:

答案 0 :(得分:7)

创建一个使用Context.createDisplayContext(显示)的服务来获取辅助显示的新窗口管理器 - 这就是演示文稿的工作原理

以此链接为例: http://www.java2s.com/Open-Source/Android/android-core/platform-frameworks-base/com/android/server/LoadAverageService.java.htm

在onCreate()而不是获取WindowManagerImpl:

public void onCreate(){
    ... 
    WindowManagerImpl wm = (WindowManagerImpl)getSystemService(WINDOW_SERVICE);
    wm.addView(mView, params); 
}

调用这样的方法:

private void addView(WindowManager.LayoutParams params){
    DisplayManager dm = (DisplayManager) getApplicationContext().getSystemService(DISPLAY_SERVICE);
    if (dm != null){
        Display dispArray[] = dm.getDisplays(); 

        if (dispArray.length>0){
            Context displayContext = getApplicationContext().createDisplayContext(dispArray[1]);
            WindowManager wm = (WindowManager)displayContext.getSystemService(WINDOW_SERVICE);
            wm.addView(mView, params);
        }
    }
}

您的视图将被添加到辅助显示中,由于此视图由服务运行,因此您在主显示屏上运行的活动不会暂停

答案 1 :(得分:5)

  

如果可以实现这些想法吗?

由于PresentationDialog的子类,因此只有当您将活动托管在前台时,才能看到Presentation


<强>更新

icarmel的答案有效,但缺少一些细节。我现在在my CWAC-Presentation library中有一个PresentationService,它提供了该技术的完整工作实现。要在我对icarmel答案的评论中回答我的问题,请在WindowManager.LayoutParams.TYPE_SYSTEM_ALERT中使用WindowManager.LayoutParams,而SYSTEM_ALERT_WINDOW则需要{{1}}权限(不幸的是)。