Android独立透明活动

时间:2011-09-20 21:36:50

标签: android android-activity

我的应用程序的主要活动是首选项页面。这是用户单击应用程序图标时显示的内容。我还有一个服务,它发送用户状态栏通知,并可以在屏幕上显示半透明的覆盖。我按照this帖子创建了透明活动,所有这些都有效。

问题在于,无论何时我显示半透明活动,应用程序的主窗口(首选项页面)都会在其后面显示。这意味着,半透明叠加层显示在当前正在运行的任何其他应用程序之上。

如何在半透明活动出现时,我的应用程序中没有其他活动可见?

这是我在AndroidManifest.xml中的主要活动定义:

<activity android:name=".AppPreferences" android:label="@string/app_name">
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>

我还有半透明叠加层,它使用源自Theme.Translucent的自定义主题:

<activity android:name=".AppPopupActivity" android:theme="@style/Theme.SemiTransparent">
  <intent-filter>
        <action android:name="com.app.HIDE_POPUP"></action>
    </intent-filter>
</activity>

以下是半透明叠加层的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">

    <RelativeLayout android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentBottom="true" >

        <Button android:text="@string/button_done"
                android:id="@+id/doneButton"
                android:layout_alignParentRight="true"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">
        </Button>
    </RelativeLayout>
</RelativeLayout>

服务:

<service android:name="AppService">
  <intent-filter>
    <action android:name="com.app.AppService" />
  </intent-filter>
</service>

要显示透明活动,请在服务中运行以下命令:

Intent intent = new Intent(this, AppPopupActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent);

感谢您的帮助

2 个答案:

答案 0 :(得分:5)

虽然Profete162的答案不起作用,但它使我朝着正确的方向发展。经过更多的阅读和实验,我认为正确的答案是将主要活动的launchMode更改为“singleInstance”,如下所示:

<activity android:name=".AppPreferences" android:label="@string/app_name"
          android:launchMode="singleInstance">
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>

答案 1 :(得分:0)

“问题是,无论何时我显示我的半透明活动,应用程序的主窗口(首选项页面)都会在其后面显示。”

您的问题是您拥有自己的设置活动,而且还有透明活动。他们处于“堆叠”状态

当您致电通知时,transparentActivity会出现在活动堆栈(=设置)

之前

如果你想看看透明活动后面发生了什么,你必须像这样摆脱你的堆栈:

尝试添加FLAG_ACTIVITY_CLEAR_TOP:

  

此启动模式也可用于与之配合使用   FLAG_ACTIVITY_NEW_TASK:如果用于启动任务的根活动,   它会将任何当前正在运行的任务实例带到   前景,然后将其清除到其根状态。这是特别的   例如,从通知启动活动时很有用   管理器。

所以启动A的代码是:

Intent intent = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);