編輯:關於Android編程
在Android應用程序中,Activity負責界面的顯示,Service負責後台工作,當然後台和界面是需要交互的,所以Activity需要和Service交互.
比較常用的是Activity和本地Service的交互,本文介紹的便是這種,最終實現Activity和Service都能很方便地調用對方的public方法。
其實只要讓Activity和Service綁定之後,分別擁有對方的引用就可以了。
以MainActivity和MyService為例
創建一個服務類MyService.java
public class MyService extends Service { private MainActivity activity; @Override public IBinder onBind(Intent arg0) { return new MyBinder(); } /** * 與activity綁定後返回的Binder */ public class MyBinder extends Binder { // 獲取service對象的引用 public MyService getService() { return MyService.this; } } public void setActivity( MainActivity _activity){ this.activity = _activity; } }
讓Service中擁有一個Activity類型的成員,並提供setActivity()方法
注意要在androidManifest中聲明該Service
然後在MainActivity中實現綁定
public class MainActivity extends Activity { // 本地服務 private MyService mLocalService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindLocalService(); } /** * 創建並綁定本地Service * */ private void bindLocalService() { Intent bindIntent = new Intent(this, MyService.class); bindService(bindIntent, localServiceConnection, BIND_AUTO_CREATE); } /** * 綁定本地服務的ServiceConnection類 */ ServiceConnection localServiceConnection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName arg0) { mLocalService = null; } @Override public void onServiceConnected(ComponentName name, IBinder service) { MyBinder myBinder = (MyService.MyBinder) service; mLocalService = myBinder.getService(); mLocalService.setActivity(MainActivity.this); } }; }
要點是這裡
@Override public void onServiceConnected(ComponentName name, IBinder service) { MyBinder myBinder = (MyService.MyBinder) service; mLocalService = myBinder.getService(); mLocalService.setActivity(MainActivity.this); }
這樣一來,就可以調用對方裡的public方法了
需要注意的是,bindService()方法的執行是用了回調機制的,在Service中獲得Binder後再回到Activity,期間Activity不會停下等待而是執行bindService()後面的,所以在bindService()後面mLocalService可能為null, 不過只要在調用mLocalService的方法前判斷其是否不為null就可以了
比如
1. MyService裡有一個方法
public void print(String s){ System.out.println(is in service --> +s); }
if(mLocalServise!=null){ mLocalService.print(call from activity); }
public void updateTextView(String s){ textView.setText(s); }
if(activity!=null){ activity.updateTextView(service call the fun in activity); }
如果在Service裡創建了新線程,則新線程與activity的UI線程的通信用的是異步消息處理機制,可在MainActivity中創建一個public static 的Handler對象
public static Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { System.out.println(handler say something); } };
private Handler mHandler = MainActivity.handler;
還有用廣播Broadcast來實現Service通知UI更新的,不過這樣消耗太大,不建議這麼做,除非同時需要通知多個Activity進行更新操作
上面的做法,即實現了Service與Activity的交互,也讓這兩個類的盡量獨立,代碼條理清晰,方便類的維護。
演示效果如下:項目布局如下:MainActivity.java代碼import java.util.ArrayList;import java.util.List;imp
一、微博開發者平台的使用新浪微博這裡主要是介紹使用新浪微博的開發者平台。想要做一個基於微博登陸或者其他一系列操作的,我們先要登陸他們的官網進行注冊使用,首先是要注冊成為一
二維碼其實有很多種,但是我們常見的微信使用的是一種叫做QRCode的二維碼,像下面這樣的,可以放心的掃,這只是我的博客主頁鏈接啦: 關於QR碼編碼的二維碼,我們
android實現底部布局往往使用RelativeLayout的布局方式,並且設置android:layout_alignParentBottom=”true”,這樣很容