国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android Activity 與Service進行數據交互詳解

2019-12-12 05:04:14
字體:
來源:轉載
供稿:網友

①從設計的角度來講:

Android的Activity的設計與Web頁面非常類似,從頁面的跳轉通過連接,以及從頁面的定位通過URL,從每個頁面的獨立封裝等方面都可以看出來,它主要負責與用戶進行交互。

Service則是在后臺運行,默默地為用戶提供功能,進行調度和統籌。如果一棵樹的地上部分是Activity的話,它龐大的根須就是Service。Android的服務組件沒有運行在獨立的進程或線程中,它和其他的組件一樣也在應用的主線程中運行,如果服務組件執行比較耗時的操作就會導致主線程阻塞或者假死,從而無法響應用戶的操作。

因此,耗時的操作不要放在UI線程中,因為UI 5S,廣播10s就阻塞了,會引發ANR。

②從使用的角度來講: 

Service不僅可以給Activity建立雙向連接,為Activity提供數據和功能支持,也可以單向接受Intent的請求,進行數據的分析處理和功能調度。

③從扮演的角色來講:

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

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

執行startService時,調用者如果沒有stopService,Service會一直在后臺運行。多次調用startService,該Service只能被創建一次,即該Service的onCreate方法只會被調用一次。但是每次調用startService,onStartCommand方法都會被調用。

執行bindService時,調用者調用unbindService方法或者調用者Context不存在了(如Activity被finish了)。第一次執行bindService時,onCreate和onBind方法會被調用,但是多次執行bindService時,onCreate和onBind方法并不會被多次調用,即并不會多次創建服務和綁定服務。 多個組件可以同時綁定到該服務,但全部取消綁定后,該服務即會被銷毀。

既使用startService又使用bindService的情況,需要unbindService和stopService同時調用才會終止Service。

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

public class MsgService extends Service {  public MsgService() {  }  /**   * 進度條的最大值   */  public static final int MAX_PROGRESS = 100;  /**   * 進度條的進度值   */  private int progress = 0;  /**   * 增加get()方法,供Activity調用   *   * @return 下載進度   */  public int getProgress() {    return progress;  }  /**   * 模擬下載任務,每秒鐘更新一次   */  public void startDownLoad(){    new Thread(new Runnable() {      @Override      public void run() {        while(progress < MAX_PROGRESS){          progress += 5;          //進度發生變化通知調用方          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);  }  /**   * 更新進度的回調接口   */  private OnProgressListener onProgressListener;  /**   * 注冊回調接口的方法,供外部調用   *   * @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模擬耗時的下載任務,MainActivity 綁定服務,通過注冊OnProgressListener回調獲取下載進度,更新進度條。

本例子Activity和Service是在同一個進程中,對于跨進程調用Service需要使用到AIDL技術。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿图什市| 肇东市| 永平县| 永兴县| 中西区| 丰镇市| 昂仁县| 泰兴市| 普宁市| 青州市| 仲巴县| 双桥区| 宁陕县| 巴林右旗| 望江县| 永嘉县| 贡山| 香格里拉县| 德保县| 黎城县| 达州市| 明光市| 宁南县| 金溪县| 东兴市| 乌苏市| 永福县| 四会市| 彭阳县| 宣武区| 陆川县| 博兴县| 乌海市| 东丽区| 丘北县| 昌宁县| 闻喜县| 昌邑市| 东台市| 甘南县| 远安县|