• ベストアンサー

Android 開発

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

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

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

  • ベストアンサー
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

https://developer.android.com/guide/components/services.html?hl=ja onStartCommandでSTART_STICKYを返すと、サービスの強制終了されても再起動されますが、その際のintentはnullになります。 通常の起動ではintentはnull以外ですから、intentがnullかどうかでログを出しわけるとよいでしょう。 それとも、自作のserviceではなくて、他のだれかが作ったserviceでログを出したいということなのでしょうか?

その他の回答 (1)

回答No.1

Applicationにカウンターを作れば良いでしょう、(Applicationよりも)確実に処理したい場合はファイルで読み書きする方が確実ですが。 ●ApplicationからMyApplicationを継承 public class MyApplication extends Application { static volatile int CntService; @Override public void onCreate( ) { super.onCreate( ); } } ●サービスの呼び出し MyApplication.CntService = 0; // カウンターをリセット Intent intent = new Intent( ); サービスを呼び出し ●「onStartCommand(Intent si, int f, int sid)」の処理 MyApplication.CntService++; if(2<=MyApplication.CntService){ 2回目以降の起動 } Androidのタスクとプロセスの話。/あるいは、「Androidのstatic変数は勝手にクリアされる」という迷信についての話。 http://quesera2.hatenablog.jp/entry/2015/03/02/220115 android の static 変数 が気持ち悪い - android ファッション通信 Σ(^A^;) https://android.benigumo.com/20140223/android-%E3%81%AE-static-%E5%A4%89%E6%95%B0-%E3%81%8C%E6%B0%97%E6%8C%81%E3%81%A1%E6%82%AA%E3%81%84/ APPLICATIONクラスを継承して、データの共有をする。 https://techbooster.org/android/application/2353/ ↑マニフェストにも記述が必要です。

関連するQ&A

  • 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
  • Activityクラスの取得方法

    AndroidStudioでBroadcastReceiverクラス内でActivityクラスを取得したいのですが、どうすれば取得できますでしょうか? BroadcastReceiverクラス内で Intent update_service = new Intent(context , UpdateService.class); startService(update_service);と入力するとstartServiceの部分が赤字になってしまうのですが private Activity activity;とし ....activity.startServiceなどとしても変数が灰色で困っています。 AndroidStudioでBroadcastReceiverクラス内でActivityクラスを取得したいのですが、どうすれば取得できるか教えてください。

    • ベストアンサー
    • Java
  • Android-bindServiceのルール

    AndroidのServiceは通常、startServiceで起動して、stopServiceで停止しますが、 bindServiceとunbindServiceを使用した場合、この2つの代わりになるものなのでしょうか? あるいは、bindServiceで接続を確立したとしても、startServiceの実行は必要なのですか?

  • 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()もコードを記述してみましたが上手くいきません。 どなたかお詳しい方、ご教授よろしくお願いいたします。

  • androidのintentの使い方

    // //問題:LISTを押すと、エラーが出る、Intentの問題ですか? // public class FirstActivity extends Activity { // onCreateメソッド(画面初期表示イベントハンドラ) private static final String TAG ="[HelloWorld]"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);// スーパークラスのonCreateメソッド呼び出し setContentView(R.layout.firstlayout);// レイアウト設定ファイルの指定 ListView listview = (ListView) findViewById(R.id.fruitlist); // ListViewオブジェクト取得 listview.setOnItemClickListener(new ListItemClickListener()); // ListViewオブジェクトにクリックリスナーを関連付け } // アイテムクリックリスナー定義 class ListItemClickListener implements OnItemClickListener { public void onItemClick(AdapterView<?> parent, View view, int position, long id) {// onItemClickメソッド(値選択時イベントハンドラ) ListView listview = (ListView) parent; // ListViewオブジェクト取得 String item = (String) listview.getItemAtPosition(position);// 選択された値取得 Log.d(item, TAG); Intent intent = new Intent(FirstActivity.this,SecondActivity.class);// インテントの生成(呼び出すクラスの指定) startActivity(intent);// 次のアクティビティの起動 } } } -------------------------------------------------------------------------- public class SecondActivity extends Activity { // onCreateメソッド(画面初期表示イベントハンドラ) @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // スーパークラスのonCreateメソッド呼び出し setContentView(R.layout.main);// レイアウト設定ファイルの指定 } }

    • ベストアンサー
    • Java
  • Android-Login後にGPS取得する

    Androidのアプリを開発しています。 起動時にログイン処理を行い、それが成功したらGPSを定期的に取得するサービスの起動を行いたいと思っていますが、上手くいきません。 1.ログイン中は「ログイン中です」、完了したら「ログイン完了」と表示したいのですが   onCreateのは画面の表示前なので、これらの処理をするとしたらonCreateで、   ログインの処理を行うThreadを起動する。という考え方であってますでしょうか? 2.またログインをThreadで起動したとして、それが成功したらGps取得を行う処理実行。     という流れを考えていますが、定期的なGps取得のサービスはonCreateで実行しています。   そのため、「Loginが成功したら、Gps取得サービスを開始」という事ができません。   どのような作りにすれば、できますでしょうか?

    • ベストアンサー
    • Java
  • マルチスレッド内のループについて

    こんにちは。 開発環境は VC++6.0 SDI マルチスレッドがあり、2つの処理を行う関数が書かれています。 このスレッドはダイアログボックスに配置したストップボタンを押すとフラグFALSEになりループを終了させます。 2つの関数は、int型の整数を引数にして、処理を行います。 整数はある値に達すると 0 になり永遠にループを続け、2つの処理を行います。 と言う意味合いでプログラムを書きました。(書いたつもりです) (1)この書き方ですと、for内のループが動いている時に、右上の×ボタンでダイアログを閉じると [Debug Assertion Failed!]と言う警告文が出て強制的に終了してしまいます。 ストップボタンを押してもcount=10になるまではループしています。(当然ですが・・。) そもそもマルチスレッドの中にこのような形でfor文を入れるのは間違っているのでしょうか? どのような書き方にすれば良いのでしょうか? よろしくお願い致します。 bool m_flags;//スレッド内の処理を続けるか示すフラグ UINT CabcDlg::thread(LPVOID pParam)// { CabcDlg *pInst = (CabcDlg *) pParam; while(pInst->m_flags){//ストップボタンが押されると終了する。 for (int count = 0; count<10; count++ ) { pInst->OnSend(count); //処理A pInst->OnReceive(count);//処理B } } return 0; }

  • Android アクティビティ間の受け渡しについて

    現在、あるアクティビティで作成したSocketクラスを継承したオブジェクトを 別のアクティビティに受け渡そうとしています。 このとき受け取った先のアクティビティで ソケットの接続状態が変わってしまい、困っています。 原因がわかるかたおりましたら教えてください。よろしくお願いします。 ---- 手順 1.Serializableを実装したSocket継承クラス(Socket2)を作成  (Socketオブジェクトをアクティビティに渡すために必要)   class Socket2 extends Socket implements Serializable 2.アクティビティAでホストXXXとの接続を確立 Socket2 socket = new Socket2(); Socket2.connect(XXX); ★ここでsocketの属性IsConnectedを見るとTrueになっています 3.インテント作成 Intent intent = new Intent(context, ActivityB.class); 4.パラメータ設定 intent.putExtra("SOCKET", socket); 5.アクティビティBを起動 StartActivity(intent); ; 6.アクティビティBのOnCreate()でパラメータを取得 Bundle extras = getIntent().getExtras(); if(extras != null){    socket = (Socket2)extras.getSerializable("SOCKET"); } ★ここでsocketの属性IsConnectedを見るとFalseになっています 変数socket自体はnullではないので何か値は渡ってきてはいるのですが 接続が切れているため、たとえば socket.getInputStream()等をすると例外(IOException)が飛んできます。 またSocket2クラスに文字列の属性を追加した場合には、 その値は正しく渡せているようです。 Serializableを実装すればオブジェクトもアクティビティに渡せるということなので その通りにやったつもりなのですが・・・。 なぜこうなってしまうのか原因がわかりません。 よろしくお願いします。

    • ベストアンサー
    • Java
  • AndroidのBitmapのロードについて

    はじめまして 今OPENGLESで文字の描画を行っているのですが、何度も読み込んで解放してを繰り返していると なぜかアプリが警告なしで 強制終了します。 バイト数を抑えると一応ロードは可能なのですが、これでは文字を動的に表示できなくてこまっています。 以下がロードする文字列です public void textload(String[] str,int x,int y, int size){ // Log.v("デバッグ","ロード開始"); GL10 gl = glGraphics.getGL(); int[] textureIds = new int[1]; gl.glGenTextures(1, textureIds, 0); textureId = textureIds[0]; /** * 空のビットマップを作成し、そこへ文字を書き込むことでGL上に描画を行う。 */ //ビットマップの数値を計算 Log.v("デバッグ","ビットマップロード"); bitmap = Bitmap.createBitmap(640,480, Config.ARGB_4444); canvas = new Canvas(bitmap); Paint paint = new Paint(); Log.v("デバッグ","完了"); paint.setColor(Color.WHITE); paint.setStyle(Style.FILL); paint.setTextSize(size); canvas.drawColor(0); for(int i=0;i<str.length;i++){ if(str[i] != null){ canvas.drawText(str[i], x, y + size*(i+1), paint); } } width = bitmap.getWidth(); height = bitmap.getHeight(); gl.glEnable(GL10.GL_TEXTURE_2D); Log.v("デバッグ","ビットマップをtexImage2Dに"); // ! テクスチャ情報の設定 gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST); //setFilters(GL10.GL_NEAREST, GL10.GL_NEAREST); GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); Log.v("デバッグ","完了"); // ! bitmapを破棄 Log.v("デバッグ","解放処理開始"); if(bitmap !=null){ bitmap.recycle(); bitmap = null; } Log.v("デバッグ","解放処理完了"); //Log.v("デバッグ","ロード完了"); } かなり困っています・・・ どなたかご教授お願いします・・・

    • ベストアンサー
    • Java
  • VBS サブルーチン化

    いつもお世話になっております。 WindowsXP環境にある下記のようなVBSがあります。 コード------------------------------------------------------------------ '********変数強制宣言******** Option Explicit '********フォルダ変数宣言************ Dim LOG_DIR '********ファイル変数宣言************ Dim LOG_FILE , LOG_FILENAME LOG_DIR = "D:\LOG" LOG_FILE = "CHECK_LOG.txt" LOG_FILENAME = LOG_DIR & "\" & LOG_FILE '********オブジェクト変数定義******** Dim FSO , LOG Set FSO = WScript.CreateObject("Scripting.FileSystemObject") Set LOG = FSO.OpenTextFile(LOG_FILENAME, 2, True) '********時間変数宣言******** Dim YYYY , MM1 , DD , HHMMSS , HH , MM2 , SS '********処理開始時間******** YYYY = Year(Date) MM1 = MONTH(Date) DD = DAY(Date) HH = Right("0" & Hour(Time), 2) MM2 = Right("0" & Minute(Time), 2) SS = Right("0" & Second(Time), 2) LOG.WriteLine("★★★************** 処理日 = " & YYYY & "/" & MM1 & "/" & DD & " 処理開始時間= " & HH & ":" & MM2 & ":" & SS & " ***************★★★") LOG.WriteBlankLines(1) 処理1(省略) '********処理終了時間******** YYYY = Year(Date) MM1 = MONTH(Date) DD = DAY(Date) HH = Right("0" & Hour(Time), 2) MM2 = Right("0" & Minute(Time), 2) SS = Right("0" & Second(Time), 2) LOG.WriteLine("★★★************** 処理日 = " & YYYY & "/" & MM1 & "/" & DD & " 処理終了時間= " & HH & ":" & MM2 & ":" & SS & " ***************★★★") LOG.WriteBlankLines(1) コード------------------------------------------------------------------ 上記VBSは処理1(省略)の前後に開始時間と終了時間をログに出力しています。 ただ、開始と終了時間を取得するのにログ出力直前に現在の【YYYY , MM1 , DD , HHMMSS , HH , MM2 , SS】を取得して ログを出力するのでコードが増えてしまい、スッキリしません。 もっとシンプルに、現在の時間・時刻等をVBSサブルーチンとかで(出来れば同じVBS内に)随時取得したいのですが なかなかコードが書けません。バッチファイルでは無く、VBSだけで実現したいです。 ご存知の方がいれば、ご教授願いませんでしょうか? 何卒、宜しくお願い致します。

専門家に質問してみよう