9

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

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

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

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

4

2 回答 2

23

有很多应用程序在所有内容之上显示浮动视图,例如: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.
于 2012-04-22T11:00:56.823 回答
10

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

要制作“缩小的活动,请更改活动窗口布局的高度和宽度参数:

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

this.getWindow().setAttributes(params);

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

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

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

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

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

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

Tooleap 计算器截图

于 2014-05-08T10:04:18.717 回答