Serviceの実行状態を監視するテスト


2014年4月23日現在、私が理解している内容です。
間違っている場合があります。


サービスの雛形を用意する

Serviceを利用した、フローティングアプリのテスト」のコードを改造しています。

まず、フローティングのウィンドウ表示部分を削除した、Serviceだけの雛形を作っておきます。
Serviceの名前は「MyServiceS1」とします。



AndroidManifest.xmlの確認

サービスの利用には、AndroidManifest.xmlに、次の記述が必要になります。
アラートウィンドウを利用する設定と、
MyServiceS1をサービスとして使う設定。


<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <service android:name="MyServiceS1"/>



<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.test23" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.test23.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="MyServiceS1"/> </application> </manifest>




サービスを利用したアプリの雛形

起動すると、「OPEN」「CLOSE」「END」の3つのボタンが出ます。
サービスの起動、終了、アプリの終了です。
でも、これだけだと、サービスが起動してるかどうか、わかりませんね。





MyServiceS1.java

package com.example.test23; import android.app.Service; import android.content.Intent; import android.os.IBinder; public class MyServiceS1 extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { return START_STICKY; } @Override public void onCreate() { super.onCreate(); } @Override public void onDestroy() { super.onDestroy(); } @Override public IBinder onBind(Intent arg0) { // TODO 自動生成されたメソッド・スタブ return null; } }


MainActivity.java

package com.example.test23; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import android.app.Activity; import android.content.Intent; import android.graphics.Color; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //-------------------------------------------------- //レイアウトを作る LinearLayout L_layout1 = new LinearLayout(this); L_layout1.setOrientation(LinearLayout.HORIZONTAL); //横に並べる //レイアウトの背景を緑にする L_layout1.setBackgroundColor(Color.argb(128, 0, 255, 0)); //画面にセットする setContentView(L_layout1); //----------------------------------------- //新しいボタンを作る Button button1 = new Button(this); button1.setText("OPEN"); L_layout1.addView(button1); Button button2 = new Button(this); button2.setText("CLOSE"); L_layout1.addView(button2); Button button3 = new Button(this); button3.setText("END"); //ボタンをレイアウトに追加 L_layout1.addView(button3); //----------------------------------------- //OPENボタンが押されたかどうか監視する button1.setOnClickListener( new OnClickListener() { //ボタンが押されたら何かする @Override public void onClick(View v) { //サービスを呼び出す startService(new Intent(MainActivity.this,MyServiceS1.class)); } }); //----------------------------------------- //CLOSEボタンが押されたかどうか監視する button2.setOnClickListener( new OnClickListener() { //ボタンが押されたら何かする @Override public void onClick(View v) { //サービスを終了させる stopService(new Intent(MainActivity.this, MyServiceS1.class)); } }); //----------------------------------------- //ENDボタンが押されたかどうか監視する button3.setOnClickListener( new OnClickListener() { //ボタンが押されたら何かする @Override public void onClick(View v) { //自分を終了させる finish(); } }); //----------------------------------------- } }




サービスの実行状態を監視する

タイマーとかスレッドのテスト」を参考に、リストとタイマーをつけて、
一定時間ごとに、サービスの実行状態を監視する機能をつけてみます。

「OPEN」ボタンを押すと、「MyServiceS1」が、実行中のサービスとしてリストに表示されます。
「CLOSE」でサービスが終了して消えます。





MainActivity.java

package com.example.test23; import java.util.ArrayList; import java.util.List; import java.util.Timer; import java.util.TimerTask; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.View.OnClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.RunningServiceInfo; import android.content.Context; import android.content.Intent; import android.graphics.Color; public class MainActivity extends Activity { private static final String ServiceName1 = MyServiceS1.class.getCanonicalName(); ListView setlistvw ; private Timer mainTimer; private MainTimerTask mainTimerTask; private TextView countText1; private int count1 = 0; private Handler Handler1 = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //-------------------------------------------------- //レイアウトを作る LinearLayout layout1 = new LinearLayout(this); layout1.setOrientation(LinearLayout.HORIZONTAL); //横に並べる //レイアウトの背景を緑にする layout1.setBackgroundColor(Color.argb(128, 0, 255, 0)); //----------------------------------------- //新しいボタンを作る Button button1 = new Button(this); button1.setText("OPEN"); layout1.addView(button1); Button button2 = new Button(this); button2.setText("CLOSE"); layout1.addView(button2); Button button3 = new Button(this); button3.setText("END"); //ボタンをレイアウトに追加 layout1.addView(button3); //----------------------------------------- //OPENボタンが押されたかどうか監視する button1.setOnClickListener( new OnClickListener() { //ボタンが押されたら何かする @Override public void onClick(View v) { //サービスを呼び出す startService(new Intent(MainActivity.this,MyServiceS1.class)); } }); //----------------------------------------- //CLOSEボタンが押されたかどうか監視する button2.setOnClickListener( new OnClickListener() { //ボタンが押されたら何かする @Override public void onClick(View v) { //サービスを終了させる stopService(new Intent(MainActivity.this, MyServiceS1.class)); } }); //----------------------------------------- //ENDボタンが押されたかどうか監視する button3.setOnClickListener( new OnClickListener() { //ボタンが押されたら何かする @Override public void onClick(View v) { //自分を終了させる finish(); } }); //----------------------------------------- //リストビュー setlistvw = new ListView(this); LinearLayout layout2 = new LinearLayout(this); layout2.setOrientation(LinearLayout.VERTICAL); //縦に並べる countText1 = new TextView(this); layout2.addView(countText1); layout2.addView(layout1); layout2.addView(setlistvw); setContentView(layout2); //-------------------------------- //タイマー this.mainTimer = new Timer(); this.mainTimerTask = new MainTimerTask(); this.mainTimer.schedule(mainTimerTask, 0,100); //----------------------------------------- } //「ServiceName1」(MyServiceS1)のサービスが実行されてるかチェックする private boolean CheckServiceRunning() { checkServiceList1(); ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE); for (RunningServiceInfo info : services) { if (ServiceName1.equals(info.service.getClassName())) { return true; } } return false; } @Override protected void onResume() { super.onResume(); CheckServiceRunning(); } public void checkServiceList1(){ ArrayList<String> serviceList = new ArrayList<String>(); ActivityManager activityManager = (ActivityManager)getSystemService(ACTIVITY_SERVICE); // 起動中のサービス情報を取得 List<RunningServiceInfo> runningService = activityManager.getRunningServices(100); if(runningService != null) { for(RunningServiceInfo srvInfo : runningService) { serviceList.add(srvInfo.service.getShortClassName()); } } ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, serviceList); setlistvw.setAdapter(adapter); } public class MainTimerTask extends TimerTask { @Override public void run() { Handler1.post( new Runnable() { public void run() { count1 += 1; countText1.setText(String.valueOf(count1) + " <" + ServiceName1 + "> " + CheckServiceRunning()); } }); } } }











戻る