Як запустити Activity без UI?


75

Чи можна якось запустити діяльність із основної функції, не маючи користувацького інтерфейсу? тобто чи є спосіб створити свого роду "обгортку" навколо іншої діяльності, тобто, запускаючи основну діяльність, вона автоматично переводить вас до іншої діяльності.

Якщо це неможливо, чи є спосіб видалити основну діяльність зі стеку, щоб натискання кнопки "Назад" не призвело до порожнього інтерфейсу? Ось приклад того, що я намагаюся зробити:

public class WrapperActivity extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:555-1212"));
        startActivity(intent);
    }
}

Відповіді:


33

Вам потрібно додати прапор Наміру,

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Або

виклик " finish();" після розпалу наміру.


6
Я не впевнений, що FLAG_ACTIVITY_CLEAR_TOPфокус тут спрацює, тому Activityщо запуск буде здійснюватися з іншої програми. finish()безумовно, має працювати.
CommonsWare

1
Додано закінчення (); і напівпрозорий.NoTitleBar для прояву. Працює як шарм.
fjmustak

@Vishwanath Intent в основному не підтримує finish (). Ви можете детально дізнатися, де я можу зателефонувати закінчити і як?
user170317

2
Ви викликаєте finish()в кінці методу Activity onCreate(), безпосередньо перед тим, як він повернеться.
intrepidis

128

Android також пропонує тему спеціально для цього:

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

5
Це працює добре, але також призводить до того, що піктограма зникає з панелі програм. Щоб значок з’явився, вам потрібно буде використати відповідь Brian515.
Вивчіть OpenGL ES

1
Я також виявив, що це працює, але якщо я відображаю діалогове вікно прогресу, то за замовчуванням використовується Holo.Dark, який не відповідає стилю решти мого додатка.
Енді Джонсон,

1
@LearnOpenGLES Я використовую цю тему, і я все ще отримую піктограму в панелі програм. Я також вважаю, що це кращий варіант, оскільки він встановлює купу значень NULL, що змушує мене думати, що це більш ефективно. android.googlesource.com/platform/frameworks/base/+/refs/heads/…
givanse

4
Щоб це працювало, ваша діяльність повинна успадковуватися від Activity, а не AppCompactActivity.
Коф

4
@Kof: Ви також можете просто скопіювати вміст Theme.NoDisplay(лише 6 атрибутів) у будь-яке розширення Theme.AppCompat.*, щоб створити власне, Theme.AppCompat.NoDisplayяке працює AppCompatActivity.
МЗ.

53

У своєму маніфесті, коли ви заявляєте про діяльність, використовуйте тему "@android:style/Theme.Translucent.NoTitleBar"

Приклад:

<activity android:name="yourActivityName" android:label="@string/app_name" android:theme="@android:style/Theme.Translucent.NoTitleBar">

3
Це правильна відповідь, якщо вам також потрібен додаток, який з’явиться в панелі програм.
Вивчіть OpenGL ES

3
Це все ще відкриває невидимий інтерфейс, який ви повинні натиснути назад, перш ніж продовжувати користуватися телефоном
Джемшит Іскендеров

11

На той випадок, якщо ви використовуєте Android 6.0+ або Target SDK 23+, наявність теми android:theme = "@android:style/Theme.NoDisplay"призведе до збою з помилкою did not call finish() prior to onResume() completing. Насправді це помилка, визнана розробниками Google тут .

Тому рекомендується використовувати заняття з наступною темою як обхідний шлях.

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


ви можете запустити потік або запустити, або послугу, або що завгодно і зателефонувати закінчити в
onCreate

8

Використовуючи

<activity android:name="yourActivityName" android:label="@string/app_name" android:theme="@android:style/Theme.Translucent.NoTitleBar">

згаданий Брайаном515 чудово працює. Цей метод корисний для створення активності точки входу, яка вирішує, яку активність викликати, запустити, послуги тощо без необхідності показувати користувальницький інтерфейс користувачеві. Не забудьте використовувати finish()після того, як розпочали свій намір.


7

Думаю, це вам дуже допомогло б:

<activity  android:name = "MyActivity" 
          android:label = "@string/app_name" 
          android:theme = "@android:style/Theme.NoDisplay" >

Ласкаво просимо до Stack Overflow! Переповнення стеку зазвичай працює англійською мовою; переконайтесь, що ваш допис є максимально корисним для інших, переклавши його.
Nathan Tuggy,

При використанні цього методу обов’язково зверніть увагу на коментар
arunwithasmile

Куди я це подів?
dan51

4

У своєму маніфесті додайте @android:style/Theme.Translucent.NoTitleBar" як зазначено у деяких відповідях вище.

Також видаліть setContentView(R.layout.your_activity);рядок із файлу Activity.java.


4

я використовую AppCompatActivity і рішення, наведені в цьому SO, не вирішили мою проблему. Ось, що у мене вийшло.

Я додав наступне у своєму styles.xml.

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
</style>

<style name="AppTheme.NoDisplay">
    <item name="android:windowBackground">@null</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowAnimationStyle">@null</item>
    <item name="android:windowDisablePreview">true</item>
    <item name="android:windowNoDisplay">true</item>
</style>

Потім для будь-якої діяльності, яку я хочу відключити, я змінював так:

<activity 
    android:name=".NoDisplayActivity"
    android:theme="@style/AppTheme.NoDisplay">

На здоров’я!


ви маєте на увазі файл androidmanifest.xaml? Я не можу редагувати цей файл
dan51

Це дивно. Хочете опублікувати нове запитання?
user1506104

Я знайшов інший спосіб, але, можливо, пізніше я
задам

2

Виглядає подібно до запитання, яке задається тут: Видалення дії зі стеку історії

Якщо це так, тоді ви можете використовувати:

FLAG_ACTIVITY_NO_HISTORY

Це має спрацювати, щоб знищити дії зі стеку.

Якщо вам потрібно виключити з нещодавніх програм (тривале натискання клавіші додому), ви можете використовувати цей прапор:

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS


Це не має нічого спільного з видаленням дії зі стеку історії.
Джастін

@Justin Я цілком впевнений, що питання має таку частину: "Якщо це неможливо, чи є спосіб видалити основну діяльність зі стеку, щоб натискання кнопки" Назад "не призвело до порожнього інтерфейсу?" Я вважаю, що це досить тісно пов’язано зі стеком історії, але я можу помилитися.
Sreedevi J

Перепрошую ... Я не помітив останніх двох речень у питанні. У будь-якому випадку, я не думаю, що це вирішує проблему. Можливо, я помиляюся, але я не думаю, що жоден з цих прапорів не видалить активність із заднього стеку (наприклад, натискання кнопки "Назад" все одно переведе користувача до порожнього інтерфейсу)
Джастін,

@Justin, ні, це не повертає користувача до порожнього інтерфейсу. Цей прапор або еквівалент маніфесту не додасть дії до стеку, тому повертатися немає до чого.
Sreedevi J

2

Якщо ви не взаємодієте з інтерфейсом користувача, те, що ви намагаєтесь зробити, звучить більше як служба андроїда.


3
У деяких випадках так .... але не у всіх випадках. Здавалося, це траплялося досить часто - досить, щоб інженери фреймворків Android створили певну тему для дій, які не мають інтерфейсу користувача.
Джастін

Якщо я, наприклад, використовую сторонню бібліотеку для вибору шрифтів або кольорів, вона, як правило, розроблена так, щоб вимагати Діяльність, яка запускає її, для реалізації якогось інтерфейсу зворотного виклику. Але, можливо, я запускаю підбірку кольорів із спливаючого вікна. Якщо я хочу інкапсулювати весь потік у коді для мого спливаючого вікна, а не забруднювати інтерфейс моєї основної активності, тоді мені потрібна тимчасова (невидима) активність, яка виступає слухачем для вибору кольору
Стіві

2

Я використовував moveTaskToBack(true)в onResume()поставити весь стек діяльності в фоновому режимі.


1
Мені довелося скористатися цим методом, тому що я хочу, щоб діяльність відображалася кілька разів, але не інший раз.
Ренді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.