■サービスの作成

サービスとはバックグラウンドで動作する常駐アプリの事です。
画面を切ったり、起動したアプリを終了させても見えない所で動き続けます。

まずは通常のアプリケーションに対して test_service.java というファイルを追加しました。



あまり変な所にファイルを追加するとややこしい事になります。
そのファイルの中に次の赤文字部分を書き込みます。
ただし、パッケージ名部分は自身のプロジェクトに合わせて書き換えてください。

▼作成したtest_service.javaファイル

package test.myapplication;

public class test_service extends android.app.Service
{

    static boolean flag;//スレッドを停止させるフラグ

    public android.os.IBinder onBind(android.content.Intent intent)
    {
        return null;
    }

    public void onCreate()
    {
        Thread th;
        th=new Thread(new test_thread());
        th.start();
    }

    private class test_thread implements Runnable {
        @Override
        public void run() {
            flag=true;
            android.media.ToneGenerator tg;
            tg = new android.media.ToneGenerator(android.media.AudioManager.STREAM_SYSTEM, android.media.ToneGenerator.MAX_VOLUME);
            while(flag) {
                try {
                    tg.startTone(android.media.ToneGenerator.TONE_SUP_ERROR,50);
                    Thread.sleep(2000);
                } catch (Exception e) {}
            }
        }
    }
}
サービス内でスレッドを立ててループ処理をしています。
変数 flag によりスレッド内のループを停止できるようにしました。


▼AndroidManifest.xml ファイル

次に AndroidManifest.xml ファイルを開いて以下の赤文字部分の行を追加します。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="">
    <application
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
            </intent-filter>
        </activity>

        <service android:name=".test_service"/>

    </application>
</manifest>

これで、2秒ごとに音が鳴るサービスが作成できました。
しかし起動させないと動きません。

▼サービスを起動させるには、プログラム中で次のようにします。

android.content.Intent _intent;
_intent=new android.content.Intent(getApplicationContext(), test_service.class);
getApplicationContext().startService(_intent);

▼サービスを停止させるには次にようにします。

test_service.flag=false;
android.content.Intent _intent;
_intent=new android.content.Intent(getApplicationContext(), test_service.class);
getApplicationContext().stopService(_intent);

1行目でスレッドのループを終了させています。
サービスを停止させるにはまず、サービス内のスレッドを停止させないとエラーが発生するので注意が必要です。
intentはクラスに対して一意のため、起動させたintentでなくても、新たに作成したintentで停止できます。


■電源ONしたらサービスを自動的に起動させる

まずは、 アプリケーションの自動起動 を見て自動起動するアプリケーションを作成してください。
BroadcastReceiverを継承したクラスの中のアプリケーション起動の部分を次のように書き換えます。

package test.myapplication;

public class test extends android.content.BroadcastReceiver {
    public void onReceive(android.content.Context context, android.content.Intent intent) {
        if(intent.getAction().equals(android.content.Intent.ACTION_BOOT_COMPLETED)) {

            android.content.Intent _intent;
            _intent=new android.content.Intent(context, test_service.class);
            context.startService(_intent);

        }
    }
}
このアプリケーションをインストールして一度起動させてからAndroidを再起動させると、サービスが自動的に起動するようになります。


▲トップページ > android