Запустіть програму Android без основної активності та запустіть службу при запуску програми


90

У моєму додатку є такий сценарій. У моєму додатку немає інтерфейсу користувача; натомість існує Служба, яка запускається при завантаженні та буде постійно працювати.

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

Я не хочу робити напівпрозору Діяльність, щоб запустити Службу.


поглянути на це [питання] [1] [1]: stackoverflow.com/questions/4468006 / ...
Munish Капур

Відповіді:


125

Ви сказали, що не хочете використовувати напівпрозору Діяльність, але це, мабуть, найкращий спосіб зробити це:

  1. У вашому маніфесті встановіть для теми "Діяльність" значення Theme.Translucent.NoTitleBar.
  2. Не турбуйтеся про макет своєї діяльності та не дзвоніть setContentView().
  3. У вашій діяльності х onCreate(), почніть службу з startService().
  4. Вийдіть із Activity, finish()як тільки ви запустили Службу.

Іншими словами, ваша активність не повинна бути видимою; він може просто переконатися, що ваша Служба працює, а потім вийти, що звучить як те, що ви хочете.

Я настійно рекомендую показати принаймні повідомлення Toast, яке вказує користувачеві, що Ви запускаєте Службу або що вона вже запущена. Дуже поганий досвід роботи користувача, якщо значок запуску, який, здається, нічого не робить, коли ви натискаєте його.


2
це дає мені порожній екран після запуску моєї програми. що не повинно бути ...
Мехер,

1
@meher Я щойно випробував його, і він у мене спрацював ідеально - моя служба запустилася, і я не бачив жодної активності, навіть на мить. Будь ласка, опублікуйте вміст своєї діяльності на onCreate (), і ми зможемо з’ясувати, що не так.
Даршан Рівка Уіттл

коли я вперше встановив свою програму, я бачу, як діяльність запустилася та розчарувалась через секунду.
Мехер

відкритий клас TestActivity розширює Activity {/ ** Викликається при першому створенні активності. * / @Override public void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); Log.i ("діяльність", "запуск служби"); startService (новий намір (TestActivity.this, MyService.class)); закінчити (); }}
Мехер

1
Я усвідомлюю, що це давнє запитання, але, схоже, воно більше не функціонує. Зміна основної теми активності на Theme.Translucent.NoTitleBar або Theme.Translucent.NoTitleBar.FullScreen спричиняє роботу програми, яка в іншому випадку на короткий час відображає екран активності на той, який завжди викликає повідомлення "додаток перестав відповідати".
alzee

32

Так, ви можете зробити це, просто створивши файл, BroadcastReceiverякий викликає ваш Serviceпри завантаженні програми. Ось повна відповідь, дана мною.
Android - запустити службу під час завантаження

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

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

Просто задекларуйте свої Serviceяк зазвичай заявлені.


2
Схоже на те, що аскер добре з запуском при Serviceзавантаженні, але хоче знати, як не мати головного Activity, а просто переконатися, що Serviceвін працює, коли натискається піктограма запуску.
Даршан Рівка Уіттл

2
Але схоже, що вони хочуть піктограму панелі запуску, яка при натисканні гарантує, що Служба працює. Ваша пропозиція просто позбавляється значка панелі запуску.
Даршан Рівка Уіттл

@LalitPoptani рішення прекрасне. Але моя служба не розпочнеться, поки я не завантажу телефон.
Мехер

4
Я не можу запустити свій додаток без ОСНОВНОГО, ЗАПУСКУ в AndroidMenifest.xml, окрім SyncAdapter. Ваша відповідь справді правдива?
sunghun

1
Я видалив фільтр намірів із тегами дії та категорії. Зараз додаток більше не працює в андроїд-студії
Nauman Ash

11

Причиною створення програми без будь-якої активності чи послуги може бути створення програми віджету на робочому столі, яку не потрібно запускати.
Після запуску проекту не створюйте жодних дій. Після створення проекту просто натисніть "Запустити". Скаже студія Android No default activity found.

Клацніть « Редагувати конфігурацію» (з меню « Виконати ») і в частині параметра « Запуск» встановіть для параметра « Запуск» значення « Нічого» . Потім натисніть кнопку ОК та запустіть програму.

( Оскільки немає запуску, жодна програма не відображатиметься в меню Додатки. ).


Дякую, це була саме моя справа. У разі , якщо ви не бачите Змінити конфігурацію , як я, виберіть Run> Run ... з головного меню , а потім виберіть Edit Configurations ... .
pm_

6

Версія Android Studio 2.3

Ви можете створити Службу без Основної Діяльності, виконавши кілька простих кроків. Ви зможете встановити цю програму через Android Studio та налагодити її як звичайну програму.

Спочатку створіть проект в Android Studio без активності. Потім створіть свій клас Служби та додайте послугу до свого AndroidManifest.xml

<application android:allowBackup="true"
    android:label="@string/app_name"
    android:icon="@mipmap/ic_launcher"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <service android:name="com.whatever.myservice.MyService">
        <intent-filter>
            <action android:name="com.whatever.myservice.MyService" />
        </intent-filter>
    </service>
</application>

Тепер, у спадному меню біля кнопки "Виконати" (зелена стрілка), перейдіть до "редагувати конфігурації" і в "Параметри запуску" виберіть "Нічого". Це дозволить вам встановити свою Службу без скарги Android Studio на відсутність Основної діяльності.

Після встановлення служба НЕ працюватиме, але ви зможете запустити її за допомогою цієї команди оболонки adb ...

am startservice -n com.whatever.myservice/.MyService

Можна перевірити, що він працює за допомогою ...

ps | grep whatever

Я ще не пробував, але, швидше за все, Android Studio також автоматично запускає послугу. Це можна було зробити в меню "Редагувати конфігурації".


Я отримую наступну помилку з оболонки adb: Запуск служби: Намір {cmp = com.example.wolk.myapp / .MyIntentService} Помилка: Не знайдено; жодна послуга не розпочалася. LogCat показує: ActivityManager: не дозволяє почати ServiceInfo {274d8af com.example.wolk.myapp.MyIntentService
Трисмегист
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.