Android-サービス
A serviceはバックグラウンドで実行され、ユーザーと対話することなく長時間実行される操作を実行するコンポーネントであり、アプリケーションが破棄された場合でも機能します。サービスは基本的に2つの状態を取ることができます-
シニア番号 | 状態と説明 |
---|---|
1 |
Started サービスは startedアクティビティなどのアプリケーションコンポーネントがstartService()を呼び出して開始する場合。開始されると、サービスを開始したコンポーネントが破棄された場合でも、サービスはバックグラウンドで無期限に実行できます。 |
2 |
Bound サービスは boundアプリケーションコンポーネントがbindService()を呼び出してそれにバインドするとき。バインドされたサービスは、コンポーネントがサービスと対話し、要求を送信し、結果を取得し、プロセス間通信(IPC)を使用してプロセス間で実行できるようにするクライアントサーバーインターフェイスを提供します。 |
サービスには、サービスの状態の変化を監視するために実装できるライフサイクルコールバックメソッドがあり、適切な段階で作業を実行できます。左側の次の図は、サービスがstartService()で作成されたときのライフサイクルを示し、右側の図は、サービスがbindService()で作成されたときのライフサイクルを示しています:(画像提供:android.com)
サービスを作成するには、Service基本クラスまたはその既存のサブクラスの1つを拡張するJavaクラスを作成します。ザ・Service基本クラスはさまざまなコールバックメソッドを定義し、最も重要なものを以下に示します。すべてのコールバックメソッドを実装する必要はありません。ただし、それぞれを理解し、アプリがユーザーの期待どおりに動作するように実装することが重要です。
シニア番号 | コールバックと説明 |
---|---|
1 | onStartCommand() システムは、アクティビティなどの別のコンポーネントがstartService()を呼び出してサービスの開始を要求すると、このメソッドを呼び出します。このメソッドを実装する場合、stopSelf()またはstopService()メソッドを呼び出して、作業が完了したときにサービスを停止するのはユーザーの責任です。 |
2 |
onBind() 別のコンポーネントがbindService()を呼び出してサービスにバインドする場合、システムはこのメソッドを呼び出します。このメソッドを実装する場合は、IBinderオブジェクトを返すことにより、クライアントがサービスとの通信に使用するインターフェイスを提供する必要があります。常にこのメソッドを実装する必要がありますが、バインディングを許可したくない場合は、nullを返す必要があります。 |
3 |
onUnbind() すべてのクライアントがサービスによって公開された特定のインターフェースから切断されたときに、システムはこのメソッドを呼び出します。 |
4 |
onRebind() システムは、新しいクライアントがサービスに接続したときに、onUnbind(Intent)ですべてが切断されたことが事前に通知された後、このメソッドを呼び出します。 |
5 |
onCreate() onStartCommand()またはonBind()を使用してサービスが最初に作成されるときに、システムはこのメソッドを呼び出します。この呼び出しは、1回限りのセットアップを実行するために必要です。 |
6 |
onDestroy() サービスが使用されなくなり、破棄されると、システムはこのメソッドを呼び出します。サービスはこれを実装して、スレッド、登録済みリスナー、レシーバーなどのリソースをクリーンアップする必要があります。 |
次のスケルトンサービスは、各ライフサイクルメソッドを示しています-
package com.tutorialspoint;
import android.app.Service;
import android.os.IBinder;
import android.content.Intent;
import android.os.Bundle;
public class HelloService extends Service {
/** indicates how to behave if the service is killed */
int mStartMode;
/** interface for clients that bind */
IBinder mBinder;
/** indicates whether onRebind should be used */
boolean mAllowRebind;
/** Called when the service is being created. */
@Override
public void onCreate() {
}
/** The service is starting, due to a call to startService() */
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return mStartMode;
}
/** A client is binding to the service with bindService() */
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
/** Called when all clients have unbound with unbindService() */
@Override
public boolean onUnbind(Intent intent) {
return mAllowRebind;
}
/** Called when a client is binding to the service with bindService()*/
@Override
public void onRebind(Intent intent) {
}
/** Called when The service is no longer used and is being destroyed */
@Override
public void onDestroy() {
}
}
例
この例では、独自のAndroidサービスを作成する方法を示す簡単な手順を説明します。次の手順に従って、HelloWorldの例の章で作成したAndroidアプリケーションを変更します-
ステップ | 説明 |
---|---|
1 | あなたは、Androidアプリケーションを作成して、それに名前を付けるためにAndroidのStudioIDEを使用する私のアプリケーションパッケージの下com.example.tutorialspoint7.myapplicationで説明したようにHello Worldの例の章を参照してください。 |
2 | メインアクティビティファイルMainActivity.javaを変更して、startService ()メソッドとstopService()メソッドを追加します。 |
3 | パッケージcom.example.MyApplicationの下に新しいJavaファイルMyService.javaを作成します。このファイルには、Androidサービス関連のメソッドが実装されています。 |
4 | <service ... />タグを使用して、AndroidManifest.xmlファイルでサービスを定義します。アプリケーションは、制限なしで1つ以上のサービスを持つことができます。 |
5 | res / layout / activity_main.xmlファイルのデフォルトの内容を変更して、線形レイアウトに2つのボタンを含めます。 |
6 | res / values /strings.xmlファイルの定数を変更する必要はありません。AndroidStudioが文字列値を処理します |
7 | アプリケーションを実行してAndroidエミュレーターを起動し、アプリケーションで行われた変更の結果を確認します。 |
変更されたメインアクティビティファイルの内容は次のとおりです MainActivity.java。このファイルには、基本的なライフサイクルメソッドのそれぞれを含めることができます。サービスを開始および停止するためのstartService()メソッドとstopService()メソッドを追加しました。
package com.example.tutorialspoint7.myapplication;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.View;
public class MainActivity extends Activity {
String msg = "Android : ";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(msg, "The onCreate() event");
}
public void startService(View view) {
startService(new Intent(getBaseContext(), MyService.class));
}
// Method to stop the service
public void stopService(View view) {
stopService(new Intent(getBaseContext(), MyService.class));
}
}
以下はの内容です MyService.java。このファイルには、要件に基づいてサービスに関連付けられた1つ以上のメソッドを実装できます。今の我々は唯一の2つのメソッドを実装しようとしているonStartCommand()とonDestroy() -
package com.example.tutorialspoint7.myapplication;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.widget.Toast;
/**
* Created by TutorialsPoint7 on 8/23/2016.
*/
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Let it continue running until it is stopped.
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
}
}
以下は、AndroidManifest.xmlファイルの変更されたコンテンツです。ここに、サービスを含めるために<service ... />タグを追加しました-
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tutorialspoint7.myapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
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=".MyService" />
</application>
</manifest>
以下の内容になります res/layout/activity_main.xml 2つのボタンを含むファイル-
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Example of services"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point "
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_above="@+id/imageButton"
android:layout_centerHorizontal="true"
android:layout_marginBottom="40dp" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/abc"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button2"
android:text="Start Services"
android:onClick="startService"
android:layout_below="@+id/imageButton"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Stop Services"
android:id="@+id/button"
android:onClick="stopService"
android:layout_below="@+id/button2"
android:layout_alignLeft="@+id/button2"
android:layout_alignStart="@+id/button2"
android:layout_alignRight="@+id/button2"
android:layout_alignEnd="@+id/button2" />
</RelativeLayout>
変更したものを実行してみましょう Hello World!変更したばかりのアプリケーション。私はあなたがあなたを作成したと思いますAVD環境設定をしながら。Android Studioからアプリを実行するには、プロジェクトのアクティビティファイルの1つを開き
サービスを開始するには、をクリックしてみましょう Start Serviceボタンをクリックすると、サービスが開始され、onStartCommand()メソッドでのプログラミングに従って、次のようにシミュレータの下部に「サービスが開始されました」というメッセージが表示されます。
サービスを停止するには、[サービスの停止]ボタンをクリックします。