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.