ServiceからActivity。
タイトルはわかりやすくっていうのはあるんですけど、これ以上シンプルに書けないので、これで勘弁してください。
要は、Service(もしくは、それに類する手段)からActivityを起動するにはどうしたらいいかという話なのですが、実に簡単そうで、それでいて、なかなか面倒(らしい)。
質問的にはこういう話でした。
「アクティビティAを起動後、設定が終わるとサービスBを起動する。サービスBは一定時間経過したらアクティビティCを起動する。アクティビティCが動作を終了したら、またアクティビティAを起動する」
アクティビティCの動作が終わったあとにどうするかは、その都度変更できるようにしておけばいいと思います。
やりたいことはわかりました。ソースもらったら、ちょっとそれは…違うかもなーという実装方法。
サービスはただ起動されただけで、別途ループがあり、この中でウェイトをかけて終わったらIntentを投げるというもの。
終わったときにIntentをうけるのはメインアクティビティであり、ここから違うアクティビティを起動していましたが、実際にはこういうのはやめたほうがいいんじゃないのかとドキュメントには記載があります。(5.レスポンスのための設計)
Intentで起動するというのはいいと思うんですが、Receiver内部からやるのはちょっとってことで、もうちょっと根本的な部分から見直すことに。
サービスの内部に待ち時間→終わったらなんかするというのを付けることにしました。
アクティビティCの動作が終わったあとにどうするかはは、サービスの起動のときにextraの中にパラメータを入れてしまえば、いちいち他のパラメータを用意しなくてもよくなるし、見通しもいいでしょう。
そんなわけで、できたonStartがこんな感じ。
@Override
public void onStart(Intent intent,int startId){
super.onStart(intent, startId);
// Toast toast = Toast.makeText(getApplicationContext(), "onStart()", Toast.LENGTH_SHORT );
// toast.show();
long lWait = intent.getLongExtra("WAITTIME", 6000);
Runnable lRun = new Runnable() {
public void run() {
Intent userintent = new Intent(getApplicationContext(), testpage.class);
getApplication().startActivity(userintent);
}
};
mHandler.postDelayed(lRun, lWait);
}
これ、コンパイル通るけど実行すると例外投げて終わっちゃいます。正しくは次のようになります。
@Override
public void onStart(Intent intent,int startId){
super.onStart(intent, startId);
// Toast toast = Toast.makeText(getApplicationContext(), "onStart()", Toast.LENGTH_SHORT );
// toast.show();
long lWait = intent.getLongExtra("WAITTIME", 6000);
Runnable lRun = new Runnable() {
public void run() {
Intent userintent = new Intent(getApplicationContext(), testpage.class);
userintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplication().startActivity(userintent);
}
};
mHandler.postDelayed(lRun, lWait);
}
どこが違うかというと、FLAG_ACTIVITY_NEW_TASKの部分。アクティビティとタスクの項にもあるとおり、呼び出し側のアクティビティにつなげて起動するか、それともまったく新しいアクティビティとして起動するかの違いということになるんですが、当初の目的とすると「元のアクティビティAに帰る」ということになるんだろうから、このままでいいんだろうか、本当になんてことを考えたのですが、動いたからOKらしいので、その先は検証していません。
まだまだいろいろ覚えることがありそうです。こまった。