hizmetten android başlangıç ​​etkinliği


151

Android:

public class LocationService extends Service {

@Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        startActivity(new Intent(this, activity.class));
    }
}

Bu hizmeti şu kaynaktan başlattım: Activity

In Activitydurum tatmin başlarsak

startService(new Intent(WozzonActivity.this, LocationService.class));

Benim dan LocationServicefırlatma olamazdı yukarıda belirtilen Activity, nasıl şimdiki çalışan bağlamını alabilirsiniz Activityhizmet sınıfında?

Yanıtlar:


344

Hizmet sınıfının içinden:

Intent dialogIntent = new Intent(this, MyActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);

17
Yalnızca FLAG_ACTIVITY_NEW_TASK gereklidir, çünkü yalnızca etkinlikler onsuz etkinlik başlatabilir. 'this', hizmetin kendi içeriği olduğundan getBaseContext ve getApplication yerine kullanılabilir.
— Aralık'ta Sojurn

1
Bu etkinliği son ekran listesinden programatik olarak nasıl kaldırırım?
— Prashanth Debbadwar

2
Hizmet arka plandaysa çalışmaz. Bunun için herhangi bir düzeltme var mı?
— Rick Royd Aban

4
Firebase (FCM) hizmetini kullandığım arka plan hizmetinden açık uygulama için lütfen bana yardım edin. Uygulamamdan Aradığım UI ekranını açmak istiyorum Bu yüzden lütfen bunun için bana yardım et
— Dipanki Jadav

2
Uygulama arka planda olduğunda kodumu hizmetimin içine yazdım ve hizmetin xiaomi mi a2 üzerinde çalıştığını, ancak xiaomi redmi not 7 üzerinde çalışmadığını görüyorum, neden bir cihaz çalıştığına ve biri olmadığına yardımcı olabilir misiniz?
— Amjad Omari

18

Aynı sorunu yaşadım ve yukarıdakilerin hiçbirinin benim için işe yaramadığını bildirmek istiyorum. Benim için işe yarayan şuydu:

 Intent dialogIntent = new Intent(this, myActivity.class);
 dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 this.startActivity(dialogIntent);

ve alt sınıflarımda ayrı bir dosyada sakladım:

public static Service myService;

myService = this;

new SubService(myService);

Intent dialogIntent = new Intent(myService, myActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
myService.startActivity(dialogIntent);

Diğer tüm cevaplar bana bir nullpointerexception.


5
Bellek sızıntısına neden olabilecek statik bir alanda saklıyorsunuz
— Murmel

1
startActivity aynıdır. startActivity! hizmetinizden eşit normal startActivity ile işe yaramaz bir örnek oluşturursunuz, neden?
— Amir Hossein Ghasemi

8

Bahsetmeye değer başka bir şey: yukarıdaki cevap, görevimiz arka planda olduğunda gayet iyi çalışıyor olsa da, görevimiz (hizmet + bazı etkinlikler) ön plandaysa (yani faaliyetlerimizden biri görünürse) çalışmasını sağlayabilmemin tek yolu kullanıcıya) şöyleydi:

    Intent intent = new Intent(storedActivity, MyActivity.class);
    intent.setAction(Intent.ACTION_VIEW);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    storedActivity.startActivity(intent);

ACTION_VIEW veya FLAG_ACTIVITY_NEW_TASK burada herhangi bir gerçek kullanım olup olmadığını bilmiyorum. Başarılı olmanın anahtarı

storedActivity.startActivity(intent);

ve elbette etkinliği tekrar başlatmamak için FLAG_ACTIVITY_REORDER_TO_FRONT. İyi şanslar!


1
Bu çalışmıyor. Tüm bu bana "Aktivite bağlamının dışından startActivity () çağırmak FLAG_ACTIVITY_NEW_TASK bayrağı gerektirir. Bu gerçekten istediğiniz şey mi?" Hatasıdır.
— Cerin

2
Bunun nedeni, ikinci setFlags çağrısının birincisini geçersiz kılmasıdır. Bu çözüm, addFlags veya Intent.FLAG_ACTIVITY_NEW_TASK ve& Intent.FLAG_ACTIVITY_REORDER_TO_FRONT alan bayrakları ayarlamak için tek bir çağrı kullanmalıdır.
— Fergusmac

8
Bayrakları &&; ile birleştirmek istemezsiniz. kullanmak istiyorsun | (bitsel için tek bir çubuk veya)
— Jon Watte

Niyet niyeti = yeni Niyet (storeActivity, MyActivity.class); intent.setAction (Intent.ACTION_VIEW); intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); storedActivity.startActivity (niyet);
— Prakhar1001

1

Bir kullanamaz Contextarasında Service; (paketi) Contextbenzer şekilde elde edebildi :

Intent intent = new Intent(getApplicationContext(), SomeActivity.class);

Bence bu sadece FLAG_ACTIVITY_NEW_TASKbayrakla çalışıyor
— Cerlin

0

Alternatif olarak,

Kendi Uygulama sınıfınızı kullanabilir ve istediğiniz yerden (özellikle etkinlik dışı) arayabilirsiniz.

public class App extends Application {

    protected static Context context = null;

    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
    }

    public static Context getContext() {
        return context;
    }

}

Ve Uygulama sınıfınızı kaydedin:

<application android:name="yourpackage.App" ...

Sonra ara :

App.getContext();

2
Bağlamın statik bir örneğini kullanmaya özen
— gösterin, birkaçının ezber

1
@crgarridos Hayır. Bu, doğası gereği Singleton olan Uygulama bağlamıdır ve bellek sızıntılarına yol
— açmaz

1
Hattı context = getApplicationContext();değiştiririmcontext = this;
— GV_FiQst

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.