Android: Activity以外からActivityを起動させる

今ちょっと実験的にアプリ作ってみようかなと思って3時間ほど頑張ってみたのですが、どうも需要がなさそうなアプリになりそうなので開発中止かな〜という感じです…。まあその過程で、得られた知識がありましたので、公開しておきます。Activity以外からActivityを呼ぶ方法です。具体的にはRecieverからActivityを起動したり、ServiceからActivityを起動したりする方法になるかと。

Activityから、次の画面用のActivityを呼ぶ場合は startActivity(intent); をすればいいわけですが、今回はアプリの都合上、レシーバからActivityを起動しようとしました。すると、例外で怒られました。

Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

なんか、最後の英語が「一体あんたはなにがしたいの?」みたいな感じがして心にグサッと刺さった(「やりたいことはホントはこれじゃないの?」じゃないかとtwitterで ryosms さんからツッコミががが…英語力のなさを露呈…)のですが、FLAG_ACTIVITY_NEW_TASKというフラグを設定すれば動きそうです。

サンプルを書いておきます。
intentのアクション名は適当に考えたやつです。
普通には存在しないパラメータなのでご注意を。

// サービス内でレシーバを定義
BroadcastReceiver mReceiver = new BroadcastReceiver() {
   	
	@Override
	public void onReceive(Context context, Intent intent) {
		String action = intent.getAction();
		Intent new_intent;
		if (action.equals("jp.cyclemate.Test.LOCK_MONITOR")) {
			new_intent = new Intent(context, NotOperation.class);
			// Activity以外からActivityを呼び出すためのフラグを設定
			new_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
			startActivity(new_intent);
		}
	}
};

以上です。


カテゴリー Android | タグ   | パーマリンク

コメント・トラックバック一覧

  1. かわしん says:

    俺もグサっときました、、

  2. johneysan says:

    検索結果から拝見させたいただき、私のやりたいことに近いですので、参考にさせて頂いております。が、うまくいきません。。。。アドバイス等をいただけますか?

    やりたいことは、ボタン押下時にDownloadManagerでファイルをダウンロードなのですが、ダウンロード通知を完了してダウンロード開始ボタンのテキスト内容を変更したいです。(「ダウンロード開始」→「ダウンロード済み」)
    Receiverでダウンロード完了通知をうけとるところまではできたのですが、Receiverから呼び出し先のボタンが表示されているActivityへの通知方法がわかりませんn。。。

    何かアドバイスをいただけましたら、幸いです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です