aidl ( 三) 后台service通知前台activity

本文介绍如何利用AIDL实现Android服务与活动之间的双向通信,详细阐述了服务端与客户端如何通过AIDL接口进行交互,包括服务主动通知活动的方法与步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

aidl ( 一 ) activity获取后台service数据文章中提到了,前台activity主动去获取后台service里的数据或者调用service里的方法。那么后台service是否可以主动通知前台activity呢?比如我后台在计时,我要把时间值显示在前台界面上。

当然可以了,还是aidl,得再写一个aidl,把回调设置到service内。

用到的module:aidlServer1,aidlClient1

要想后台service主动通知前台activity,至少要写2个aidl,2端各写一个stub,stub本质就是Binder,进一步可学习 http://blog.youkuaiyun.com/litefish/article/details/50557977

先写server端代码,主要是维护一个service,2个aidl

// IMyAidlInterface.aidl
package com.aidl.server;
import com.example.fish.aidlserver1.ICallback;
// Declare any non-default types here with import statements

interface IMyAidlInterface {
	int getCount();
	double complexCal(String str,int t);
	void setCallback(ICallback call);
}

// IAxx.aidl
package com.example.fish.aidlserver1;

// Declare any non-default types here with import statements
//service回调activity
interface ICallback {
   void showTime(int x);
}

service代码如下

package com.example.fish.aidlserver1;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

import com.aidl.server.IMyAidlInterface;
import com.fishlib.log.LogUtil;
import com.fishlib.util.system.SystemUtil;


public class MyService extends Service {
    private boolean quit;

    private Thread thread;
    private int count;

    @Override
    public void onCreate() {
        super.onCreate();
        LogUtil.thread("service main");
        String TAG="";
        LogUtil.d("onCreate process name " + SystemUtil.getCurProcessName(MyService.this));
        LogUtil.d( "Service is Created");
        thread = new Thread(new Runnable() {
            @Override
            public void run() {
                // 每间隔100ms count加1 ,直到quit为true
                while (!quit) {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    count++;
                    if(mCallback!=null)
                    {
                        LogUtil.d("callback");
                        try {
                            mCallback.showTime(count);
                        } catch (RemoteException e) {
                            e.printStackTrace();
                        }
                    }else
                    {
                        LogUtil.d("callback null");
                    }
                }
            }
        });
        thread.start();
    }

    @Override
    public void onDestroy() {
        LogUtil.d("onDestroy process name " + SystemUtil.getCurProcessName(MyService.this));
        quit=true;
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent) {
        LogUtil.d("onBind process name " + SystemUtil.getCurProcessName(MyService.this));
        return mBinder;
    }
    ICallback mCallback;
    IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub() {

        @Override
        public int getCount() throws RemoteException {
            return count;
        }

        @Override
        public double complexCal(String str, int t) throws RemoteException {
            int  ret=str.hashCode()+t;
            return ret*0.3;
        }

        @Override
        public void setCallback(ICallback call) throws RemoteException {
            LogUtil.d("setcallback"+call);
            LogUtil.thread("set callback");
            mCallback=call;

        }
    };

}



客户端代码

package com.example.fish.aidlclient1;

import android.app.Activity;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.aidl.server.IMyAidlInterface;
import com.example.fish.aidlserver1.ICallback;
import com.fishlib.log.LogUtil;
import com.fishlib.util.system.SystemUtil;

public class MainActivity extends Activity implements View.OnClickListener {


    private Button bindService;

    private Button unbindService;


    private IMyAidlInterface myAIDLInterface;
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            LogUtil.d("handleMessage");
            TextView tv = (TextView) findViewById(R.id.textView);
            tv.setText("" + msg.what);


        }
    };
    private ICallback callback = new ICallback.Stub() {
        @Override
        public void showTime(int x) throws RemoteException {
            LogUtil.d("callback" + x);
            LogUtil.process(getApplicationContext());
            LogUtil.thread("showTime");
            handler.sendEmptyMessage(x);
//
        }
    };

    private ServiceConnection connection = new ServiceConnection() {

        @Override
        public void onServiceDisconnected(ComponentName name) {
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            LogUtil.d("process name" + SystemUtil.getCurProcessName(MainActivity.this));
            myAIDLInterface = IMyAidlInterface.Stub.asInterface(service);
            LogUtil.thread("onServiceConnected");
            try {
                int cnt = myAIDLInterface.getCount();
                double db = myAIDLInterface.complexCal("hello world", 6);
                LogUtil.d("result is " + cnt);
                LogUtil.d("complexCal value " + db);

                myAIDLInterface.setCallback(callback);

//                myAIDLInterface.setCallback(new ICallback.Stub() {
//                    @Override
//                    public void showTime(int x) throws RemoteException {
//                        LogUtil.d("callback"+x);
////                        TextView tv = (TextView) findViewById(R.id.textView);
////                        tv.setText(""+x);
//                    }
//
//                    @Override
//                    public IBinder asBinder() {
//                        return null;
//                    }
//                });
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        LogUtil.thread("main");
        bindService = (Button) findViewById(R.id.bind_service);
        unbindService = (Button) findViewById(R.id.unbind_service);
        Button bv = (Button) findViewById(R.id.get_num);
        bv.setOnClickListener(this);
        bindService.setOnClickListener(this);
        unbindService.setOnClickListener(this);
        Intent intent = new Intent("com.example.servicetest.MyAIDLService");
        startService(intent);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bind_service:
                Intent intent = new Intent("com.example.servicetest.MyAIDLService");
                boolean b = bindService(intent, connection, Service.BIND_AUTO_CREATE);
                LogUtil.d("bind result " + b);
                break;
            case R.id.unbind_service:
                unbindService(connection);

                LogUtil.d("unbind ");
                break;
            default:
                break;
        }

    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        Intent intent = new Intent("com.example.servicetest.MyAIDLService");
        stopService(intent);
    }
}


这里用了2个aidl,其实可以合并成一个,可以参考Project:AidllikeYX, 我们的项目就是这么写的,2个进程互相发消息可以参考这个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值