Ana Aktivite olmadan Android uygulamasını başlatın ve uygulamayı başlatırken Hizmeti başlatın


91

Başvurumda aşağıdaki senaryo var. Uygulamamda UI yok; bunun yerine açılışta başlayan ve sürekli olarak çalışan bir Hizmet vardır.

Manifest dosyamı ana Etkinlik olmadan nasıl yapılandırabilirim? Uygulamamı herhangi bir Aktivite olmadan başlatabilir miyim? Ve uygulamamı başlatırken, Hizmetim başlamalı. Mümkün mü?

Hizmeti başlatmak için yarı saydam bir Faaliyet yapmak istemiyorum.


Yanıtlar:


125

Yarı saydam bir Etkinlik kullanmak istemediğinizi söylediniz, ancak bunu yapmanın en iyi yolu bu gibi görünüyor:

  1. Manifest'inizde Aktivite temasını olarak ayarlayın Theme.Translucent.NoTitleBar.
  2. Aktiviteniz için bir düzen ile uğraşmayın ve aramayın setContentView().
  3. Faaliyetlerinizde onCreate(), Hizmetinizi ile başlatın startService().
  4. finish()Hizmete başladıktan sonra Aktiviteden çıkın .

Başka bir deyişle, Aktivitenizin görünür olması gerekmez; Hizmetinizin çalıştığından emin olabilir ve sonra istediğiniz gibi ses çıkarabilir.

Kullanıcıya Hizmeti başlattığınızı veya halihazırda çalışmakta olduğunu gösteren en azından bir Toast bildirimi göstermenizi şiddetle tavsiye ederim . Bastığınızda hiçbir şey yapmıyor gibi görünen bir başlatıcı simgesine sahip olmak çok kötü bir kullanıcı deneyimi.


2
uygulamamı başlattıktan sonra boş ekran veriyor. bu durum böyle değil ...
Meher

1
@meher Test ettim ve benim için mükemmel çalıştı - Hizmetim başladı ve bir anlığına bile herhangi bir Etkinlik görmedim. Lütfen Aktivitenizin onCreate () içeriğini gönderin, biz de neyin yanlış olduğunu bulabiliriz.
Darshan Rivka Whittle

Uygulamamı ilk kez kurduğumda, bir saniye içinde başlatılan ve kaybolan aktiviteyi görebiliyorum.
Meher

public class TestActivity, Aktiviteyi genişletir {/ ** Aktivite ilk oluşturulduğunda çağrılır. * / @Override public void onCreate (Bundle SavedInstanceState) {super.onCreate (SavedInstanceState); Log.i ("etkinlik", "hizmet başlatma"); startService (new Intent (TestActivity.this, MyService.class)); bitiş(); }}
Meher

1
Bunun eski bir soru olduğunun farkındayım, ancak artık işlev görmüyor. Ana etkinlik temasını Theme.Translucent.NoTitleBar veya Theme.Translucent.NoTitleBar.FullScreen olarak değiştirmek, etkinlik ekranını her zaman "uygulama yanıt vermeyi durdurdu" iletisine neden olan bir ekranda kısaca gösteren, aksi halde çalışan bir uygulamaya neden olur.
alzee

33

Evet, bunu sadece Uygulamanız önyüklendiğinde sizi BroadcastReceiverçağıran bir çağrı oluşturarak yapabilirsiniz Service. İşte benim tarafımdan verilen tam bir cevap.
Android - Açılışta hizmeti başlat

Sizin için herhangi bir simge / başlatıcı istemiyorsanız, bunu da yapabilirsiniz, sadece herhangi bir Aktivite oluşturmayın

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

ServiceNormalde belirtildiği gibi ilan edin .


2
Görünüşe göre soruyu soran Servicekişi açılışta başlatma konusunda sorun değil, ancak ana öğenin nasıl olmayacağını bilmek istiyor Activity, ancak Servicebaşlatıcı simgesine basıldığında yalnızca çalıştığından emin olmak istiyor .
Darshan Rivka Whittle

2
Ancak, basıldığında Hizmetin çalışmasını sağlayan bir başlatıcı simgesi istiyorlar gibi görünüyor. Öneriniz basitçe başlatıcı simgesinden kurtulur.
Darshan Rivka Whittle

@LalitPoptani çözüm iyi. Ama servisim telefonumu açana kadar başlamayacak.
Meher

4
SyncAdapter dışında AndroidMenifest.xml'de MAIN, LAUNCHER olmadan uygulamamı başlatamıyorum. Cevabınız gerçekten doğru mu?
sunghun

1
Eylem ve kategori etiketleriyle amaç filtresini kaldırdım. Artık Uygulama artık android stüdyosunda çalışmıyor
Nauman Ash

12

Etkinlik veya hizmet içermeyen bir Uygulama yapmanın nedeni, başlatılması gerekmeyen bir Ana Ekran Widget uygulaması yapmak olabilir.
Bir projeye başladığınızda herhangi bir aktivite oluşturmayın. Projeyi oluşturduktan sonra sadece çalıştır'a basın. Android stüdyosu diyecek No default activity found. Yapılandırmayı Düzenle'ye

tıklayın ( Çalıştır menüsünden) ve Başlatma seçeneği bölümünde Başlatma değerini Hiçbir Şey olarak ayarlayın . Ardından Tamam'a tıklayın ve Uygulamayı çalıştırın.

( Başlatıcı etkinliği olmadığından, Uygulamalar menüsünde hiçbir uygulama gösterilmez. ).


2
Teşekkürler, bu benim davamdı. Benim yaptığım gibi Yapılandırmayı Düzenle'yi görmüyorsanız , ana menüden Çalıştır> Çalıştır ... öğesini ve ardından Yapılandırmaları Düzenle ... öğesini seçin .
pm_

6

Android Studio Sürüm 2.3

Birkaç kolay adımı izleyerek Ana Etkinlik olmadan bir Hizmet oluşturabilirsiniz. Bu uygulamayı Android Studio aracılığıyla yükleyebilecek ve normal bir uygulama gibi hata ayıklayabileceksiniz.

Öncelikle, Android Studio'da etkinlik olmadan bir proje oluşturun. Ardından Hizmet sınıfınızı oluşturun ve hizmeti AndroidManifest.xml dosyanıza ekleyin

<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>

Şimdi, "Çalıştır" düğmesinin (yeşil ok) yanındaki açılır menüden "yapılandırmaları düzenle" ye gidin ve "Başlatma Seçenekleri" içinde "Hiçbir Şey" i seçin. Bu, Android Studio'nun Ana Aktiviteye sahip olmadığından şikayet etmeden Hizmetinizi yüklemenize olanak tanır.

Bir kez kurulduktan sonra, hizmet ÇALIŞMAYACAKTIR, ancak bu adb kabuğu komutuyla başlatabileceksiniz ...

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

Çalıştığını kontrol edebilir miyim ...

ps | grep whatever

Henüz denemedim, ancak muhtemelen Android Studio'nun da hizmeti otomatik olarak başlatmasını sağlayabilirsiniz. Bu, "Konfigürasyonları Düzenle" menüsünde yapılabilir.


Adb kabuğundan şu hatayı alıyorum: Hizmet başlatılıyor: Intent {cmp = com.example.wolk.myapp / .MyIntentService} Hatası: Bulunamadı; hizmet başlatılmadı. LOGCAT şunu gösterir: ActivityManager: ServiceInfo {274d8af com.example.wolk.myapp.MyIntentService
Trismegistos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.