欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android Activity 與Service進(jìn)行數(shù)據(jù)交互詳解

 更新時(shí)間:2016年10月14日 09:43:57   投稿:lqh  
這篇文章主要介紹了Android Activity 與Service進(jìn)行數(shù)據(jù)交互的相關(guān)資料,在開(kāi)發(fā)Android App的時(shí)候經(jīng)常會(huì)使用這樣的功能,需要的朋友可以參考下

①?gòu)脑O(shè)計(jì)的角度來(lái)講:

Android的Activity的設(shè)計(jì)與Web頁(yè)面非常類(lèi)似,從頁(yè)面的跳轉(zhuǎn)通過(guò)連接,以及從頁(yè)面的定位通過(guò)URL,從每個(gè)頁(yè)面的獨(dú)立封裝等方面都可以看出來(lái),它主要負(fù)責(zé)與用戶(hù)進(jìn)行交互。

Service則是在后臺(tái)運(yùn)行,默默地為用戶(hù)提供功能,進(jìn)行調(diào)度和統(tǒng)籌。如果一棵樹(shù)的地上部分是Activity的話(huà),它龐大的根須就是Service。Android的服務(wù)組件沒(méi)有運(yùn)行在獨(dú)立的進(jìn)程或線程中,它和其他的組件一樣也在應(yīng)用的主線程中運(yùn)行,如果服務(wù)組件執(zhí)行比較耗時(shí)的操作就會(huì)導(dǎo)致主線程阻塞或者假死,從而無(wú)法響應(yīng)用戶(hù)的操作。

因此,耗時(shí)的操作不要放在UI線程中,因?yàn)閁I 5S,廣播10s就阻塞了,會(huì)引發(fā)ANR。

②從使用的角度來(lái)講: 

Service不僅可以給Activity建立雙向連接,為Activity提供數(shù)據(jù)和功能支持,也可以單向接受Intent的請(qǐng)求,進(jìn)行數(shù)據(jù)的分析處理和功能調(diào)度。

③從扮演的角色來(lái)講:

Activity的功能比較單一,主要就是顯示應(yīng)用所具有的一些功能,幫助用戶(hù)與應(yīng)用進(jìn)行交互,像一個(gè)人的臉。而Service可能扮演功能調(diào)度者也能扮演功能提供者,從觸發(fā)器收集信息進(jìn)行分析和處理,然后更新界面,修改數(shù)據(jù)或進(jìn)行其他操作時(shí)是一個(gè)功能調(diào)度者,從輸入法的選擇考慮Service扮演的就是一個(gè)功能提供者。View組件是Android中用戶(hù)能夠?qū)崒?shí)在在看到的部分,如按鈕,輸入框等就是繼承自這個(gè)類(lèi),View只有裝入Activity這樣的容器中才有意義,而反過(guò)來(lái)Activity裝入了這些View后才能夠成功完成與用戶(hù)交互的任務(wù),但是Service不需要這些花哨的東西,只需要默默地等待事件發(fā)生或者聽(tīng)候差遣。

Android啟動(dòng)Service有兩種方法,一種是startService,一種是bindService。生命周期如下:

執(zhí)行startService時(shí),調(diào)用者如果沒(méi)有stopService,Service會(huì)一直在后臺(tái)運(yùn)行。多次調(diào)用startService,該Service只能被創(chuàng)建一次,即該Service的onCreate方法只會(huì)被調(diào)用一次。但是每次調(diào)用startService,onStartCommand方法都會(huì)被調(diào)用。

執(zhí)行bindService時(shí),調(diào)用者調(diào)用unbindService方法或者調(diào)用者Context不存在了(如Activity被finish了)。第一次執(zhí)行bindService時(shí),onCreate和onBind方法會(huì)被調(diào)用,但是多次執(zhí)行bindService時(shí),onCreate和onBind方法并不會(huì)被多次調(diào)用,即并不會(huì)多次創(chuàng)建服務(wù)和綁定服務(wù)。 多個(gè)組件可以同時(shí)綁定到該服務(wù),但全部取消綁定后,該服務(wù)即會(huì)被銷(xiāo)毀。

既使用startService又使用bindService的情況,需要unbindService和stopService同時(shí)調(diào)用才會(huì)終止Service。

Activity與Service交互有兩種方法:一種是使用broadcast,另一種是使用bindService。本文只介紹bindService方法。

public class MsgService extends Service {
  public MsgService() {
  }

  /**
   * 進(jìn)度條的最大值
   */
  public static final int MAX_PROGRESS = 100;
  /**
   * 進(jìn)度條的進(jìn)度值
   */
  private int progress = 0;

  /**
   * 增加get()方法,供Activity調(diào)用
   *
   * @return 下載進(jìn)度
   */
  public int getProgress() {
    return progress;
  }

  /**
   * 模擬下載任務(wù),每秒鐘更新一次
   */
  public void startDownLoad(){
    new Thread(new Runnable() {

      @Override
      public void run() {
        while(progress < MAX_PROGRESS){
          progress += 5;

          //進(jìn)度發(fā)生變化通知調(diào)用方
          if(onProgressListener != null){
            onProgressListener.onProgress(progress);
          }

          try {
            Thread.sleep(1000);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }

        }
      }
    }).start();
  }

  @Override
  public IBinder onBind(Intent intent) {
    return new MyBinder();
  }

  public class MyBinder extends Binder {
    public MsgService getService() {
      return MsgService.this;
    }
  }

  public interface OnProgressListener {
    void onProgress(int progress);
  }

  /**
   * 更新進(jìn)度的回調(diào)接口
   */
  private OnProgressListener onProgressListener;


  /**
   * 注冊(cè)回調(diào)接口的方法,供外部調(diào)用
   *
   * @param onProgressListener
   */
  public void setOnProgressListener(OnProgressListener onProgressListener) {
    this.onProgressListener = onProgressListener;
  }

}
public class MainActivity extends Activity {

  private Button button19;

  private MsgService msgService;
  private int progress = 0;
  private ProgressBar mProgressBar;


  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

 


    btnExec = (Button) findViewById(R.id.btnExec);
    button19 = (Button) findViewById(R.id.button19);
    mProgressBar = (ProgressBar) findViewById(R.id.progressBar);


    button19.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        msgService.startDownLoad();
      }
    });

    Intent intent = new Intent(this, MsgService.class);
    bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);

 

  }

 

 

  ServiceConnection mServiceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
      msgService = ((MsgService.MyBinder) iBinder).getService();

      msgService.setOnProgressListener(new MsgService.OnProgressListener() {
        @Override
        public void onProgress(int progress) {
          mProgressBar.setProgress(progress);
        }
      });
    }

    @Override
    public void onServiceDisconnected(ComponentName componentName) {

    }
  };


  @Override
  protected void onDestroy() {

    unbindService(mServiceConnection);
    super.onDestroy();
  }
}

例子中,MsgService模擬耗時(shí)的下載任務(wù),MainActivity 綁定服務(wù),通過(guò)注冊(cè)O(shè)nProgressListener回調(diào)獲取下載進(jìn)度,更新進(jìn)度條。

本例子Activity和Service是在同一個(gè)進(jìn)程中,對(duì)于跨進(jìn)程調(diào)用Service需要使用到AIDL技術(shù)。

 感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

最新評(píng)論