Android アプリ開発 「MATRIX」

Androidアプリの開発に役立つサンプル集



サービスの基本的な使い方を知っておこう

基本的なサービスの使い方

今回は「サービス」の基本的な使い方です。「サービス」というのは長時間バックグラウンドで動きインターフェース画面を持たないアプリケーションです。基本的な作り方は意外に簡単で、サービスを継承したクラスを作った後、それを他から呼び出して実行させるだけです。

「サービス」を利用すれば画面を閉じても動き続ける必要がある「タイマー」アプリや「音楽プレイヤー」アプリなどが作れるようになりますね。

サンプルコード①(MainActivity.java

MainActivity クラスの中に「Service」を継承した「TestService」が入っていますが、コード増えると長くなってしまうので、その場合はそれぞれ別々のファイルに分けた方が良いですね。

public class MainActivity extends AppCompatActivity {

private Button button, button2;
private Intent intent;
private static TextView textView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//サービス用のインテントを生成
intent = new Intent(getBaseContext(), TestService.class);
//レイアウトから表示用のテキストビューを取得
textView = (TextView)findViewById(R.id.infom);

//レイアウトからボタンを取得してクリックイベントを設定
button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startService(intent);
}
});

//レイアウトからボタン2を取得してクリックイベントを設定
button2 = (Button)findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
stopService(intent);
}
});
}

@Override
protected void onDestroy() {
super.onDestroy();
// アプリを終了したらサービス停止
stopService(intent);
}

//サービス本体
public static class TestService extends Service {

// サービスが作られると呼び出される
@Override
public void onCreate() {
super.onCreate();
}

// サービスが停止すると呼び出される
@Override
public void onDestroy() {
super.onDestroy();
// 画面に「サービス停止中」と表示
textView.setText("サービス停止中");
}

// バインドされると呼び出される(※内容がなくても省略不可能)
@Override
public IBinder onBind(Intent intent) {
// バインドしていないので内容はなし
return null;
}

// サービスが開始されると呼び出される
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 画面に「サービス実行中」と表示
textView.setText("サービス実行中");
// 強制終了したら再起動させる戻り値
return START_REDELIVER_INTENT;
}
}
}

サンプルコード②(AndroidManifest.xml

「サービス」を継承したクラスを作ったら必ずマニフェストファイルにその存在を登録する必要があります。※下の方にある赤文字の行を追加します。

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<service android:name=".MainActivity$TestService" />
</application>

サンプルコード③(activity_main.xml

特に複雑なものではありません。サービスの状態を表示するテキストビューと、サービスの起動と停止をする2つのボタンがあるだけのシンプルな構造です。

<TextView
android:id="@+id/infom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="7dp"
android:text="サービス停止中"
android:textSize="30sp"
app:layout_constraintBottom_toTopOf="@+id/button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />

<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="START"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="STOP"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button" />

実行結果

実行すると「サービス停止中」というテキスト表示と「START」と「STOP」というラベルのボタンが画面上に表示されます。

f:id:vw-dsg:20181019000238g:plain

「START」ボタンを押してサービスを起動すると「サービス停止中」という表示が「サービス実行中」という表示に変わります。

f:id:vw-dsg:20181019000303g:plain

開発者ツールで実行中のサービスを確認すると今回作った「Service Test」というアプリの名前が実行中のサービスリストの中にありました。

f:id:vw-dsg:20181019000319g:plain

「STOP」ボタンを押したりサンプルアプリを終了すると・・・実行中のサービス一覧からサンプルアプリ「Service Test」が削除されました。

f:id:vw-dsg:20181019000333g:plain

その他・備考

この方法の他にバインドしてサービスを動かす方法がありますが、少しだけ複雑になりますのでまた次の機会にサンプルを作って説明したいと思います。 

END