由于前面的文章已经提供过如何自定义接口,这里就不在赘述了,只提最重要的几步,在frameworks/base/core/java/android/app/customized/ICustomizedService.aidl中定义controlNavigationBarVisibility接口,
package android.app.customized;
interface ICustomizedService{
void controlNavigationBarVisibility(boolean isControl);
}
在frameworks/base/core/java/android/app/customized/CustomizedManager.java中定义接口
package android.app.customized;
import android.util.Log;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.RemoteException;
import android.provider.Settings;
import java.io.IOException;
import android.os.ServiceManager;
import android.os.IBinder;
import java.util.List;
import android.app.ActivityManager;
import android.graphics.Bitmap;
public class CustomizedManager{
private static final String TAG="CustomizedManager";
private static final boolean DBG=true;
private static ICustomizedService mService;
private final Context mContext;
public CustomizedManager(Context context){
mContext = context;
mService = ICustomizedService.Stub.asInterface(
ServiceManager.getService("customized"));
}
private static ICustomizedService getService(){
if (mService != null) {
return mService;
}
IBinder b = ServiceManager.getService("customized");
mService = ICustomizedService.Stub.asInterface(b);
return mService;
}
public void controlNavigationBarVisibility(boolean isCotrol){
ICustomizedService service = getService();
try {
service.controlNavigationBarVisibility(isControl);
} catch (RemoteException e) {}
}
}
在frameworks/base/services/core/java/com/android/server/customized/CustomizedService.java中实现这个接口
controlNavigationBarVisibility(boolean isControl),代码如下:
public void controlNavigationBarVisibility(boolean isControl){
long jh = Binder.clearCallingIdentity();
Intent i = new Intent();
if(isControl){
i.setAction("com.azt.hidebar");
}else{
i.setAction("com.azt.unhidebar");
}
mContext.sendBroadcast(i);
Binder.restoreCallingIdentity(jh);
}
在frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java接收广播
首先在PhoneWindowManager的init方法中加入
IntentFilter filter = new IntentFilter();
filter.addAction("com.azt.hidebar");
filter.addAction("com.azt.unhidebar"); //IntentFilter加进去
Intent intent = context.registerReceiver(mDockReceiver, filter);
然后去mDockReceiver中对收到intent后进行处理
BroadcastReceiver mDockReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("com.azt.hidebar")) {
mStatusBarHeight =0;
// Height of the navigation bar when presented horizontally at bottom
mNavigationBarHeightForRotation[mPortraitRotation] = 0;
mNavigationBarHeightForRotation[mUpsideDownRotation] = 0;
mNavigationBarHeightForRotation[mLandscapeRotation] = 0;
mNavigationBarHeightForRotation[mSeascapeRotation] = 0;
// Width of the navigation bar when presented vertically along one side
mNavigationBarWidthForRotation[mPortraitRotation] = 0;
mNavigationBarWidthForRotation[mUpsideDownRotation] = 0;
mNavigationBarWidthForRotation[mLandscapeRotation] = 0;
mNavigationBarWidthForRotation[mSeascapeRotation] = 0;
} else if (intent.getAction().equals("com.azt.unhidebar")) {//gaodz add
// Height of the navigation bar when presented horizontally at bottom
mNavigationBarHeightForRotation[mPortraitRotation] =
mNavigationBarHeightForRotation[mUpsideDownRotation] =
mContext.getResources().getDimensionPixelSize(com.android.internal.R.dimen.navigation_bar_height);
mNavigationBarHeightForRotation[mLandscapeRotation] =
mNavigationBarHeightForRotation[mSeascapeRotation] = mContext.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.navigation_bar_height_landscape);
// Width of the navigation bar when presented vertically along one side
mNavigationBarWidthForRotation[mPortraitRotation] =
mNavigationBarWidthForRotation[mUpsideDownRotation] =
mNavigationBarWidthForRotation[mLandscapeRotation] =
mNavigationBarWidthForRotation[mSeascapeRotation] =
mContext.getResources().getDimensionPixelSize(com.android.internal.R.dimen.navigation_bar_width);
}
}