2)和Activity交互的本地服務
剛剛我們介紹的Service是不需要與Activity進行交互的,現在我們再來看看與Activity交互的本地服務。首先,我們新建1個BindLocalServide類繼承自Serivce,代碼以下:
// import略 public class BindLocalServideextends Service {
private static final String TAG = "localservice"; private MyBinder myBinder = new MyBinder();
@Override public IBinder onBind(Intent intent) { return myBinder; } @Override public void onCreate() { super.onCreate(); } @Override public void onDestroy() { super.onDestroy(); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); } @Override public boolean onUnbind(Intent intent) { return super.onUnbind(intent); }
public class MyBinder extends Binder{ public LocalService getService(){ return LocalService.this; } } } |
然后,我們新建1個BindServiceActivity類繼承自Actvity,代碼以下:
// import略 public class BindServiceActivity extends Activity{
private Button startBtn,stopBtn; private boolean flag;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.localservice); startBtn = (Button)findViewById(R.id.start_button); stopBtn = (Button)findViewById(R.id.stop_button); startBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(BindServiceActivity.this,LocalService.class); bindService(intent, conn, Context.BIND_AUTO_CREATE); } }); stopBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(flag == true){ unbindService(conn); flag = false; } } }); } private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) {
}
@Override public void onServiceConnected(ComponentName name, IBinder service) { MyBinder binder = (MyBinder)service; LocalService bindService = binder.getService(); bindService.MyMethod(); flag = true; } }; } |
在這里,也是使用之前使用過的localservice.xml布局文件,定義了“啟動”和“停止”兩個按鈕。另外,別忘了在AndroidMainfest.xml中注冊Service:
<service android:name=". BindLocalServideextends "/> |
這里可以發現onBind需要返回1個IBinder對象。也就是說和上1例子LocalService不同的是:
1)添加了1個public內部類繼承Binder,并添加getService方法來返回當前的Service對象;
2)新建1個IBinder對象――new那個Binder內部類;
3)onBind方法返還那個IBinder對象。
然后,我們來看看打印出來的效果,如圖4⑻所示:
圖4⑻ onBind Service履行順序
通過日志,我們可以發現,通過bindService這類方法啟動服務,當服務啟動后,屢次啟動只有第1次有效,并且與服務相綁定的Activity“死亡”時,該服務也停止。
我們在使用某些Android利用的時候,可能會發現安裝了某個利用以后,會有1些服務也會隨之運行。而且,有的服務每次都會隨著手機開機而自動啟動。下面,就讓我們1起來看看是怎樣樣實現開機自啟動服務的。
首先,我們需要來了解1下Android中的 BroadcastReceiver:
BroadcastReceiver也就是“廣播接收者”的意思,顧名思義,它就是用來接收來自系統和利用中的廣播。
在Android系統中,廣播利用在各個方面。例如當開機完成后系統會產生1條廣播,接收到這條廣播就可以實現開機啟動服務的功能;當網絡狀態改變時系統會產生1條廣播,接收到這條廣播就可以及時地做出提示和保存數據等操作;當電池電量改變時,系統會產生1條廣播,接收到這條廣播就可以在電量低時告知用戶及時保存進度,等等。
正是基于這樣的原理,只要實現1個BroadcastReceiver,我們就能夠監聽開機時候的廣播(手機啟動完成的事件ACTION_BOOT_COMPLETED),當收到開機“信號”時,啟動相應的服務。
我們用1個簡單的例子來看看它是如何實現的。
首先,我們新建1個MyReceiver類繼承自BroadcastReceiver,代碼以下:
// import略 public class MyReceiver extends BroadcastReceiver {
private static final String POWERN_ON_ACTION = "android.intent.action.BOOT_COMPLETED";
public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(POWERN_ON_ACTION)) { startService(new Intent("com.char4.LOCAL_SERVICE")); } } } |
我們要讓這個Receiver工作,需要把它注冊到Android系統上,去監聽廣播的BOOT_COMPLETED intent。在AndroidManifest.xml中添加以下代碼:
<receiver android:name=".MyReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> |
這樣重新開機以后,服務就會在系統啟動終了后自動運行了。