サービスからのAndroid開始アクティビティ


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

Serviceクラス内から:

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 2013

1
プログラムで最近の画面リストからそのアクティビティを削除するにはどうすればよいですか?
Prashanth Debbadwar 2015年

2
サービスがバックグラウンドにある場合は機能しません。これに対する修正はありますか?
リックロイドアバン

4
Firebase(FCM)サービスを使用しているバックグラウンドサービスからアプリケーションを開くために私を助けてください。私のアプリから[通話] UI画面を開きたいので、そのために私を助けてください
Dipanki Jadav

2
アプリがバックグラウンドで動作しているときにサービス内にコードを記述しましたが、サービスがxiaomi mi a2で機能していて、xiaomi redmi注7で機能していないことがわかりました。なぜ、1つのデバイスで機能し、1つのデバイスで機能しないのかを教えてください。
Amjad Omari

18

私も同じ問題を抱えていましたが、上記のどれもうまくいかなかったことをお知らせします。私のために働いたのは:

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

そして、私のサブクラスの1つに、別のファイルに保存しました。

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はthis.startActivityと同じです!サービスから役に立たないインスタンスを作成しますが、通常のstartActivityと等しいのはなぜですか?
Amir Hossein Ghasemi 2017年

8

言及する価値のあるもう1つのこと:上記の答えはタスクがバックグラウンドにある場合は問題なく動作しますが、タスク(サービスで作成された+いくつかのアクティビティで作成された)がフォアグラウンドにある場合(つまり、アクティビティの1つが表示されている場合)ユーザーへ)はこのようでした:

    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
これは動作しません。これは、「Activityコンテキストの外からstartActivity()を呼び出すにはFLAG_ACTIVITY_NEW_TASKフラグが必要です。これが本当に必要なものですか?」というエラーが発生するだけです。
Cerin

2
これは、setFlagsの2番目の呼び出しが最初の呼び出しをオーバーライドするためです。このソリューションでは、addFlagsまたは単一の呼び出しを使用して、Intent.FLAG_ACTIVITY_NEW_TASK && Intent.FLAG_ACTIVITY_REORDER_TO_FRONTを渡すフラグを設定する必要があります。
Fergusmac 2013

8
フラグを&&;と組み合わせたくありません。使いたい| (ビット単位の単一バーまたは)
Jon Watte

Intent intent = new Intent(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

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 '31 / 10/31

1
@crgarridosいいえ。これは本質的にシングルトンであり、メモリリークを
引き起こさ

1
私は、行を変更しますcontext = getApplicationContext();context = this;
GV_FiQst

-1

あなたのサービスから酷使されているアクティビティを再スケーリングする必要がある場合は、次のリンクをお勧めします。Intent.FLAG_ACTIVITY_NEW_TASKはソリューションではありません。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.