android rozpoczyna aktywność od usługi


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));
    }
}

Uruchomiłem tę usługę z Activity

W Activityrazie rozpoczęcia spełnia warunek

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

z mojego LocationServicewyżej wymienionego nie udało się uruchomić Activity, jak mogę uzyskać kontekst aktualnego działania Activityw klasie usług?

Odpowiedzi:


344

Z poziomu klasy Service:

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

17
Potrzebna jest tylko FLAG_ACTIVITY_NEW_TASK, ponieważ tylko działania mogą rozpoczynać działania bez niego. „this” może być używane zamiast getBaseContext i getApplication, ponieważ usługa ma swój własny kontekst.
Sojurn

1
Jak programowo usunąć tę aktywność z listy ostatnich ekranów?
Prashanth Debbadwar

2
Nie działa, jeśli usługa działa w tle. Jakieś rozwiązanie tego problemu?
Rick Royd Aban,

4
Proszę o pomoc w otwieraniu aplikacji z usługi działającej w tle Używam usługi Firebase (FCM). Chcę otworzyć ekran mojego interfejsu połączeń z mojej aplikacji, więc pomóż mi w tym
Dipanki Jadav

2
Napisałem twój kod w mojej usłudze, gdy aplikacja działa w tle i widzę, że usługa działała na xiaomi mi a2, ale nie działa na xiaomi redmi note 7, czy możesz mi pomóc, dlaczego działa jedno urządzenie, a drugie nie?
Amjad Omari

18

Miałem ten sam problem i chcę Ci powiedzieć, że żadna z powyższych nie działała dla mnie. U mnie zadziałało:

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

aw jednej z moich podklas, zapisanych w osobnym pliku, musiałem:

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

Wszystkie inne odpowiedzi dały mi nullpointerexception.


5
przechowujesz Usługę w polu statycznym, co może prowadzić do wycieku pamięci
Murmel

1
startActivity jest tym samym this.startActivity! tworzysz bezużyteczną instancję ze swojej usługi z równym normalnym startActivity, dlaczego?
Amir Hossein Ghasemi

8

Kolejna rzecz warta wspomnienia: podczas gdy powyższa odpowiedź działa dobrze, gdy nasze zadanie jest w tle, jedyny sposób, w jaki mógłbym to zrobić, gdyby nasze zadanie (złożone z usługi + niektóre czynności) znajdowało się na pierwszym planie (tj. Jedna z naszych działań była widoczna do użytkownika) wyglądało tak:

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

Nie wiem, czy ACTION_VIEW lub FLAG_ACTIVITY_NEW_TASK są tutaj rzeczywiste. Kluczem do sukcesu był

storedActivity.startActivity(intent);

i oczywiście FLAG_ACTIVITY_REORDER_TO_FRONT za brak ponownego tworzenia instancji działania. Powodzenia!


1
To nie działa. Wszystko to powoduje błąd „Wywołanie startActivity () spoza kontekstu działania wymaga flagi FLAG_ACTIVITY_NEW_TASK. Czy naprawdę tego chcesz?”
Cerin,

2
Dzieje się tak, ponieważ drugie wywołanie setFlags przesłania pierwsze. To rozwiązanie powinno używać addFlags lub pojedynczego wywołania do ustawiania flag, które przechodzą przez Intent.FLAG_ACTIVITY_NEW_TASK && Intent.FLAG_ACTIVITY_REORDER_TO_FRONT.
Fergusmac

8
Nie chcesz łączyć flag z &&; chcesz użyć | (pojedynczy takt dla bitowego lub)
Jon Watte

Zamiar zamiaru = nowy zamiar (storageActivity, MyActivity.class); intent.setAction (Intent.ACTION_VIEW); intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); storageActivity.startActivity (intent);
Prakhar1001

1

nie można używać Contextz Service; był w stanie uzyskać Contextpodobny pakiet :

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

Myślę, że działa to tylko z FLAG_ACTIVITY_NEW_TASKflagą
Cerlin

0

Na przemian,

Możesz używać własnej klasy Application i dzwonić z dowolnego miejsca (szczególnie bez aktywności).

public class App extends Application {

    protected static Context context = null;

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

    public static Context getContext() {
        return context;
    }

}

I zarejestruj swoją klasę aplikacji:

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

Wtedy zadzwoń :

App.getContext();

2
Dbaj o używanie statycznej instancji kontekstu, może to doprowadzić do kilku wycieków
pamięci

1
@crgarridos Nope. To jest kontekst aplikacji, który z natury jest Singletonem i nie doprowadzi do wycieków pamięci
GV_FiQst

1
context = getApplicationContext();context = this;
Zmieniłbym

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.