我正在开展一个项目,该项目应在辅助显示屏上显示一些演示文稿(API 4.2)。直到现在一切正常。但是,如果我关闭应用程序,我无法阻止演示文稿被关闭。我想创建一个正在启动后台服务的应用程序,该服务正在初始化演示文稿。这样用户只需在状态栏中看到通知图标,但服务正在将内容流式传输到辅助显示器。
任何想法,如果这可以实现?我尝试使用backgroundservice,但不知道我应该使用哪种上下文。尝试用
getApplicationContext()
然后我得到一个例外:
Unable to add window -- token null is not for an application
如果我使用像getAppContext()
这样的静态方法(我知道这样一个丑陋的黑客)它会显示演示文稿,但如果我关闭应用程序也会隐藏它。
有什么想法吗?
答案 0 :(得分:7)
创建一个使用Context.createDisplayContext(显示)的服务来获取辅助显示的新窗口管理器 - 这就是演示文稿的工作原理
在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)
如果可以实现这些想法吗?
由于Presentation
是Dialog
的子类,因此只有当您将活动托管在前台时,才能看到Presentation
。
<强>更新强>
icarmel的答案有效,但缺少一些细节。我现在在my CWAC-Presentation library中有一个PresentationService
,它提供了该技术的完整工作实现。要在我对icarmel答案的评论中回答我的问题,请在WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
中使用WindowManager.LayoutParams
,而SYSTEM_ALERT_WINDOW
则需要{{1}}权限(不幸的是)。