Androidでのサービスの使い方(Service)について
8596 ワード
Androidサービス(Service)は、ユーザーと対話する必要がなく、長期的な運用を求めるタスクを実行するのに適しています.サービスの実行は、任意のユーザーインタフェースに依存せず、APPがバックグラウンドに切り替えられたり、別のAPPが開かれたりしても、サービスは正常に動作します.
しかし、あるアプリプロセスが殺されると、このアプリが作成したすべてのサービスが停止します.
また、サービス自体はスレッドを自動的に開くことはなく、サービスコードはデフォルトでプライマリスレッドで実行されます.したがって、実行するビジネスロジックに時間がかかる場合は、プライマリ・スレッドがブロックされないように、これらのビジネスロジックを実行するために、サービス内にサブスレッドを作成する必要があります.
1サービスの定義
Android Studioでは、File→New→Service→Serviceでサービスを作成できます.
ポップアップ・ダイアログ・ボックスでサービスを構成するには、次の手順に従います.
サービス名を設定します.次の2つの構成項目は、*Exported:現在のプログラム以外のプログラムがこのサービスにアクセスできるかどうかを示します.(デフォルトチェック)*Enabled:このサービスを有効にするかどうか.(デフォルトチェック)
作成したサービスはサービスから継承され、onBind()メソッドを実装する必要があります.ここでは、以下の方法を書き直しました.
方法
説明
void onCreate()
サービス作成時にメソッドが呼び出されます.
onStartCommand(Intent intent, int flags, int startId)
このメソッドは、サービスが開始されるたびに呼び出されます.
void onDestroy()
サービス破棄時にメソッドが呼び出されます.
これらの方法にログを追加し,実行結果の観察を容易にした.
また、このクラスの任意の場所でstopSelf()メソッドを呼び出すと、サービスは自分で停止します.
サービスを定義したらAndroidManifestが必要です.xmlに登録されているサービス(Android Studioを使用している場合は、このステップが役立ちます):
2サービスの開始または停止
Intentを借りて、私达はサービスのスタートと停止を制御することができますO(∩∩)Oハハ~
ここでの
実行結果:
D/FirstService: onCreate D/FirstService: onStartCommand D/FirstService: onDestroy
**注意:**onCreate()はサービスの最初の作成時に呼び出され、onStartCommand()はサービスの開始時に呼び出されます.
サービス開始後、AndroidのSettings→Developer opinions→Running servicesで見つけることができます.
アプリをクリックすると、サービスの詳細が表示されます.
Developer opinionsオプションが見つからない場合は、AndroidのSettings→About emulated device→Build numberを複数回クリックして開発者モードを開くことができます.
3活動管理サービス
アクティビティは、
方法
説明
サービスバインド後にメソッドが呼び出されます.
サービスがバインド解除された後にメソッドが呼び出されます.
サービスは、
まず、サービスクラスを変更します.
ここでは,簡単な初期化法を実装する内部クラスCustomBinderを定義した.次にonBind()メソッドでそのインスタンスを返します.
次に、アクティビティクラスを変更し、ServiceConnectionインスタンスを作成します.
サービスはServiceConnectionインスタンスによってバインドまたはバインド解除できます.
バインドサービス:
bindServiceは3つのパラメータを受信します.
パラメータ
を選択します.
説明
service
Intent
このIntentは、現在のアクティブクラスとサービスクラスをバインドします.
conn
ServiceConnection
ServiceConnectionオブジェクト.
flags
int
サービスをバインドする方法.ここのBIND_AUTO_CREATEは、バインディング後に自動的にサービスが作成されることを示します.
【バインドサービス】出力結果:
D/FirstService: onCreate D/MainActivity: onServiceConnected D/FirstService: init CustomBinder
解除サービス:
ServiceConnectionオブジェクトに伝われば解けるのですが、簡単ではないでしょうかO(∩∩)Oハハ~
【解縛サービス】出力結果:
D/FirstService: onDestroy
しかし、あるアプリプロセスが殺されると、このアプリが作成したすべてのサービスが停止します.
また、サービス自体はスレッドを自動的に開くことはなく、サービスコードはデフォルトでプライマリスレッドで実行されます.したがって、実行するビジネスロジックに時間がかかる場合は、プライマリ・スレッドがブロックされないように、これらのビジネスロジックを実行するために、サービス内にサブスレッドを作成する必要があります.
1サービスの定義
Android Studioでは、File→New→Service→Serviceでサービスを作成できます.
ポップアップ・ダイアログ・ボックスでサービスを構成するには、次の手順に従います.
サービス名を設定します.次の2つの構成項目は、*Exported:現在のプログラム以外のプログラムがこのサービスにアクセスできるかどうかを示します.(デフォルトチェック)*Enabled:このサービスを有効にするかどうか.(デフォルトチェック)
public class FirstService extends Service {
private static final String TAG = "FirstService";
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
public FirstService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
作成したサービスはサービスから継承され、onBind()メソッドを実装する必要があります.ここでは、以下の方法を書き直しました.
方法
説明
void onCreate()
サービス作成時にメソッドが呼び出されます.
onStartCommand(Intent intent, int flags, int startId)
このメソッドは、サービスが開始されるたびに呼び出されます.
void onDestroy()
サービス破棄時にメソッドが呼び出されます.
これらの方法にログを追加し,実行結果の観察を容易にした.
また、このクラスの任意の場所でstopSelf()メソッドを呼び出すと、サービスは自分で停止します.
サービスを定義したらAndroidManifestが必要です.xmlに登録されているサービス(Android Studioを使用している場合は、このステップが役立ちます):
<service
android:name=".FirstService"
android:enabled="true"
android:exported="true">service>
2サービスの開始または停止
Intentを借りて、私达はサービスのスタートと停止を制御することができますO(∩∩)Oハハ~
final Context context = this;
findViewById(R.id.start_service).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//
startService(new Intent(context, FirstService.class));
}
});
findViewById(R.id.stop_service).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//
stopService(new Intent(context, FirstService.class));
}
});
ここでの
startService()
およびstopService()
メソッドはいずれもContextクラスに定義されているので、アクティブクラスで直接呼び出すことができる.実行結果:
D/FirstService: onCreate D/FirstService: onStartCommand D/FirstService: onDestroy
**注意:**onCreate()はサービスの最初の作成時に呼び出され、onStartCommand()はサービスの開始時に呼び出されます.
サービス開始後、AndroidのSettings→Developer opinions→Running servicesで見つけることができます.
アプリをクリックすると、サービスの詳細が表示されます.
Developer opinionsオプションが見つからない場合は、AndroidのSettings→About emulated device→Build numberを複数回クリックして開発者モードを開くことができます.
3活動管理サービス
アクティビティは、
ServiceConnection
インタフェースを実装することによってサービスに接続され、以下の2つの方法を含む.方法
説明
onServiceConnected(ComponentName name, IBinder service)
サービスバインド後にメソッドが呼び出されます.
onServiceDisconnected(ComponentName name)
サービスがバインド解除された後にメソッドが呼び出されます.
サービスは、
IBinder onBind(Intent intent)
メソッドを実装することによって、onServiceConnected()メソッドに必要なIBinder型のサービスパラメータに変換される.まず、サービスクラスを変更します.
public class FirstService extends Service {
class CustomBinder extends Binder {
public void init(){
Log.d(TAG, "init CustomBinder");
}
}
@Override
public IBinder onBind(Intent intent) {
return new CustomBinder();
}
}
ここでは,簡単な初期化法を実装する内部クラスCustomBinderを定義した.次にonBind()メソッドでそのインスタンスを返します.
次に、アクティビティクラスを変更し、ServiceConnectionインスタンスを作成します.
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG, "onServiceConnected");
FirstService.CustomBinder customBinder = (FirstService.CustomBinder) service;
customBinder.init();
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "onServiceDisconnected");
}
};
サービスはServiceConnectionインスタンスによってバインドまたはバインド解除できます.
バインドサービス:
bindService(new Intent(context, FirstService.class), connection, BIND_AUTO_CREATE);
bindServiceは3つのパラメータを受信します.
パラメータ
を選択します.
説明
service
Intent
このIntentは、現在のアクティブクラスとサービスクラスをバインドします.
conn
ServiceConnection
ServiceConnectionオブジェクト.
flags
int
サービスをバインドする方法.ここのBIND_AUTO_CREATEは、バインディング後に自動的にサービスが作成されることを示します.
【バインドサービス】出力結果:
D/FirstService: onCreate D/MainActivity: onServiceConnected D/FirstService: init CustomBinder
解除サービス:
unbindService(connection);
ServiceConnectionオブジェクトに伝われば解けるのですが、簡単ではないでしょうかO(∩∩)Oハハ~
【解縛サービス】出力結果:
D/FirstService: onDestroy