Android начать деятельность с сервиса


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, поскольку только действия могут начинать действия без него. «this» можно использовать вместо getBaseContext и getApplication, поскольку сервис имеет собственный контекст.
Сожурн

1
Как программно удалить эту активность из недавнего списка экрана?
Прашант Деббадвар

2
Не работает, если сервис находится в фоновом режиме. Любое исправление для этого?
Рик Ройд Абан

4
Пожалуйста, помогите мне открыть приложение из фонового сервиса. Я использую сервис Firebase (FCM). Я хочу открыть экран My Calling UI в Моем приложении. Пожалуйста, помогите мне в этом
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 () вне контекста Activity требуется флаг FLAG_ACTIVITY_NEW_TASK. Это действительно то, что вы хотите?»
Церин

2
Это потому, что второй вызов setFlags переопределяет первый. В этом решении следует использовать addFlags или один вызов для установки флагов, которые передают Intent.FLAG_ACTIVITY_NEW_TASK && Intent.FLAG_ACTIVITY_REORDER_TO_FRONT.
Фергусмак

8
Вы не хотите объединять флаги с &&; вы хотите использовать | (один такт для побитового или)
Джон Уотт

Намерение намерение = новое намерение (сохраненное действие, MyActivity.class); intent.setAction (Intent.ACTION_VIEW); intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); storedActivity.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 Нет. Это контекст приложения, который по своей природе является синглтоном и не приведет к утечкам памяти
GV_FiQst

1
Я бы изменил строку context = getApplicationContext();наcontext = this;
GV_FiQst

-1

Если вам нужно отозвать активность, которая находится в bacgrounde, из вашего сервиса, я предлагаю следующую ссылку. Intent.FLAG_ACTIVITY_NEW_TASK не является решением.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.