サービスの簡単な概要
サービス(サービス):ユーザ・インタフェースではありません、それがバックグラウンドで実行することができますし、長期的なアプリケーションコンポーネントの操作を行うことができます。(:活動、他のサービスのような)他のアプリケーションコンポーネントによってサービスを開始します。加えて、構成要素と相互作用するサービスにバインドされ、さらにはプロセス間通信(IPC)を行うことができます。たとえば:サービスは、音楽を再生、ネットワークトランザクションを処理するファイルI / Oを実行したり、コンテンツプロバイダとの対話、そしてこのすべては、バックグラウンドで行うことができることができます。
プロセスの優先順位
あなたがサービスを理解することができ、プロセスの優先順位を理解します -
- 1.フォアグラウンド・プロセス(フォアグラウンド・プロセス)
- 文の要約:フォアグラウンドプロセスは、ユーザとの対話の過程で現在ありません。
- 2.可視プロセス(可視プロセス)
- この方法onPause活動は、実行に相当します。活動時にダイアログをポップアップ表示:など。
- 3.サービスプロセス(サービスプロセス)
- ユーザーが表示されていないもののSTARTSERVICEを使用するのと同じで、サービスを開いて、それがユーザーに懸念されます。以下のような:背景データをダウンロード、音楽を演奏。
- 4.バックグラウンドプロセス(デーモン)
- 活性onStop同等の方法が実施されます。以下のような:アプリケーションを終了するにはHomeキーを押します。
- 5.空のプロセス(プロセス空)
- アプリケーションは、アプリケーション内の任意の活性成分を持たない空のプロセスです。唯一の理由は、次のターンの生存期間を改善することです。
2つの方法でオープンサービス
サービス:メインスレッドで実行デフォルト。
サービスの作成プロセス
- android.app.Serviceを継承するサービスクラスをカスタマイズします。
- マニフェストファイルの設定サービス(AndroidManifest.xmlを);
- サービスクラスのメソッドをオーバーライド。
<service android:name=".service.MyCustomService"></service>
どちらのサービスも道を開きます
:道を開始
コードの最初の
private Intent startIntent;
//start方式:开启服务
public void startOpenService(View v) {
//创建一个开启服务的Intent对象
startIntent = new Intent(this, MyCustomService.class);
this.startService(startIntent); //开启一个服务
}
//start方式:关闭服务
public void startCloseService(View v) {
if (startIntent != null) {
this.stopService(startIntent);
startIntent = null;
}
}
1. STARTSERVICE(意図サービス)でサービスを開きます。
- サービスが最初に開いたときのonCreate()、onStartCommand()メソッドは、2ターン目に実行されます。
- サービスがオンになって、その後、サービスをオンにする]をクリックすると、それだけでonStartCommand()メソッドを実行します。
2. stopService(意図サービス)によるサービスをオフにします
- onDestroy()メソッドが実装stopService方法(クローズドサービス)になり、実行されます!
- 注パラメータ:インテントオブジェクトがnullにすることはできません、最初の文は、空である(nullではそうではありません、あなたが繰り返し呼び出すことができます)。
特記事項
1. stopServiceはインテントオブジェクトが渡されなければならないとSTARTSERVICEインテントオブジェクトがオフになっているオープンサービスを確保するためには、同じオブジェクトである渡されました。
2.アプリケーションは、(殺されていないアプリケーションは、舞台裏で動作します)終了し、サービスがまだ実行されます。
3.手動でアプリケーションプロセスを強制終了すると、サービスが終了されます!そして、双方向サービスのonDestroy()メソッドを実行しません。
2:バインド・モード
コードの最初の
private Intent bindIntent;
private MyServiceConnection connection;
private boolean isSuccess;
//bind方式:开启服务
public void bindOpenService(View v) {
if (!isSuccess) {
bindIntent = new Intent(this, MyCustomService.class);
//boolean bindService(Intent service, //开启服务的意图对象
// ServiceConnection conn, //服务连接对象
// int flags) //绑定服务操作选项()
connection = new MyServiceConnection();
isSuccess = this.bindService(bindIntent, connection, Context.BIND_AUTO_CREATE);
}
}
//bind方式:解绑服务
public void bindCloseService(View v) {
//void unbindService(ServiceConnection conn)
if (connection != null) {
this.unbindService(connection);
connection = null;
isSuccess = false;
}
}
bindService 1.()オープンサービス
- onCreate()、[OnBind]の()は、2つの最初のオープンサービスは、続いて行われる方法。
- BindService操作が再び、それが実行される任意の方法を持っていません。サービスを開くには、このメソッドを使用するには、正常な動作がもはや結合されない場合、結合後の状態を取得することをお勧めします。
2. unbindService()アンバンドリングサービス
- onUnbind()、onDestroy()メソッドは、それが続いて行われ、アンバンドリングunbindService方法の実装における2つのサービスであろう。だから、一度だけこの操作を行うことができますアンバンドリング。
特記事項
ServiceConnectionは、同じオブジェクトことを確認するために渡さ結ば1.結合決済オブジェクト!
2.成功(真)のisSuccessストレージサービス結合状態にあり、結合は、バインディングの重複を避けるために、成功しています。各時間は、オブジェクトがServiceConnection unbindServiceオブジェクトがサービスを提供するために結合させることができるとき、それは例外がスローされます渡して、新しいbindServiceパスでオブジェクトServiceConnection新しいオブジェクトと矛盾しています!
3.アンバンドリングした後、isSuccess割り当ては偽、それが再びバインド操作することができます。
4.バインドサービスは設定で、目に見えないサービスを開くための方法である(実際には、いくつかの携帯電話は今オープンサービスは、目に見えないが務めになってきた道を起動し、システムをカスタマイズ)が見つかりません。
オープナーが破壊される前に、5バインドサービスとオープンな方法オープナー(活動)は、依存性があり、それはサービスのアンバンドリングをバインドする方法を開く必要があり、または例外がスローされます!(学生と一緒に行うが、同じ金型用までもありません。)
サービステンプレートコード
:需要活動にサービスを開始する方法を結合し使用して、サービスのメソッド呼び出し(一部の業務処理をシミュレートします)。
分析:プロセスステップ
- サービスを継承するサービスクラスを作成します。以下のような:MyCustomService。
- ServiceConnectionインタフェースを実装し、サービス・インターフェース・オブジェクトのクラスをカスタマイズします。以下のような:MyServiceConnection。
- カスタムミドルクラス、クラスの継承バインダー(IBinder実装クラスを)助けます。サービス[OnBind]の方法には、戻り値として、実行されるとき。以下のような:MyBinderImpl。
- いくつかの中間のクラスオブジェクト共有ヘルプ機能をカプセル化するためのカスタム・インタフェース。以下のような:MyBinderInterface。
プロセス全体のコードは次のようです
MyCustomService.class
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
/**
* 创建一个服务类
*/
public class MyCustomService extends Service {
@Override
public IBinder onBind(Intent intent) {
//该方法:在使用【bind绑定】的方式:开启服务的时候,才会被调用
Log.e("Service生命周期", "【onBind】");
//返回值需要一个IBinder接口实现类对象(可以返回自定义实现类对象)
return new MyBinderInter();
}
@Override
public boolean onUnbind(Intent intent) {
Log.e("Service生命周期", "【onUnbind】");
return super.onUnbind(intent);
}
@Override
public void onCreate() {
super.onCreate();
//服务第一次创建时调用
Log.e("Service生命周期", "【onCreate】");
//获取服务运行线程
String name = Thread.currentThread().getName();
long id = Thread.currentThread().getId();
Log.e("线程", "【Service】" + name + "-" + id);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//每次开启服务(Activity内调用startService()方法)时调用
Log.e("Service生命周期", "【onStartCommand】");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
//服务被销毁时调用
Log.e("Service生命周期", "【onDestroy】");
}
//模拟:定义一些函数,作为业务处理
public void playPoker() {
Toast.makeText(this, "玩扑克", Toast.LENGTH_SHORT).show();
}
public void playBall() {
Toast.makeText(this, "打球", Toast.LENGTH_SHORT).show();
}
/**
* 中间帮助类:自定义类继承 Binder(IBinder 接口实现类)
*/
public class MyBinderInter extends Binder implements MyBinderInterface {
@Override
public void callPlayPoker() {
playPoker();
}
@Override
public void callPlayBall() {
playBall();
}
}
}
MyServiceConnection.class
import android.content.ComponentName;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.util.Log;
/**
* 创建一个服务接口对象类:当服务绑定成功时,可以接收一个中间帮助类对象
* 当 MyCustomService 中的 onBind 方法返回值不为null时,该服务连接对象类中的方法才会被执行
*/
public class MyServiceConnection implements ServiceConnection {
private MyCustomService.MyBinderInter myBinderInter;
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
//服务绑定成功后执行(onBind执行后执行该方法) IBinder:中间帮助类对象
this.myBinderInter = (MyCustomService.MyBinderInter) iBinder;
Log.e("Service生命周期", "【onServiceConnected】");
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
//该方法在连接正常关闭的情况下不会被执行,只有在Service被破坏或杀死的情况下执行。
//如:系统资源不足,需要杀掉该服务,则会执行该方法。
}
public void callPlayPoker(){
if(myBinderInter!=null){
myBinderInter.callPlayPoker();
}
}
public void callPlayBall(){
if(myBinderInter!=null){
myBinderInter.callPlayBall();
}
}
}
インターフェース:MyBinderInterface
//自定义接口:封装中间帮助类所共有的一些方法
public interface MyBinderInterface {
//随意定义两个抽象方法,由实现类重写
void callPlayPoker();
void callPlayBall();
}
ServiceActivityは、この方法ではサービス内で呼び出します
- 注意:アクティビティに()メソッド、アンバンドリングサービスをonDestroy実行すると、それ以外の場合は、例外がスローされます。
public class ServiceActivity extends BaseActivity {
private Intent bindIntent;
private MyServiceConnection connection;
private boolean isSuccess;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_service);
}
//bind方式:开启服务
public void bindOpenService(View v) {
if (!isSuccess) {
bindIntent = new Intent(this, MyCustomService.class);
connection = new MyServiceConnection();
isSuccess = this.bindService(bindIntent, connection, Context.BIND_AUTO_CREATE);
}
}
public void playPoker(View v) {
if (connection != null) {
connection.callPlayPoker();
}
}
public void playBall(View v) {
if (connection != null) {
connection.callPlayBall();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (connection != null) {
this.unbindService(connection);
connection = null;
isSuccess = false;
}
}
}
:bindServiceとunbindServiceソース記述(英語の良いジュニアパートナーが一緒に学ぶことができます)
ブールbindService(意図サービス、ServiceConnection CONN、int型のフラグ)
- 方法说明
必要であれば、それを作成し、アプリケーションサービスに接続します。これは、アプリケーションとサービス間の依存関係を定義します。それが作成され、それが死んで再起動した場合に語られるとき、与えられたconnがサービスオブジェクトを受け取ります。サービスは、限り、呼び出し元のコンテキストが存在するためにシステムに必要とみなされます。このコンテキストが停止している活動であれば、例えば、サービスは、活動が再開されるまで実行を継続するために必要とされることはありません。
あなたが特定のサービスにバインドする権限を持っていない場合、この関数は、SecurityExceptionをスローします。
注意:このメソッドは、BroadcastReceiverコンポーネントから呼び出すことはできません。あなたがサービスにBroadcastReceiverからの通信に使用できるパターンは、そのコマンドを実行して行われたときにそのstopSelf(int)メソッドを呼び出すサービスと、送信するコマンドを含む引数を使ってSTARTSERVICE(意図)を呼び出すことです。この説明のためにAPIのデモアプリケーション/サービス/サービス開始引数コントローラを参照してください。このBroadcastReceiverの寿命が他のオブジェクト(それを登録もの)に接続されているので、それは、registerReceiver(BroadcastReceiver、IntentFilter)に登録されているBroadcastReceiverからこの方法を使用する、しかし、大丈夫です。 - パラメータ(参数说明)
サービス:に接続するためのサービスを識別します。意図は明確なコンポーネント名、またはサービスによって公開IntentFilterと一致するように、論理的な説明(アクション、カテゴリ、など)のいずれかを指定できます。
CONN:サービスが開始され、停止しているなどの情報を受信します。これは有効なServiceConnectionオブジェクトでなければなりません。それはnullであってはなりません。
フラグ:結合のための操作オプション。0、BIND_AUTO_CREATE、BIND_DEBUG_UNBIND、BIND_NOT_FOREGROUND、BIND_ABOVE_CLIENT、BIND_ALLOW_OOM_MANAGEMENT、またはBIND_WAIVE_PRIORITYかもしれません。 - 戻り値(返回值说明)
あなたが正常にサービスにバインドされている場合は、trueが返されます。あなたがサービスオブジェクトを受信しないように、接続が行われていない場合はfalseが返されます。
空unbindService(ServiceConnection CONN)
- 方法说明
アプリケーションサービスから切断します。サービスが再開され、サービスが今、いつでも停止することが許可されているようあなたは、もはやコールを受信しません。 - パラメータ(参数说明)
CONN:以前bindServiceに供給された接続インタフェース()。このパラメータはnullであってはなりません。
参考リンク:Googleの公式文書:サービス
PS:あなたともっと交流を持つように楽しみにして、ありがとうございました〜