Emular el botón Atrás con superposición en Android

Tengo un dispositivo Android con raíces y quiero reemplazar las teclas programables con una superposición propia. Esto funciona con la "pantalla completa" de la aplicación, pero quiero hacerlo en mi propia aplicación. Busqué y encontré algunas preguntas aquí pero no había respuestas a ellas.

Me di cuenta de cómo hacerlo con el shell, pero es muy lento, "pantalla completa" tiene un rendimiento mucho mejor.

Mi servicio con el comando shell se ve así:

public class MainService extends Service { ButtonView mView; @Override public void onCreate() { super.onCreate(); final Bitmap BckBtn = BitmapFactory.decodeResource(getResources(), R.drawable.back); WindowManager.LayoutParams params = new WindowManager.LayoutParams( BckBtn.getWidth(), BckBtn.getHeight(), WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT); params.gravity = Gravity.LEFT | Gravity.BOTTOM; WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); mView = new ButtonView(this,BckBtn); mView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View arg0, MotionEvent arg1) { if(arg1.getX()<BckBtn.getWidth() & arg1.getY()>0) { Process process = null; try { process = Runtime.getRuntime().exec("su"); } catch (IOException e) { e.printStackTrace(); } OutputStream outputStream = process.getOutputStream(); String cmd = "input keyevent 4"; try { outputStream.write((cmd + "\n").getBytes("ASCII")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } return false; } }); wm.addView(mView, params); } @Override public IBinder onBind(Intent arg0) { return null; } } @SuppressLint("DrawAllocation") class ButtonView extends ViewGroup { Bitmap BckBtn; public ButtonView(Context context,Bitmap BckBtn) { super(context); this.BckBtn=BckBtn; } protected void onDraw(Canvas canvas) { canvas.drawBitmap(BckBtn,0 , 0, null); } protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) { } public boolean onTouchEvent(MotionEvent event) { return true; } } 

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.