андроїд запустити діяльність зі служби


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

Я запустив цю послугу з Activity

У тому Activityвипадку, якщо стан задовольняє старт

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

З мого LocationServiceзгаданого вище не вдалося запустити Activity, як я можу отримати контекст поточного запуску Activityв класі обслуговування?

Відповіді:


344

Зсередини клас обслуговування:

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

17
Потрібен лише FLAG_ACTIVITY_NEW_TASK, оскільки тільки діяльність може розпочинати діяльність без цього. "це" може використовуватися замість getBaseContext і getApplication, оскільки служба має свій контекст.
Соджурн

1
Як програмно видалити цю діяльність зі списку останніх екранів?
Prashanth Debbadwar

2
Не працює, якщо послуга знаходиться у фоновому режимі. Будь-яке виправлення для цього?
Рік Ройд Абан

4
Будь ласка, допоможіть мені для відкритої програми із фонового сервісу. У мене є сервіс Firebase (FCM). Я хочу відкрити екран «Мій інтерфейс для викликів» у своєму додатку. Тому, будь ласка, допоможіть мені в цьому
Dipanki Jadav

2
Я маю написати ваш код у моїй службі, коли програма перебуває у фоновому режимі, і я бачу, що служба працювала на xiaomi mi a2, але не працює на xiaomi redmi note 7, чи можете ви допомогти моєму, чому він працює на одному пристрої, а один - ні?
Амджад Омарі

18

У мене була така ж проблема, і хочу повідомити вам, що жодне з перерахованого вище не працювало на мене. Що для мене працювало:

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

і в одному моєму підкласі, що зберігається в окремому файлі, я повинен був:

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

Усі інші відповіді дали мені nullpointerexception.


5
ви зберігаєте Службу в статичному полі, що може призвести до витоку пам'яті
Murmel

1
startActivity - це те саме. startActivity! ви створюєте марний екземпляр зі свого сервісу, рівний звичайному стартуАктивність, чому?
Амір Хоссейн Гасемі

8

Ще одна річ, яку варто згадати: хоча відповідь вище працює просто чудово, коли наше завдання стоїть на задньому плані, єдиний спосіб я міг би змусити його працювати, якби наше завдання (зроблене сервісом + деякими заходами) було на першому плані (тобто видно одну з наших заходів користувачеві) було так:

    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 чи FLAG_ACTIVITY_NEW_TASK фактично користуються тут. Запорукою успіху було

storedActivity.startActivity(intent);

і звичайно FLAG_ACTIVITY_REORDER_TO_FRONT за те, що знову не активізувати активність. Удачі!


1
Це не працює. Все це дає мені помилку "Для виклику startActivity () поза контекстом діяльності потрібен прапор FLAG_ACTIVITY_NEW_TASK. Це дійсно те, що ви хочете?"
Серін

2
Це тому, що другий виклик setFlags переосмислює перший. Це рішення повинно використовувати AddFlags або один виклик для встановлення прапорів, які передають Intent.FLAG_ACTIVITY_NEW_TASK && Intent.FLAG_ACTIVITY_REORDER_TO_FRONT.
Fergusmac

8
Ви не хочете комбінувати прапори з &&; ви хочете використовувати | (одиночна смужка для долота або)
Джон Ватт

Намір наміру = новий Намір (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 (наміри);
Prakhar1001

1

один не може використовувати Contextз Service; вдалося отримати (пакет) Contextоднаково:

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

Я думаю, що це працює лише з FLAG_ACTIVITY_NEW_TASKпрапором
Cerlin

0

По черзі,

Ви можете використовувати свій власний клас програми та телефонувати звідти, де вам потрібно (особливо недіяльності).

public class App extends Application {

    protected static Context context = null;

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

    public static Context getContext() {
        return context;
    }

}

І зареєструйте свій клас заявок:

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

Потім зателефонуйте:

App.getContext();

2
Подбайте про використання статичного екземпляра контексту, це може призвести до протікання
пам’яті

1
@crgarridos Nope. Це контекст програми, який за своєю природою є одиночним, і це не призведе до витоку пам'яті
GV_FiQst

1
Я змінив би рядок context = getApplicationContext();наcontext = this;
GV_FiQst

-1

Якщо вам потрібно нагадати про діяльність, що знаходиться на bacgrounde, зі свого сервісу, я пропоную наступне посилання. Намір.FLAG_ACTIVITY_NEW_TASK не є рішенням.

https://stackoverflow.com/a/8759867/1127429

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.