java和activity_main交互,Android中使用aidl进行跨进程通信(server和activity)交互_赵克立博客_技术栈...

题目详情

1、实现一个activity和一个service,它们在不同的进程

2、service每隔3-5秒钟产生10条数据(10个数字,每个数字随即为1-100),然后发送给activity

3、并且activity用listview显示这些数据

思路

实现两个aidl接口,一个用于通知service产生数据,一个用于 service 通知activity更新数据

效果图

73092de7986d547a380172bfc7345304.png

代码

两个aidl文件如下:

IGetData.aidlimport com.ank.wx.IClientCallBack;

// Declare any non-default types here with import statements

interface IGetData {

/**

* Demonstrates some basic types that you can use as parameters

* and return values in AIDL.

*/

void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,

double aDouble, String aString);

void register(IClientCallBack callback);

void startCreateData();

}

IClientCallBack.aidl// Declare any non-default types here with import statements

interface IClientCallBack {

/**

* Demonstrates some basic types that you can use as parameters

* and return values in AIDL.

*/

void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,

double aDouble, String aString);

void update(in List arrayList);

}

DataSourceService.javapublic class DataSourceService extends Service {

volatile boolean needToRun;    public DataSourceService() {

}    @Override

public IBinder onBind(Intent intent) {        return  binder;

}    @Override

public boolean onUnbind(Intent intent) {

needToRun=false;        return super.onUnbind(intent);

}

IGetData.Stub binder=new IGetData.Stub() {

IClientCallBack callBack;        @Override

public void register(IClientCallBack callback) throws RemoteException {            this.callBack=callback;

}        @Override

public void startCreateData() throws RemoteException {

needToRun=true;            final ArrayList arrayList=new ArrayList<>();

Thread thread=new Thread(new Runnable() {                @Override

public void run() {                    int interval;                    while (needToRun){

arrayList.clear();

interval=3+  (int)(Math.random()*3);

Log.i("time",""+interval);                        try {

Thread.sleep(interval*1000);

} catch (InterruptedException e) {

e.printStackTrace();

}                        for(int i=0;i<10;i++){

Random random=new Random();

arrayList.add((int)(random.nextInt(100))+"");

}                        if (callBack!=null)                            try {                                //数据推送到客户端(Activity)

callBack.update(arrayList);

} catch (RemoteException e) {

e.printStackTrace();

}

}

}

});

thread.start();

}

};

}

MainActivity.javapublic class MainActivity extends AppCompatActivity {

ListView lvNumber;

IGetData iGetData;

ArrayAdapter adapter;

ArrayList stringList;

Intent intent;

ServiceConnection connection=new ServiceConnection() {        @Override

public void onServiceConnected(ComponentName name, IBinder service) {

iGetData=IGetData.Stub.asInterface(service);            try {

iGetData.register(new IClientCallBack.Stub(){                    @Override

public void update(List arrayList) throws RemoteException {

Message message=new Message();

message.obj=arrayList;

handler.sendMessage(message);

}

});

iGetData.startCreateData();

} catch (RemoteException e) {

e.printStackTrace();

}

}        @Override

public void onServiceDisconnected(ComponentName name) {

}

};

Handler handler=new  UpDataHandler(MainActivity.this);    static class UpDataHandler extends Handler{

WeakReference weakReference;

UpDataHandler(Activity activity){

weakReference=new WeakReference(activity);

}        @Override

public void handleMessage(Message msg) {            super.handleMessage(msg);

MainActivity activity= (MainActivity) weakReference.get();            if(activity!=null) {

activity.stringList.clear();

activity.stringList.addAll((ArrayList) msg.obj);

activity.adapter.notifyDataSetChanged();

}

}

}    @Override

protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

lvNumber= (ListView) findViewById(R.id.lvNumber);

stringList=new ArrayList<>();

stringList.add("1");

stringList.add("2");

stringList.add("3");

adapter=new ArrayAdapter(this,R.layout.support_simple_spinner_dropdown_item,stringList);

lvNumber.setAdapter(adapter);

intent=new Intent(MainActivity.this,DataSourceService.class);

bindService(intent,connection, Context.BIND_AUTO_CREATE);

}    @Override

protected void onPause() {        super.onPause();

unbindService(connection);

stopService(intent);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值