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らしいので、その先は検証していません。

まだまだいろいろ覚えることがありそうです。こまった。

広告

About sato_c

小学生の頃にインベーダーゲームやPC-8001やApple][といったものを知ってしまい、それ以降ずーっとゲーム好き。でも、あんまりうまくはありません。 仕事は当初はゲーム関係のプログラムやサウンドをやっていましたが、WEB関係を通ったあと、遊技機関係のプログラムやサウンドをやっています。あまり節操がないのか。 現在はJavaですてきなコードを書けるように勉強中。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。