裏方で動くサービスが起動しているか確認するため使用していた「ActivityManager#getRunningServices」が非推奨となったため、LocalBroadcastManager
以下がその実装コードです。MainActivityから、TimerService(ユーザーが、指定した時間(分)このサービスが10秒経過するごとに「〇分〇秒経過しました」とトースト表示する。その時、サービス起動確認ボタンを押下すると、「サービス起動中」とトースト表示する。)サービスをコールする。
------------------------------------------------------------------------------------
public class TimerService extends Service {
/** タイマー */
private Timer mTimer=null;
/** 経過時間 */
private int countTime;
/** 終了時間 */
private int stopTime;
/** サービスへブロードキャストするためのマネージャー */
public static LocalBroadcastManager localBroadcastManager=null;
/** レシーバー */
private BroadcastReceiver broadcastReceiver=null;
private static Context self;
/** 経過時刻表示ハンドラー */
// myLooperは、現在のスレッドに関連付けられている Looper オブジェクトを返します
private Handler handler=new Handler(Looper.myLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
Toast.makeText(TimerService.this, (String)msg.obj, Toast.LENGTH_SHORT).show();
}
};
/** タイマータスクを生成する */
private TimerTask task=new TimerTask() {
@Override
public void run() {
// 10秒ごとにカウントアップ
countTime+=10;
if(countTime/60==stopTime){
// サービス終了
stopSelf();
}else{
// 時間経過を表示するハンドリング設定
// handlerにメッセージ送信
handler.sendMessage(Message.obtain(handler,0,countTime/60+"分"+countTime % 60 +"秒経過しました!"));
}
}
};
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Toast.makeText(this, "サービスを初期起動します", Toast.LENGTH_SHORT).show();
//タイマーと経過時間初期化
mTimer=new Timer();
localBroadcastManager=LocalBroadcastManager.getInstance(getApplicationContext());
self=getApplicationContext();
countTime=0;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// super.onStartCommand(intent, flags, startId);
// --------------------------
// サービス開始
Toast.makeText(this,"サービスを開始します",Toast.LENGTH_SHORT).show();
// タイマーを設定する。
//第1パラメータのタスクを起動後1秒後、10秒間隔で実行
mTimer.schedule(task,1000,10000);
// 終了時間を呼び出し元発行のIntentから取得する。
Bundle bundle=intent.getExtras();
stopTime=Integer.parseInt(bundle.getString("STOPTIME"));
// レシーバーを生成する
if(broadcastReceiver==null){
broadcastReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(self,"ブロードキャスト受信しました",Toast.LENGTH_SHORT).show();
}
};
}
// 受信対象サービスを判別するフィルターを生成する。
final IntentFilter filter=new IntentFilter();
filter.addAction("MESSAGE_SEND");
localBroadcastManager.registerReceiver(broadcastReceiver,filter);
return Service.START_STICKY;
}
@Override
public void onDestroy() {
// サービス通信用のレシーバー解除
localBroadcastManager.unregisterReceiver(broadcastReceiver);
super.onDestroy();
//Toast表示
Toast.makeText(this, "サービスを終了します", Toast.LENGTH_SHORT).show();
// Timer設定解除
mTimer.cancel();;
mTimer.purge(); // タスクキューから不要なタスクを削除したい
}
public static Boolean isActiveService(){
boolean result=false;
if(localBroadcastManager==null){
return result;
}
Intent intent=new Intent();
intent.setAction("MESSAGE_SEND");
result=localBroadcastManager.sendBroadcast(intent);
String isActive=null;
if(result==true){
isActive="サービスは起動中です。";
}else if(result==false){
isActive="サービスは停止中です。";
}
// Toastの表示レイヤーは通常のアプリより優先度が高いため、サービスから、直接表示する。
Toast.makeText(self,isActive,Toast.LENGTH_SHORT).show();
return result;
}
}
4.サービスを起動するActivity MainActivity.java
public class MainActivity extends AppCompatActivity {
private Context self;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
self=this;
//開始ボタンにクリックリスナー
Button startButton=findViewById(R.id.startButton);
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// サービス終了時間をサービスに渡すインテントを生成する。
Intent intent=new Intent(self,TimerService.class);
// 画面に入力した終了時間をIntentに設定する。
EditText stopCount=findViewById(R.id.stopcount);
intent.putExtra("STOPTIME",stopCount.getText().toString());
startService(intent);
}
});
Button isActiveButton=findViewById(R.id.checkButton);
isActiveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
TimerService.isActiveService();
}
});
}
}
時間を「分」で指定し、「サービス開始」ボタンを先に押してサービスを起動する。その後、「サービス起動確認」
ボタンを押下すると、下のように「サービスは起動中です。」とトースト表示する。
続きを隠す<<