ベストアンサー1
Toast やダイアログ ウィンドウなどの動作は次のとおりです。
追加または最前面に持ってくるだけでは機能しない場合、たとえば、サービスが別のクライアント アクティビティまたはアプリケーションに独自のビューを追加する場合 (FaceUnlock はこれを行います)、または階層に依存できない場合は、ウィンドウ マネージャーとウィンドウ トークンを使用する必要があります。その後、レイアウトを作成し、以前と同じようにアニメーションとハードウェア アクセラレーションを利用できます。
WindowManager windowManager = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.FIRST_SUB_WINDOW);
layoutParams.width = 300;
layoutParams.height = 300;
layoutParams.format = PixelFormat.RGBA_8888;
layoutParams.flags =
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
layoutParams.token = getWindow().getDecorView().getRootView().getWindowToken();
//Feel free to inflate here
mTestView = new View(this);
mTestView.setBackgroundColor(Color.RED);
//Must wire up back button, otherwise it's not sent to our activity
mTestView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
onBackPressed();
}
return true;
}
});
windowManager.addView(mTestView, layoutParams);
その後、onDestroy(またはonPause)でビューを削除してください。そうしないとクラッシュします。
if (mTestView != null) {
WindowManager windowManager = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE);
if (mTestView.isShown()) {
windowManager.removeViewImmediate(mTestView);
}
}