Android автономная прозрачная активность - PullRequest
2 голосов
/ 21 сентября 2011

Основным видом деятельности моего приложения является страница настроек. Это то, что отображается, когда пользователь щелкает значок приложения. У меня также есть сервис, который отправляет уведомления в строке состояния пользователя и может отображать на экране полупрозрачное наложение. Я подписался на этот пост, чтобы создать прозрачную активность, и все это работает.

Проблема в том, что когда бы я ни отображал свою полупрозрачную активность, главное окно приложения (страница настроек) видно за ним. Это означает, что полупрозрачное наложение отображается поверх любого другого запущенного в данный момент приложения.

Как сделать так, чтобы при появлении полупрозрачной активности никакая другая активность из моего приложения не была видна?

Это определение моей основной деятельности в 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 ]

5 голосов
/ 23 сентября 2011

Хотя ответ Profete162 ниже не сработал, он привел меня в правильном направлении.После долгих чтений и экспериментов, я считаю, что правильный ответ - изменить режим запуска основного действия на «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>
0 голосов
/ 21 сентября 2011

"Проблема в том, что когда бы я ни отображал мою полупрозрачную активность, главное окно приложения (страница настроек) видно за ней."

Ваша проблема в том, что у вас естьнастройки активности и, кроме того, TransparentACctivity.Они находятся в «стеке»

Когда вы вызываете свое уведомление, прозрачная активность появляется перед стеком активности (= настройки)

Если вы хотите увидеть, что происходит «за» прозрачной активностью, вы должны избавиться от своего стека следующим образом:

Попробуйте добавить 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...