今ちょっと実験的にアプリ作ってみようかなと思って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); } } };
以上です。
俺もグサっときました、、
検索結果から拝見させたいただき、私のやりたいことに近いですので、参考にさせて頂いております。が、うまくいきません。。。。アドバイス等をいただけますか?
やりたいことは、ボタン押下時にDownloadManagerでファイルをダウンロードなのですが、ダウンロード通知を完了してダウンロード開始ボタンのテキスト内容を変更したいです。(「ダウンロード開始」→「ダウンロード済み」)
Receiverでダウンロード完了通知をうけとるところまではできたのですが、Receiverから呼び出し先のボタンが表示されているActivityへの通知方法がわかりませんn。。。
何かアドバイスをいただけましたら、幸いです。