サービスの雛形を用意する
「Serviceを利用した、フローティングアプリのテスト」のコードを改造しています。
まず、フローティングのウィンドウ表示部分を削除した、Serviceだけの雛形を作っておきます。
Serviceの名前は「MyServiceS1」とします。
AndroidManifest.xmlの確認
サービスの利用には、AndroidManifest.xmlに、次の記述が必要になります。
アラートウィンドウを利用する設定と、
MyServiceS1をサービスとして使う設定。
サービスを利用したアプリの雛形
起動すると、「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 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 serviceList = new ArrayList();
ActivityManager activityManager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
// 起動中のサービス情報を取得
List runningService = activityManager.getRunningServices(100);
if(runningService != null) {
for(RunningServiceInfo srvInfo : runningService) {
serviceList.add(srvInfo.service.getShortClassName());
}
}
ArrayAdapter adapter = new ArrayAdapter(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());
}
});
}
}
}
| |