Android Serviceの戻り値について

このQ&Aのポイント
  • Androidの開発を行っています。サービスが「強制終了されて再起動した時」という条件で処理を行いたいです。
  • 【START_REDELIVER_INTENT】を使用すればサービスが強制終了されて再起動したというのを感知できるのかなと思ったのですが、実際には再起動時のonStartCommandには強制終了前と同じ内容のIntentが渡されます。
  • また、複数のサービスが定義されている場合でも、戻り値が【START_REDELIVER_INTENT】の場合は混同される可能性があるようです。
回答を見る
  • ベストアンサー

Android Serviceの戻り値

Androidの開発を行っています。 サービスが「強制終了されて再起動した時」という条件で処理を行いたいです。 【START_REDELIVER_INTENT】を使用すればサービスが強制終了されて再起動したというのを感知できるのかなと思ったのですが・・・ http://yuki312.blogspot.jp/2012/07/androidserviceonstartcommand.html には 「システムはサービスを新たにインスタンス化し、サービスの再起動を行います。 再起動時のonStartCommandには、強制終了前と同じ内容のIntentが渡されます。 再起動順序は強制終了前の起動順序と同じです。(A⇒Bで起動した場合、A⇒Bで再起動) また、startServiceによりサービスを複数回起動していた場合は、起動した回数分 onStartCommandが呼ばれます。」 と説明されています。 サービスA、サービスBと2つのサービスが別クラスで定義されていても戻り値が【START_REDELIVER_INTENT】だと混同されてしまということでしょうか?

  • Java
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

>サービスA、サービスBと2つのサービスが別クラスで定義されていても戻り値が【START_REDELIVER_INTENT】だと混同されてしまということでしょうか? サービスが違えばソースが違うので問題ないでしょうが、サービスのソースが同じなら引数を付ければ判定できます。 ●クラスAからの呼び出し時の処理 Intent intent = new Intent( ); // 引数のキー名を"ServiceType"、引数の値が"TypeA"としている。 intent.putExtra("ServiceType", "TypeA"); サービスを呼び出し ●クラスBからの呼び出し時の処理 Intent intent = new Intent( ); // 引数のキー名を"ServiceType"、引数の値が"TypeB"としている。 intent.putExtra("ServiceType", "TypeB"); サービスを呼び出し ●「onStartCommand(Intent si, int f, int sid)」の処理 // 引数のキー名"ServiceType"の引数の値を取得。 String st = si.getStringExtra("ServiceType"); // 「getStringExtra」は文字列用です if("TypeA".equals(st)){ "TypeA"の処理 }else if("TypeB".equals(st)){ "TypeB"の処理 }

uki878
質問者

お礼

細かくありがとうございます!

関連するQ&A

  • Android 開発

    startservice()で開始されたserviceのonStartCommand(Intent intent, int flags, int startId)のintent部分の値を取得するにはどうすればいいでしょうか? 実現したいことは、強制終了などでServiceが再起動するときにログを出したいです。 通常の起動時にはログはいらないので再起動のときにログをだす処理を教えてください。

    • ベストアンサー
    • Java
  • Android アプリ

    同アプリのソースファイルで定義したViewを呼び出して表示後、そのViewを消すということがしたいです。 詳細は 【画面A】が起動したときに常駐する【画面Z】を起動 → 【画面A】から【画面B】に遷移した際に常駐している【画面Z】を停止(削除) という動作を完成したいので 常駐アプリを【画面A】のOnCreate()で Intent intent = new Intent(getApplication(), OverlapService.class); // 常駐Serviceの開始 startService(intent); として起動させていて 画面BのOnPause()に Intent intent = new Intent(getApplication(), OverlapService.class); // 常駐Serviceの停止 stopService(intent); としていますが画面Zは残ったままになります。 画面BのOnStop()もコードを記述してみましたが上手くいきません。 どなたかお詳しい方、ご教授よろしくお願いいたします。

  • .NETアプリケーションの戻り値

    .NET(C#)のコンソールアプリケーションを起動し、動作中にタスクマネージャから強制終了したときの戻り値について教えてください。 以下のサイト http://blogs.timberlandchapel.com/blogs/timberlandchapel/archive/2006/06/28/838.aspx には、強制終了時の戻り値は「-1073741510」とありました。 ところが実際にサンプルPGを作ってやってみたところ、戻り値は「1」となります。 PG的には単純にMainの中でSleepの1行だけしか書いておらず、 Sleep中にタスクマネージャからプロセスを終了しています。 サンプルPGの呼出は.batのファイルからです。 (1)事実として「1」が戻ってきているのですが、それが正しいのでしょうか? 正しいとして、何かドキュメントなど情報はありますでしょうか? (2)強制終了時に「-1073741510」を返すようにすることは可能でしょうか? ■環境 Windows Server 2003(x86) / Windows 7(x86) .NET 3.5 SP1

  • プログラム終了時の戻り値

    現在、VBとJAVAのファイル連携で簡単なテストプログラムを組んでいます。自分は、VB側を担当しています。 内容は、VBの実行ファイルにパラメータをくっつけて起動し、そのパラメータを終了時に戻り値として返そうとしています。 パラメータを引数に起動するのは、Command()関数で行えることが分かったのですが、VB側が終了時にパラメータを返すことはできるのでしょうか? 起動時 aaa.exe A 戻り値   A よろしくお願いします。

  • 想定外の戻り値に付いて

    Linux系OSのシェルスクリプトについて質問です。 スクリプトの内容としては各主要サービスの起動と停止を行う内容になります。 ここでお伺いしたい内容はスクリプトの途中でサービスが起動しているかどうか、grepの戻り値によって処理を変更する場合にgrepの戻り値がどうにもおかしい場合、どのような原因が考えられるか、ということです。 【スクリプト内容(抜粋)】 #!/bin/bash ---中略--- echo "Apache2起動前確認" | tee -a ${LOG} ps -ef | grep apache2 | grep -v "grep" > /dev/null if [ $? == 0 ]; then ---省略--- 上記の内容はapache2を起動する際、apache2が起動していれば処理を中止する内容の一部ですが、当然起動していればpsコマンドで内容が出るのでgrepの戻り値は0になり、「then」の内容が実施されます。 これはこれで完成されているので問題なく稼動します。 しかしこれとまったく同じ内容で、apache2をmysqlに変更したものが問題でこちらが正常に動作しないのです。 【スクリプト内容(抜粋)】 #!/bin/bash ---中略--- echo "MySQL起動前確認" | tee -a ${LOG} ps -ef | grep mysql | grep -v "grep" > /dev/null if [ $? == 0 ]; then ---省略--- これだとなぜか停止しているときに戻り値が「0」、起動しているときに戻り値が「1」になってしまいます。 ifとpsの間に「echo $?」をかませてみても想定外の戻り値がセットされているためif文そのものには間違いはありません。 また、コマンドラインで「ps -ef | grep mysql | grep -v "grep" > /dev/null ; echo $?」を 実施しても戻り値は「1」に(停止している場合)なるのですが、スクリプト上では戻り値「0」がセットされるようです。 何ゆえこのような意図しない動作をするのか考えてもわかりません。 apache2の場合だと正常に動くだけになおわかりません。 因みに停止しているとき、起動しているときでまったく逆の戻り値がそれぞれ返ってきているようです。 どなたか原因がわかる人は教えてください、宜しくお願いいたします。

  • Androidで画面遷移ができません.

    初心者ながら,Android向けにアプリを開発しています. ページXXXXXでボタンを表示させ,ページYYYYYで画像が表示されるようにしたいのですが,ページXXXXXで表示されたボタンを押すとエラーが出て強制終了となってしまいます. 画面遷移されるページ(YYYYY)には,適当な位置にタッチさせるとタッチした位置に移動する画像についてプログラミングしてあります.ページYYYYYは個別で実行すると正常に起動します. どこに原因があるのか教えてください.よろしくお願いします. ページXXXXXのソースは以下のとおりです. 【ソース】 import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.content.Intent; public class XXXXX extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button b1 = (Button) findViewById(R.id.button1); b1.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { Intent intent = new Intent(XXXXX.this, YYYYY.class); startActivity(intent); } }); } }

    • ベストアンサー
    • Java
  • [android]ショートカットからのIntent

    [android]ショートカットからBroadcastReceiverにIntentを送ることはできますか? このページを参考にAndroidのデスクトップにショートカットを作る処理を作成しました。(これはできました) http://kamoland.com/wiki/wiki.cgi?HOME%A4%CB%A5%B7%A5%E7%A1%BC%A5%C8%A5%AB%A5%C3%A5%C8%A4%F2%BA%EE%C0%AE%A4%B9%A4%EB ショートカットのサンプルは探してみましたが、Activityを起動する例はあるのですが BroadcastReceiverに送るものは見つかりませんでした。 自分でもsetClassName()の部分をBroadcastReceiverのものに変更してやってみたのですが 通知されませんでした。 IntentなのでBroadcastReceiverへ送るものができそうな気がするのですが、Activityに限定されるのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 実行結果を戻り値で取得したい

    MS-DOSバッチの実行結果を文字列で取得したいです。 イメージ例としては、下記のようなバッチ2つがあり、 バッチAを起動します。そうすると実行結果の戻り値として 「TEST」という文字列が取得できたら良いです。  ※下記例では「ERRORLEVEL」に入っているようなイメージです。 しかしながら、ERRORLELVEに格納できるのは数値のみの為、 エラーになってしまいます。 どうすれば、実行結果を戻り値で取得できるでしょうか? お手数ですが、MS-DOSで不可能な場合、VBScriptやWSHでも かまいませんので、処理をキックしてその戻り値を文字列で取得する方法を お教えください。お願いいたします。 -------------------------------- 例 【バッチA】 call バッチB echo %ERRORLEVEL% 【バッチB】 exit /b "TEST" -------------------------------- と実行し

  • アンドロイド 最後の画面から始めたい。

    アンドロイドでスマホアプリを作ってます。 1つのアプリ内にAとBの2つの画面があります。 最初はAの画面から始まります。 AとBの画面は画面内のボタンを押す事などで、相互に移動できます。 移動は、intentというのを使ってます。移動元の画面はfinishで終了してます。 今、アプリを終了した時にAの画面で終わったら、再開時Aの画面から Bの画面で終わったら再開時Bの画面から始まるようにしようとしてます。 考えてた方法としては、終了(pause)する時に、 SharedPreferencesなどを使ってどの画面で終了したかをキーとして保存し 再開(resume)する時にその画面に移動するという方法ですが、 ボタンでの画面移動の時もresumeが呼ばれるため、上手くいかないことに気づきました。 再開時に終了した画面から始めるにはどのようにするのが良い方法なのでしょうか。 まだかなり初心者です。よろしくお願いします。

  • サービスパック3

    サービスパック3をインストールしたのですが、途中で固まってしまって、強制終了をしたのですが、パソコンが起動はするんですが、ずっと左上に_が点滅したまま動きません。どうしたらよいでしょうか。

専門家に質問してみよう