Activity与Service之间的通讯机制

本文详细介绍了Android中Activity与Service之间的通讯机制,包括Activity如何将数据传递给Service,Service如何回传数据给Activity,以及如何在进程内和进程间调用Service的方法。重点讲解了AIDL和Messenger两种主要的IPC方式,提供了具体代码示例,帮助开发者理解并实现在不同场景下的Service通信。
摘要由CSDN通过智能技术生成

Activity传递数据给Service

Intent中直接传递数据。

Intent intent = new Intent(“com.service”);
intent.putExtra(“data”, "helloData");
startService(intent);

Service回传数据给Activity

应用场景举例:有一个Service,它在另外一个线程中实现了一个计数器服务,每隔一秒钟就自动加1,然后将结果不断地反馈给应用程序中的界面线程,而界面线程中的Activity在得到这个反馈后,就会把结果显示在界面上。

方法一:service在数据发生变化的时候发送一条广播,在Activity注册广播接收器,接收到广播之后获取数据更新UI。

MainActivity 核心代码:

public class MainActivity extends Activity implements OnClickListener {
   
    private final static String LOG_TAG = "shy.luo.broadcast.MainActivity";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 绑定服务
        Intent bindIntent = new Intent(MainActivity.this, CounterService.class);
        bindService(bindIntent, serviceConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    public void onResume() {
        super.onResume();
        // 注册广播
        IntentFilter counterActionFilter = new IntentFilter(
                CounterService.BROADCAST_COUNTER_ACTION);
        registerReceiver(counterActionReceiver, counterActionFilter);
    }

    private BroadcastReceiver counterActionReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            int counter = intent.getIntExtra(CounterService.COUNTER_VALUE, 0);
            String text = String.valueOf(counter);
            // 接收数据更新界面
            counterText.setText(text);
        }
    };

    private ServiceConnection serviceConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            counterService = ((CounterService.CounterBinder) service)
                    .getService();
        }

        public void onServiceDisconnected(ComponentName className) {
            counterService = null;
        }
    };
}

CounterService核心代码:

public class CounterService extends Service implements ICounterService {
   

    public final static String BROADCAST_COUNTER_ACTION = "shy.luo.broadcast.COUNTER_ACTION";
    public final static String COUNTER_VALUE = "shy.luo.broadcast.counter.value";
    private boolean stop = false;

    ...

    public void startCounter(int initVal) {
        AsyncTask<Integer, Integer, Integer> task = new AsyncTask<Integer, Integer, Integer>() {
            @Override
            protected Integer doInBackground(Integer... vals) {
                Integer initCounter = vals[0];

                stop = false;
                while (!stop) {
                    publishProgress(initCounter);

                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    initCounter++;
                }

                return initCounter;
            }

            @Override
            protected void onProgressUpdate(Integer... values) {
                super.onProgressUpdate(values);

                int counter = values[0];

                Intent intent = new Intent(BROADCAST_COUNTER_ACTION);
                intent.putExtra(COUNTER_VALUE, counter);

                sendBroadcast(intent);
            }

            @Override
            protected void onPostExecute(Integer val) {
                int counter = val;

                Intent intent = new Intent(BROADCAST_COUNTER_ACTION);
                intent.putExtra(COUNTER_VALUE, counter);

                sendBroadcast(intent);
            }

        };

        task.execute(0);
    }
    ...
}

方法二:注册回调接口,数据发生变化的时候Service主动通知Activity,Activity就可以接收数据更新UI了。

MainActivity 核心代码:

public class MainActivity extends Activity implements OnClickListener {
   
    private final static String LOG_TAG = "shy.luo.broadcast.MainActivity";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Intent bindIntent = new Intent(MainActivity.this, CounterService.class);
        bindService(bindIntent, serviceConnection, Context.BIND_AUTO_CREATE);
    }

    private ServiceConnection serviceConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            counterService = ((CounterService.CounterBinder) service)
                    .getService();
            // 注册监听
            counterService.setOnProgressListener(new OnProgressListener() {  

                @Override  
                public void onProgress(int progress) {  
                    counterText.setText(progress);  
                }  
            });  
        }

        public void onServiceDisconnected(ComponentName className) {
            counterService = null;
        }
    };
}

CounterService 核心代码:

public class CounterService extends Service implements ICounterService {
   

    public final static String BROADCAST_COUNTER_ACTION = "shy.luo.broadcast.COUNTER_ACTION";
    public final static String COUNTER_VALUE = "shy.luo.broadcast.counter.value";
    private boolean stop = false;

    ...

    /** 
     * 更新数据的回调接口 
     */  
    private OnProgressListener onProgressListener;  

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值