標籤:android android平台 android應用 android開發
2)和Activity互動的本地服務
剛剛我們介紹的Service是不需要與Activity進行互動的,現在我們再來看看與Activity互動的本地服務。首先,我們建立一個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; } } } |
然後,我們建立一個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 "/> |
--------------------------------------------試著放個廣告 現在沒工作 要生存 沒辦法平安陸金所 隸屬於平安集團的p2p平台年投資報酬率7%-9% 是替代銀行理財的首選個人經驗教訓 推薦投資安鑫或者有擔保的彩虹項目不要投資安e 那個幾乎無法轉讓 想提前提現非常困難註冊連結 http://affiliate.lufax.com/action/36XBU用此連結註冊 你我都會有幾十元的額外現金獎勵--------------------------------------------
這裡可以發現onBind需要返回一個IBinder對象。也就是說和上一例子LocalService不同的是:
1)添加了一個public內部類繼承Binder,並添加getService方法來返回當前的Service對象;
2)建立一個IBinder對象——new那個Binder內部類;
3)onBind方法返還那個IBinder對象。
然後,我們來看看列印出來的效果,4-8所示:
圖4-8 onBind Service執行順序
通過日誌,我們可以發現,通過bindService這種方法啟動服務,當服務啟動後,多次啟動只有第一次有效,並且與服務相綁定的Activity“死亡”時,該服務也停止。
4.2.4開機自啟動的服務
我們在使用某些Android應用的時候,可能會發現安裝了某個應用之後,會有一些服務也會隨之運行。而且,有的服務每次都會隨著手機開機而自動啟動。下面,就讓我們一起來看看是怎麼樣實現開機自啟動服務的。
首先,我們需要來瞭解一下Android中的 BroadcastReceiver:
BroadcastReceiver也就是“廣播接收者”的意思,顧名思義,它就是用來接收來自系統和應用中的廣播。
在Android系統中,廣播應用在方方面面。例如當開機完成後系統會產生一條廣播,接收到這條廣播就能實現開機啟動服務的功能;當網路狀態改變時系統會產生一條廣播,接收到這條廣播就能及時地做出提示和儲存資料等操作;當電池電量改變時,系統會產生一條廣播,接收到這條廣播就能在電量低時告知使用者及時儲存進度,等等。
正是基於這樣的原理,只要實現一個BroadcastReceiver,我們就可以監聽開機時候的廣播(手機啟動完成的事件ACTION_BOOT_COMPLETED),當收到開機“訊號”時,啟動相應的服務。
我們用一個簡單的例子來看看它是如何?的。
首先,我們建立一個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> |
這樣重新開機以後,服務就會在系統啟動完畢後自動運行了。
第四章 Android開發三大基石—Activity、Service和Handler(5)