①从设计的角度来讲:

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技术。

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多相关文章

  1. ANDROID+SQLITE详解2
  2. Android(安卓)Studio导入Project、Module的正确方法
  3. 传智播客—Android(三)数据存储之XML解析技术
  4. 第10章 后台默默地劳动者----------探究服务android
  5. Android(安卓)ListView同一个item显示2列的实现方法(仿2列商品列
  6. Android-小巫新闻客户端底部菜单切换实现
  7. 基础总结篇之四:Service完全解析
  8. Android透明状态栏——你要的只是几个方法
  9. Android,java,xml,xml读取与保存,基于Android(安卓)XML解析与保

随机推荐

  1. react-native开发实例之android发布签名
  2. AsyncTask进度条加载网站数据到ListView
  3. Android中的三种提示方式
  4. Android客制化adb shell进去后显示shell@
  5. Android(安卓)时间更新机制之网络更新时
  6. Android(安卓)BLE蓝牙开发中读取数据时设
  7. Android系统移植-按键移植
  8. Android(安卓)上调试 webkit framework
  9. 2.4 ImageView
  10. android转屏,切换屏幕,横竖屏(onConfigurati