Activity与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方法。

 1 public class MsgService extends Service {
 2     public MsgService() {
 3     }
 4
 5     /**
 6      * 进度条的最大值
 7      */
 8     public static final int MAX_PROGRESS = 100;
 9     /**
10      * 进度条的进度值
11      */
12     private int progress = 0;
13
14     /**
15      * 增加get()方法,供Activity调用
16      *
17      * @return 下载进度
18      */
19     public int getProgress() {
20         return progress;
21     }
22
23     /**
24      * 模拟下载任务,每秒钟更新一次
25      */
26     public void startDownLoad(){
27         new Thread(new Runnable() {
28
29             @Override
30             public void run() {
31                 while(progress < MAX_PROGRESS){
32                     progress += 5;
33
34                     //进度发生变化通知调用方
35                     if(onProgressListener != null){
36                         onProgressListener.onProgress(progress);
37                     }
38
39                     try {
40                         Thread.sleep(1000);
41                     } catch (InterruptedException e) {
42                         e.printStackTrace();
43                     }
44
45                 }
46             }
47         }).start();
48     }
49
50     @Override
51     public IBinder onBind(Intent intent) {
52         return new MyBinder();
53     }
54
55     public class MyBinder extends Binder {
56         public MsgService getService() {
57             return MsgService.this;
58         }
59     }
60
61     public interface OnProgressListener {
62         void onProgress(int progress);
63     }
64
65     /**
66      * 更新进度的回调接口
67      */
68     private OnProgressListener onProgressListener;
69
70
71     /**
72      * 注册回调接口的方法,供外部调用
73      *
74      * @param onProgressListener
75      */
76     public void setOnProgressListener(OnProgressListener onProgressListener) {
77         this.onProgressListener = onProgressListener;
78     }
79
80 }
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技术。

时间: 2024-08-03 20:05:21

Activity与Service进行数据交互的相关文章

Android Studio开发基础之启动Service,并通过从Activity向Service传递数据

本实例演示启动Service,并通过从Activity向Service传递数据,新建一个Service,并敲如下代码: package com.example.lhb.startservice; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.view.ViewDebug; import android.widget.Toast; public

activity通过onActivityResult间数据交互

首先要创建2个activity 分别为MainActivity和OneActiivity MainActivity代码如下: package com.tp.soft.app; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View

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

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

Android基础笔记(十一)- Service基础和注意事项以及Activity与Service的通信

Service的基本概念 为什么要有Service Service的基本用法 电话窃听器的小案例 Service和Activity通信 Service和Thread的关系 向光明而行! Service的基本概念 Service是Android的四大组件之一,在每一个应用程序中都扮演者非常重要的角色. 它主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务.必要的时候,我们甚至可以在程序退出的情况下,让Service在后台继续保持运行状态. 既然都是被用于处理耗时的操作,那么我们什么

(Android数据传递)Service和Activity之间-- 借助BroadcastReceiver--的数据传递

实现逻辑如下: 左侧为Activity中的执行逻辑,右侧为Service中的执行逻辑: /** * <功能描述> Service和Activity之间的数据交互:具体表现为: 1. 从Service获取数据源,传递到Activity中: 2. * 在Activity中作数据更新: 3. Service中的onCreate()在UI线程中执行,作延时需要在子线程中执行: * * @author Administrator */ public class MainActivity extends

Android情景案例——Activity与Service通讯交互

前两天去面试,遇到这个知识点,感觉组织的不是很清晰,所以事后梳理下逻辑. 一.案例情景 在service中开启一个下载任务,然后在activity中显示下载进度,如何实现? 分析: 这里考察的就是Service如何与Activity进行交互,我们知道开启一个Service服务有两种方法,startService().bindService().第一种方法我们直接开启Service进行使用,没有与它进行交互处理.所以我们只有通过bindService()方法然后借助Binder进行数据交互. 方案

android实现两个activity数据交互

android如何实现两个Activity数据交互?主要是根据Intent的携带功能,intent可以携带很多信息,比如Bundle,URI甚至对象(此时要序列化,并且对象里面的成员变量如果是对象,也要序列化),实现的具体代码如下: package com.example.yzj.android_8_3; import android.content.Intent; import android.net.Uri; import android.support.v7.app.AppCompatAc

android activity和service的交互介绍

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

Android进阶之Fragment与Activity之间的数据交互

1 为什么 因为Fragment和Activity一样是具有生命周期,不是一般的bean通过构造函数传值,会造成异常. 2 Activity把值传递给Fragment 2.1 第一种方式,也是最常用的方式,就是使用Bundle来传递参数 (1)宿主Activity/FragmentAdapter中: Bundle bundle = new Bundle(); bundle.putString(Constant.INTENT_ID, productId); Fragment fragment =