Java活用生活

ログイン

オンライン状況

オンラインユーザー1人
ログインユーザー0人
登録ユーザー2人

カウンタ

COUNTER335465

Androidスニペット

Androidスニペット >> 記事詳細
2024/01/28

サービスの起動確認をする。

固定リンク | by:aramaki
裏方で動くサービスが起動しているか確認するため使用していた「ActivityManager#getRunningServices」が非推奨となったため、LocalBroadcastManager
を利用して確認するサンプルを作ってみた。

以下がその実装コードです。MainActivityから、TimerService(ユーザーが、指定した時間(分)このサービスが10秒経過するごとに「〇分〇秒経過しました」とトースト表示する。その時、サービス起動確認ボタンを押下すると、「サービス起動中」とトースト表示する。)サービスをコールする。
------------------------------------------------------------------------------------
1・マニフェストにサービスを登録
<service android:name=".TimerService"></service>

2.strings.xmlに以下を追加
<string name="confirm">何分後に終了しますか</string>
 <string name="minute">分</string>
 <string name="service_start">サービス開始</string>
  <string name="service_check">サービス起動確認</string>

3.サービスクラス TimerService.java

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;
    }
}



22:57