서비스에서 안드로이드 시작 활동


151

기계적 인조 인간:

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 대신 사용될 수 있습니다.
Sojurn

1
최근 화면 목록에서 해당 활동을 프로그래밍 방식으로 제거하는 방법은 무엇입니까?
Prashanth Debbadwar

2
서비스가 백그라운드에 있으면 작동하지 않습니다. 이것에 대한 어떤 수정?
Rick Royd Aban

4
Firebase (FCM) 서비스를 사용하는 백그라운드 서비스에서 열린 애플리케이션을 도와주세요. 나는 내 앱 그래서에서 내 호출 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와 같습니다. 왜 그렇습니까?
Amir Hossein Ghasemi

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 플래그가 필요합니다. 이것이 정말로 원하는 것입니까?"라는 오류가 표시됩니다.
Cerin

2
setFlags에 대한 두 번째 호출이 첫 번째 호출을 대체하기 때문입니다. 이 솔루션은 addFlags 또는 단일 호출을 사용하여 Intent.FLAG_ACTIVITY_NEW_TASK && Intent.FLAG_ACTIVITY_REORDER_TO_FRONT를 전달하는 플래그를 설정해야합니다.
Fergusmac

8
플래그를 &&;와 결합하고 싶지 않습니다. 사용하고 싶다 | (비트 단위 또는 단일 바)
Jon Watte

의도 의도 = 새로운 의도 (storedActivity, MyActivity.class); intent.setAction (Intent.ACTION_VIEW); intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); storedActivity.startActivity (intent);
Prakhar1001

1

하나는 사용할 수 없습니다 Context의를 Service; (패키지)를 Context모두 얻을 수있었습니다 .

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

나는 이것이 FLAG_ACTIVITY_NEW_TASK플래그 와 함께 작동한다고 생각합니다
Cerlin

0

번갈아,

자신의 Application 클래스를 사용하고 필요한 곳 ​​(특히 비 활동)에서 전화 할 수 있습니다.

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
상황의 정적 인스턴스를 사용하도록주의하십시오. 여러 개의 메모리 누수가 발생할 수 있습니다.
crgarridos

1
@crgarridos 아뇨. 이것은 본질 상 Singleton 인 애플리케이션 컨텍스트이며 메모리 누수를
일으키지

1
context = getApplicationContext();context = this;
GV_FiQst

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.