●常駐するサービスの永続化

startServiceで常駐サービスとして起動した後に、起動元のアプリを終了させると
端末によりますが、一度サービスが終了してからOSの気分次第で再びサービスが立ち上がります。

public class test_service extends android.app.Service
{
    android.os.Vibrator vi;
    @Override
    public android.os.IBinder onBind(android.content.Intent intent)
    {
        return new test_binder(this);
    }

    @Override
    public void onCreate(){
        //サービスが作成され初期化された時に一度だけ動く部分
        vi=(android.os.Vibrator)getSystemService(VIBRATOR_SERVICE);
        vi.vibrate(1000);//1000msバイブレーションを鳴らす
        new Thread(new Runnable(){
            @Override
            public void run() {
                while(true) {
                    try {
                        Thread.sleep(1000);
                    } catch (Exception e) {}
                    vi.vibrate(50);//50msバイブレーションを鳴らす
                }
            }
        }).start();
    }

    @Override
    public int onStartCommand(android.content.Intent intent, int flags, int startId) {
        //startServiceでサービスを起動させた場合に毎度動く部分
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        //サービスが破棄される時の後始末
    }
}
このような起動時に1秒間バイブレーションが鳴り、その後、断続的にバイブレーションが鳴るサービスを作成して、ActivityからstartServiceで起動させると、 起動直後に1秒間バイブレーションが鳴りますが、端末にもよりますがActivityを終了した時点などでOSの気分次第で再び再起動したり終了したりするのが確認できます。
また、バインドを併用しているとOSの挙動も変化しますし、サービス内の変数や処理が毎回リセットされてしまい一貫した処理ができません。

そこで、サービス自体にユーザーインターフェースを取り付けて画面への表示を行わせる事により、
OSの気分次第で終了させられたり、再起動させられたりしないようにします。

public class test_service extends android.app.Service
{
    android.os.Vibrator vi;
    @Override
    public android.os.IBinder onBind(android.content.Intent intent)
    {
        return new test_binder(this);
    }

    @Override
    public void onCreate(){
        //サービスが作成され初期化された時に一度だけ動く部分
        vi=(android.os.Vibrator)getSystemService(VIBRATOR_SERVICE);
        vi.vibrate(1000);
        new Thread(new Runnable(){
            @Override
            public void run() {
                while(true) {
                    try {
                        Thread.sleep(1000);
                    } catch (Exception e) {}
                    vi.vibrate(50);
                }
            }
        }).start();

        android.support.v4.app.NotificationCompat.Builder builder = new android.support.v4.app.NotificationCompat.Builder(getApplicationContext());
        builder.setSmallIcon(R.mipmap.ic_launcher);
        builder.setContentTitle("aaaaaaaa");
        builder.setContentText("bbbbbbbb");
        builder.setSubText("cccccccc");

        ((android.app.NotificationManager) getSystemService(NOTIFICATION_SERVICE)).notify(1, builder.build());
        startForeground(1, builder.build());
    }

    @Override
    public int onStartCommand(android.content.Intent intent, int flags, int startId) {
        //startServiceでサービスを起動させた場合に毎度動く部分
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        //サービスが破棄される時の後始末
    }
}
赤文字部分により、ステータスバーにメッセージを表示させることにより、画面とサービスが結び付けられて、 OSの気分次第で挙動が変わる事が無くなり、永続的な一貫した処理ができます。


▲トップページ > android