Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Android Activity 与Service进行数据交互详解大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

①从设计的角度来讲:

Android的Activity的设计与Web页面非常类似,从页面跳转通过连接,以及从页面的定位通过URL,从每个页面的独立封装等方面都可以看出来,它主要负责与用户进行交互。

service则是在后台运行,地为用户提供功能,进行调度和统筹。如果一棵树的地上部分是Activity的话,它庞大的根须就是service。Android的服务组件没有运行在独立的进程或线程中,它和其他的组件一样也在应用的主线程中运行,如果服务组件执行比较耗时的操作就会导致主线程阻塞或者假死,从而无法响应用户的操作。

因此,耗时的操作不要放在UI线程中,因为UI 5S,广播10s就阻塞了,会引发ANR。

②从使用的角度来讲: 

service不仅可以给Activity建立双向连接,为Activity提供数据和功能支持,也可以单向接受Intent的请求,进行数据的分析处理和功能调度。

③从扮演的角色来讲:

Activity的功能比较单一,主要就显示应用所具有的一些功能,帮助用户与应用进行交互,像一个人的脸。而service可能扮演功能调度者也能扮演功能提供者,从触发器收集信息进行分析和处理,然后更新界面,@L_616_22@数据或进行其他操作时是一个功能调度者,从输入法的选择service扮演的就是一个功能提供者。View组件是Android中用户能够实实在在看到的部分,如按钮,输入框等就是继承自这个类,View只有装入Activity这样的容器中才有意义,而反过来Activity装入了这些View后才能够成功完成与用户交互的任务,但是service不需要这些花哨的东西,只需要地等待事件发生或者听候差遣。

Android启动service有两种方法,一种是startservice,一种是bindservice。生命周期如下:

Android Activity 与Service进行数据交互详解

执行startservice时,@L_874_32@者如果没有stopservice,service会一直在后台运行。多次@L_874_32@startservice,该service只能被创建一次,即该service的onCreate方法只会被@L_874_32@一次。但是每次@L_874_32@startservice,onStartCommand方法都会被@L_874_32@。

执行bindservice时,@L_874_32@者@L_874_32@unbindservice方法或者@L_874_32@者Context不存在了(如Activity被finish了)。第一次执行bindservice时,onCreate和onBind方法会被@L_874_32@,但是多次执行bindservice时,onCreate和onBind方法并不会被多次@L_874_32@,即并不会多次创建服务和绑定服务。 多个组件可以同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。

既使用startservice又使用bindservice的情况,需要unbindservice和stopservice同时@L_874_32@才会终止service。

Activity与service交互有两种方法:一种是使用broadcast,另一种是使用bindservice。本文只介绍bindservice方法

@H_801_47@
public class Msgservice extends service {
  public Msgservice() {
  }

  /**
   * 进度条的最大值
   */
  public static final int MAX_PROGRESS = 100;
  /**
   * 进度条的进度值
   */
  privatE int progress = 0;

  /**
   * 增加get()方法,供Activity@L_874_32@
   *
   * @return 下载进度
   */
  public int getProgress() {
    return progress;
  }

  /**
   * 模拟下载任务,每秒钟更新一次
   */
  public void startDownLoad(){
    new Thread(new Runnable() {

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

          //进度发生变化通知@L_874_32@方
          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;


  /**
   * 注册回调接口的方法,供外部@L_874_32@
   *
   * @param onProgressListener
   */
  public void setOnProgressListener(OnProgressListener onProgressListener) {
    this.onProgressListener = onProgressListener;
  }

}
@H_801_47@
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是在同一个进程中,对于跨进程@L_874_32@service需要使用到AIDL技术。

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

大佬总结

以上是大佬教程为你收集整理的Android Activity 与Service进行数据交互详解全部内容,希望文章能够帮你解决Android Activity 与Service进行数据交互详解所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:数据交互
猜你在找的Android相关文章