Activity和Service交互之bindService(回调更新UI)

一.回调接口

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

二.Service代码

public class MyService extends Service {

    private int progress = 0;
    private OnProgressListener onProgressListener;

    class DownLoadBinder extends Binder{
        public MyService getService(){
            return MyService.this;
        }
    }

    // 设置回调接口
    public void setOnProgressListener(OnProgressListener onProgressListener){
        this.onProgressListener = onProgressListener;
    }

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

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    // 模拟下载
    public  void startDownload(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (progress<100){
                    progress += 10;
                    // 通知调用方
                    if( onProgressListener != null  ){
                        onProgressListener.onProgress(progress);
                    }
                    try {
                        Thread.sleep(1000);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }

    // 获取progress
    public int getProgress(){
        return progress;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e("Service", "onDestroy");
    }
}

三.Activity关键代码:

public class MainActivity extends Activity {

    private ProgressBar progressBar;
    private MyService myService;
    private int progress = 0;

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

        progressBar = (ProgressBar)findViewById(R.id.progressBar);

        Intent intent = new Intent(this, MyService.class);
        // 标志位BIND_AUTO_CREATE是的服务中onCreate得到执行,onStartCommand不会执行
        bindService(intent,conn, Context.BIND_AUTO_CREATE);
    }

    protected void myClick(View v){
        if( v.getId() == R.id.btn ){
            myService.startDownload();
        }

        if( v.getId() == R.id.btn2 ){
            unbindService(conn);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onStop() {
        super.onStop();
    }

    @Override
    protected void onDestroy() {
    unbindService(conn);
        super.onDestroy();
    }

    ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myService = ((MyService.DownLoadBinder)service).getService();

            // 回调接口
            myService.setOnProgressListener(new OnProgressListener() {
                @Override
                public void onProgress(int progress) {
                    progressBar.setProgress(progress);
                }
            });
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
}
时间: 2024-10-12 19:33:29

Activity和Service交互之bindService(回调更新UI)的相关文章

Android四大组件应用系列——Activity与Service交互实现APK下载

Servic与Activity相比它没有界面,主要是在后台执行一些任务,Service有两种启动方法startService()和bindService(),startService方式Service不可交互,可一直在后台即便应用结束,bindService方式可通过ServiceConnection获得运行的Service实例的方式实现Activity和Service之间的交互,通常Activity退出则绑定的服务也就取消了.我们可以通过同时执行启动服务和绑定服务的方式实现Service交互同

Activity和Service交互

本人常用的三种,不足之处希望大家多多提出宝贵意见 第一种Handler: Activity import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.View.

Activity与Service交互(一)

方法一: 使用ASB模型 1.Activity启动Service 2.Service发送广播 3.在Activity上注册BroadcastReceiver接受广播 public class MainActivity extends Activity { TextView tv; MyReceiver receiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInsta

Activity与Service进行数据交互

Android启动Service有两种方法,一种是startService,一种是bindService.生命周期如下: 执行startService时,调用者如果没有stopService,Service会一直在后台运行.多次调用startService,该Service只能被创建一次,即该Service的onCreate方法只会被调用一次.但是每次调用startService,onStartCommand方法都会被调用. 执行bindService时,调用者调用unbindService方法

Service和广播联合更新UI的例子

sa111111 于 2010-11-19 10:56 发表在 [Android实例] [复制链接] [只看楼主] [上一主题] [下一主题] 在Android中,异步更新UI,通常我们会选用Handler启动线程,或者sendMessage的方式,那么利用Service和广播也可以更新UI的,例子如下: 我们建立一个Service: package com.andy import android.app.Service;//引入相关包 import android.content.Broadc

8.1.2 绑定Activity和Service

8.1.2 绑定Activity和Service 2010-06-21 16:57 李宁 中国水利水电出版社 字号:T | T <Android/OPhone开发完全讲义>第8章Android服务,本章主要介绍了Android系统 中的服务(Service)技术.Service是Android中4个应用程序组件之一.在Android系统内部提供了很多的系统服务,通过这些系统 服务,可以实现更为复杂的功能,例如,监听来电.重力感应等.本节为大家介绍绑定Activity和Service. AD:

android activity和service的交互介绍

android开发中,作为4大组件的service在开发中经常会使用到.很多时候,我们的activity和service之间需要进行相应的交互,activity需要调用service里面的方法实现某些功能,service需要调用activity的方法,实现界面更新等的交互. 实现2者之间相互交互的主要方式是:service中有个类部类继承Binder,然后提供一个公有方法,返回当前service的实例. activity通过bindService来开启一个service,service通过onB

Android 四大组件(Activity、Service、BroadCastReceiver、ContentProvider)

转载于:http://blog.csdn.net/byxdaz/article/details/9708491 http://blog.csdn.net/q876266464/article/details/19641251 Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,Broadcast Receiver广播接收器. 一.了解四大基本组件 Activity : 应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以

Activity与Service的那些事

服务作为Android的四大组件之一,它并不像Activity那样高调(使用频繁),它就是那个默默无闻的工作者. 由于不怎么用到,所以关于它的使用很容易忘记,现在有空就将它记录下来,方便后期查看.        服务(Service)是Android中实现程序后台运行的解决方案,它非常适合用于去执行那些不需要和用户交互而且还要求长期运行的任务.服务的运行不依赖于任何用户界面,即使当程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行. 不过需要注意的是,服务并不是运行在一个