web-dev-qa-db-ja.com

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で、条件がstartを満たす場合

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

上記のLocationServiceからActivityを起動できませんでしたが、サービスクラスで現在実行中のActivityのコンテキストを取得するにはどうすればよいですか?

130
d-man

Serviceクラス内から:

Intent dialogIntent = new Intent(this, MyActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);
314
d-man

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

 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を与えました。

17
Andy

言及する価値のある別のこと:上記の答えは、タスクがバックグラウンドにある場合はうまく機能しますが、タスク(サービスで構成されたアクティビティ)がフォアグラウンド(つまり、アクティビティの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。幸運を祈ります!

8
kellogs

ContextServiceは使用できません。 (パッケージ)Contextを同様に取得できました:

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

あるいは、

独自の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();
0
james