【问题标题】:Having application running above other app让应用程序在其他应用程序之上运行
【发布时间】:2012-05-03 06:18:19
【问题描述】:

我想做一个可以在任何应用程序上方打开的活动。

通常,即使将活动设置为对话框,当您切换到我的应用程序时,您会看到我的应用程序,并在后台看到启动器:

但是,我希望该应用程序能够超越任何这样的应用程序:(用 photoshop 制作):

我确实看到了这个问题Creating a system overlay window (always on top),但在 ICS 中,布局没有功能。 此外,我想在我的应用程序中提供一个对话框而不最小化其他应用程序...

【问题讨论】:

  • 您找到解决方案了吗?如果是,请帮助我。

标签: java android android-activity dialog multitasking


【解决方案1】:

有很多应用程序会在所有内容之上显示浮动视图,例如:airbrowser、LilyPad、Stick it、AirTerm、Smart Taskbar、aircalc ...

无论如何,为了实现这个功能,你必须有一个名为“android.permission.SYSTEM_ALERT_WINDOW”的特殊权限,并使用类似的东西:

final WindowManager.LayoutParams param=new WindowManager.LayoutParams();
param.flags=WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
final View view=findViewById(R.id.my_floating_view);
final ViewGroup parent=(ViewGroup)view.getParent();
if(parent!=null)
  parent.removeView(view);
param.format=PixelFormat.RGBA_8888;
param.type=WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
param.gravity=Gravity.TOP|Gravity.LEFT;
param.width=parent!=null?LayoutParams.WRAP_CONTENT:view.getLayoutParams().width;
param.height=parent!=null?LayoutParams.WRAP_CONTENT:view.getLayoutParams().height;
final WindowManager wmgr=(WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
wmgr.addView(view,param);
// TODO handle overlapping title bar and/or action bar
// TODO you must add logic to remove the view
// TODO you must use a special permission to use this method :android.permission.SYSTEM_ALERT_WINDOW
// TODO if you wish to let the view stay when leaving the app, make sure you have a foreground service running.

【讨论】:

  • 而且,即使在 ICS 中,视图也能正常工作吗?
  • 确定。我什至在大约一个月前测试过它。并不是说它已被弃用或任何东西。一定要处理好我写过的特殊情况。请注意,我写的一些东西是可选的(比如“param.format”部分,它使背景透明)。随意和他们一起玩。关于模糊的效果,我不熟悉,但你肯定可以搜索如何做到这一点。
  • 我只有一个问题。我想创建一个浮动的EditText,但是当你点击它时,它不显示键盘...
  • 这很有趣。如果你解决了这个问题,也请写下来。我有一个解决方法:点击 editText 后,启动一个不可见的活动,让您编辑 editText。我认为它应该工作。
  • 我想到了更好的主意,当 EditText 获得焦点时显示键盘,它确实有效,但输入的文本未显示在 EditText 中...
【解决方案2】:

我是 Tooleap SDK 的开发人员之一,我们也处理过这个问题。 基本上,您不需要使用SYSTEM_ALERT_WINDOW 在另一个活动之上显示活动。您可以只显示具有透明背景的常规“缩小”活动。

要制作一个“缩小的Activity,改变Activity窗口布局的高度和宽度参数:

WindowManager.LayoutParams params = getWindow().getAttributes(); 
params.x = ...;
params.y = ...;
params.width = ...;
params.height = ...;

this.getWindow().setAttributes(params);

要将透明背景添加到清单文件中的活动定义中:

android:theme="@android:style/Theme.Translucent"

这样,您可以创建浮动活动的错觉:

请注意,只有前台活动会恢复,而后台活动会暂停。但对于大多数应用来说,这应该不是问题。

现在剩下的就是何时启动浮动活动。

以下是使用常规活动的“浮动”计算器应用示例。请注意,计算器下方的活动属于另一个应用程序。

【讨论】:

  • 但这意味着您所做的只是将一个活动放在另一个应用程序的活动之上,因此如果您单击后退按钮,它将影响您的活动,而不是后面的活动。为了做出真正浮动的东西,不处理后面应该处理的东西,这种方法行不通……
  • 这完全取决于您想要实现的用户体验。如果您想显示一个不会干扰其下方活动的小型浮动按钮,那么是的,这不是一个好的解决方案。但是,如果您想显示一个用户在继续工作之前需要注意的小屏幕(类似于对话框),那么一个小活动可能是一个不错的解决方案。
  • hmmmm ... 现在我已经重新阅读了这个问题,目前还不清楚所需的行为到底是什么。所以你是对的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 2022-11-10
  • 1970-01-01
相关资源
最近更新 更多