Androidのserviceコンポーネントの詳細
serviceコンポーネントはactivityコンポーネントとそれに似ています。serviceはインターフェースがないactivityと言えます。
もちろんserviceのライフサイクルとactivityには違いがあります。
serviceコンポーネントは一般的にどこで使われていますか?上でserviceコンポーネントはインタフェースがないと述べました。ユーザーと直接対話しなくてもいいです。
したがって、serviceコンポーネントは一般的にバックグラウンドで動作します。例えば、インタフェースを必要としないデータ処理などをします。
サービスの開発には二つのステップが必要です。
1,基本serviceのサブクラスを定義します。
2,Android Manifest.xmlファイルにこのserviceを配置します。
どのようにserviceを起動しますか?activityを起動するには二つの方法がありますか?
startActivity(intent)
startActivityForResult(intent)
serviceを起動するには二つの方法があります。
startService(intent)
bindService(Intent service,ServiceConnection conn,int flags)
両者の違いは何ですか?まず下記のコードを見てもいいです。
binderを通じて訪問者に伝達します。
後で詳しく説明します。まず下のコードを見てServiceを起動し、Serviceのcountデータを得ます。
bindService(Intent service,ServiceConnection conn,int flags)は、違っています。
訪問者は起動したServiceからデータを入手できますが、どうやって手に入れましたか?bindServiceの二つ目のパラメータconnはServiceConnectionです。 対象として、訪問者とサービスの接続が成功すれば、ServiceConnectionに戻ります。 のoneServiceConnecedの方法は、上記の手順はこのコールバック方法の中でIBinderを取得することです。 オブジェクトの。
見てもいいです
これは訪問者とサービスのデータが相互作用する原理であり、IBinderオブジェクトを通じて伝達される。
ここに来るかもしれませんが、ビダ=(BindService.MyBinder)serviceです。このコードは理解できません。
持ってきたIBinderの対象は上のServiceコードのonBind方法で戻ってきたbinderではないかと思います。どうやってBindService.MyBinderオブジェクトに強く転化しましたか?
そして戻ってきたビッド countデータもないのに、訪問者はどうしてデータを入手できますか?
じゃ、もらいます IBinder 相手はもらうのと同じです。 MyBinderオブジェクトは、get Countメソッドにアクセスすることができます。これもなぜbinder=(BindService.MyBinder)serviceです。強回転を行い、ビッド・ゲットCount()はcountデータを得ることができます。IBinderには業務が実現されていないので、MyBinderが実現しました。
もちろんserviceのライフサイクルとactivityには違いがあります。
serviceコンポーネントは一般的にどこで使われていますか?上でserviceコンポーネントはインタフェースがないと述べました。ユーザーと直接対話しなくてもいいです。
したがって、serviceコンポーネントは一般的にバックグラウンドで動作します。例えば、インタフェースを必要としないデータ処理などをします。
サービスの開発には二つのステップが必要です。
1,基本serviceのサブクラスを定義します。
2,Android Manifest.xmlファイルにこのserviceを配置します。
どのようにserviceを起動しますか?activityを起動するには二つの方法がありますか?
startActivity(intent)
startActivityForResult(intent)
serviceを起動するには二つの方法があります。
startService(intent)
bindService(Intent service,ServiceConnection conn,int flags)
両者の違いは何ですか?まず下記のコードを見てもいいです。
public class BindService extends Service
{
private int count;
private boolean quit;
// onBinder
private MyBinder binder = new MyBinder();
// Binder IBinder
public class MyBinder extends Binder
{
public int getCount()
{
// Service :count
return count;
}
}
//
@Override
public IBinder onBind(Intent intent)
{
System.out.println("Service is Binded");
// IBinder
return binder;
}
// Service 。
@Override
public void onCreate()
{
super.onCreate();
System.out.println("Service is Created");
// 、 count
new Thread()
{
@Override
public void run()
{
while (!quit)
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
}
count++;
}
}
}.start();
}
// Service
@Override
public boolean onUnbind(Intent intent)
{
System.out.println("Service is Unbinded");
return true;
}
// Service 。
@Override
public void onDestroy()
{
super.onDestroy();
this.quit = true;
System.out.println("Service is Destroyed");
}
@Override
public void onRebind(Intent intent)
{
super.onRebind(intent);
this.quit = true;
System.out.println("Service is ReBinded");
}
}
上のServiceの役割は簡単にスレッドを開くことです。1秒ごとにcount+、このcountデータbinderを通じて訪問者に伝達します。
後で詳しく説明します。まず下のコードを見てServiceを起動し、Serviceのcountデータを得ます。
public class MainActivity extends Activity
{
Button startService_bnt , bindService_bnt;
// Service IBinder
BindService.MyBinder binder;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startService_bnt = (Button) findViewById(R.id.start_bnt);
bindService_bnt = (Button) findViewById(R.id.bind_bnt);
// Service Intent
Intent intent = new Intent(this,BindService.class);
startService_bnt.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
// Serivce
startService(intent);
}
});
bindService_bnt.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
// Serivce
bindService(intent , conn , Service.BIND_AUTO_CREATE);
Toast.makeText(MainActivity.this
, "Serivce count :" + binder.getCount()
, 4000)
.show();
}
});
}
// ServiceConnection
private ServiceConnection conn = new ServiceConnection()
{
// Activity Service
@Override
public void onServiceConnected(ComponentName name
, IBinder service)
{
System.out.println("--Service Connected--");
// Service onBind MyBinder
binder = (BindService.MyBinder) service;
}
// Activity Service
@Override
public void onServiceDisconnected(ComponentName name)
{
System.out.println("--Service Disconnected--");
}
};
}
上のactivityは2つのボタンを定義しています。2つのボタンをクリックすると2つの異なる方法でServiceを起動します。
startService(intent),
bindService(Intent service,ServiceConnection conn,int flags),
二つの起動方式の違いを説明し、上のコードを説明します。startService(intent)
Serviceを起動します。これは訪問者と対話する能力を持っていません。activityのstartActivity(),
のように、新しく起動したactivityからリターンデータを受け取ることができないようです。bindService(Intent service,ServiceConnection conn,int flags)は、違っています。
訪問者は起動したServiceからデータを入手できますが、どうやって手に入れましたか?bindServiceの二つ目のパラメータconnはServiceConnectionです。 対象として、訪問者とサービスの接続が成功すれば、ServiceConnectionに戻ります。 のoneServiceConnecedの方法は、上記の手順はこのコールバック方法の中でIBinderを取得することです。 オブジェクトの。
見てもいいです
// ServiceConnection
private ServiceConnection conn = new ServiceConnection()
{
// Activity Service
@Override
public void onServiceConnected(ComponentName name
, IBinder service)
{
System.out.println("--Service Connected--");
// Service onBind MyBinder
binder = (BindService.MyBinder) service;
}
// Activity Service
@Override
public void onServiceDisconnected(ComponentName name)
{
System.out.println("--Service Disconnected--");
}
};
簡単に言えば、訪問者はビッドServiceを通じてServiceに結び付けられます。結合が成功すると、ServiceConnectionの中のon ServiceConnect()方法をフィードバックします。この方法にはIBinder serviceパラメータがあります。このパラメータはServiceが訪問者の対象に暴露されます。訪問者はこのオブジェクトを持ってServiceのデータにアクセスできます。これは訪問者とサービスのデータが相互作用する原理であり、IBinderオブジェクトを通じて伝達される。
ここに来るかもしれませんが、ビダ=(BindService.MyBinder)serviceです。このコードは理解できません。
持ってきたIBinderの対象は上のServiceコードのonBind方法で戻ってきたbinderではないかと思います。どうやってBindService.MyBinderオブジェクトに強く転化しましたか?
そして戻ってきたビッド countデータもないのに、訪問者はどうしてデータを入手できますか?
@Override
public IBinder onBind(Intent intent)
{
System.out.println("Service is Binded");
// IBinder
return binder;
}
上のServiceコードの中にIBinderオブジェクトを処理することを忘れないでください。
// Binder IBinder
public class MyBinder extends Binder
{
public int getCount()
{
// Service :count
return count;
}
}
BinderはIBinderの実現クラスであり、MyBinderはBinderを継承し、中で方法を定義している。じゃ、もらいます IBinder 相手はもらうのと同じです。 MyBinderオブジェクトは、get Countメソッドにアクセスすることができます。これもなぜbinder=(BindService.MyBinder)serviceです。強回転を行い、ビッド・ゲットCount()はcountデータを得ることができます。IBinderには業務が実現されていないので、MyBinderが実現しました。