AIDL的定义
- aidl是Android interface definition Language 的英文缩写,意思Android 接口定义语言。
- 使用aidl可以帮助我们发布以及调用远程服务,实现跨进程通信。
- 将服务的aidl放到对应的src目录,工程的gen目录会生成相应的接口类
RemoteViews执行流程:
- RemoteViews通过Binder传递至SystemServer进程(因为RemoteViews实现了Parcelable接口,因此它可以跨进程传输)
- 系统根据RemoteViews中的packageName, layoutId去得到该应用的资源,之后通过LayoutInflater去加载RemoteViews中的布局文件
先定义一个IRemoteViewsManager.aidl文件,rebuild会自动生成对应的java文件
// IRemoteViewsManager.aidl
package com.kawa.qkplug;
// Declare any non-default types here with import statements
interface IRemoteViewsManager {
void addRemoteView(in RemoteViews remoteViews);
void isShowView();
}
之后设置服务进行监听,通过回调进行相应进程的Ui处理
package com.kawa.qkplug.service;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException;
import android.widget.RemoteViews;
import com.kawa.qkplug.IRemoteViewsManager;
import com.kawa.qkplug.ui.MainActivity;
public class RemoteAIDLService extends Service {
private Binder remoteViewBinder = new IRemoteViewsManager.Stub() {
@Override
public void addRemoteView(RemoteViews remoteViews) throws RemoteException {
Message message = new Message();
message.what = 1;
Bundle bundle = new Bundle();
bundle.putParcelable("remoteViews", remoteViews);
message.setData(bundle);
new MainActivity.ViewHandler(RemoteAIDLService.this, getMainLooper()).sendMessage(message);
}
@Override
public void isShowView() throws RemoteException {
Message message = new Message();
message.what = 4;
new MainActivity.ViewHandler(RemoteAIDLService.this, getMainLooper()).sendMessage(message);
}
};
public RemoteAIDLService() {
}
@Override
public IBinder onBind(Intent intent) {
return remoteViewBinder;
}
}
绑定服务方式:
Intent viewService = new Intent(this, ViewAIDLService.class);
bindService(viewService, serviceConnection2, Context.BIND_AUTO_CREATE);
监听服务的连接状态
private ServiceConnection serviceConnection2 = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
remoteViewsManager = IRemoteViewsManager.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
remoteViewsManager = null;
}
};
处理Ui的添加更新显示
RemoteViews remoteViews = new RemoteViews(this.getPackageName(),R.layout.wg_button);
Intent intentClick = new Intent(TestAidlActivity.this,TestAidlActivity.class);
PendingIntent openMainActivity = PendingIntent.getActivity(TestAidlActivity.this,0,intentClick,0);
remoteViews.setOnClickPendingIntent(R.id.text,openMainActivity);
remoteViews.setCharSequence(R.id.text,"setText","two two");
try {
remoteViewsManager.addRemoteView(remoteViews);
remoteViewsManager.isShowView();
} catch (RemoteException e) {
e.printStackTrace();
}
UI更新处理页面:
public static class ViewHandler extends Handler {
WeakReference<Context> weakReference;
public ViewHandler(Context context, Looper looper) {
super(looper);
weakReference = new WeakReference<>(context);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
RemoteViews remoteViews = msg.getData().getParcelable("remoteViews");
if (remoteViews != null) {
Log.e("kawa", "更新Ui");
View view = remoteViews.apply(weakReference.get(), mLayout);
mLayout.addView(view);
}
break;
case 4:
mTextTip.setVisibility(mTextTip.getVisibility() == View.GONE ? View.VISIBLE : View.GONE);
break;
}
}
}