얼마전 이런 질문이 있었습니다.
http://www.androidpub.com/1972014#comment_1972948
볼레로님이 다이얼로그에서 안된다고 하셨는데 실제 해보니 안되더군요
화면에 시작하자마자 띄워야 하는 상황이 생겼습니다.
onCraete에서만 3초를 잡아먹는 상황이 발생하였고 검은 화면을 막고자
로딩이미지를 띄워야 하는데 onReasume이 호출되지 않아서 어떻게 하던
검은화면을 막을수가 없었습니다.
해결방법으로는 쓰레드로 돌려서 onCreate를 빨리 벗어나는 방법이 있었는데
이렇게 해도 그다지...
그래서 버그성 어플을 만들어 버렸습니다.
액티비티보다 더 위에 있는 화면에 붙여 버려서 해결했습니다.
서피스 -> 액티비티 -> 윈도우 이렇게 있는데 윈도우에 붙여서 화면에 시작하자마자
스플레쉬 이미지를 띄우고 지우는 방법으로 해결했습니다.
잘되긴 하네요 문제가 있어서 그렇지..ㅠㅠ
최상위에 붙이면 다른 액티비티에 영향을 주는.. 악성억플이 되는 문제가 발생됩니다.
전 이거 해결하러 .....
private Class cls;
private Object windowManagerImpl;
private ImageView splash;
private void setSplash() {
splash = new ImageView(this);
splash.setImageResource(R.drawable.pudding800_480);
try {
// public static WindowManagerImpl getDefault()
cls = Class.forName("android.view.WindowManagerImpl");
Method getDefault = null;
getDefault = cls.getDeclaredMethod("getDefault", null);
if (!getDefault.isAccessible()) {
getDefault.setAccessible(true);
}
// windowManagerImpl = getDefault.invoke(cls.newInstance() , new Object[] {});
windowManagerImpl = getDefault.invoke(null, null);
} catch (Throwable e) {
}
final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.format = PixelFormat.TRANSLUCENT;
params.type = WindowManager.LayoutParams.TYPE_TOAST;
try {
Method addView = cls.getDeclaredMethod("addView", new Class[] { android.view.View.class,
android.view.ViewGroup.LayoutParams.class });
if (!addView.isAccessible()) {
addView.setAccessible(true);
}
addView.invoke(windowManagerImpl, new Object[] { splash, params });
} catch (Throwable e) {
System.err.println(e);
}
}
private void deleteSplash() {
Method removeView = null;
try {
removeView = cls.getDeclaredMethod("removeView", new Class[] { android.view.View.class });
if (!removeView.isAccessible()) {
removeView.setAccessible(true);
}
removeView.invoke(windowManagerImpl, new Object[] { splash });
} catch (Throwable e) {
}
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
}
}
말씀하신 내용이 광고가 아니라 스플래쉬 화면 띄우는 것이죠?
이전에 제가 찾아보니까
안드로이드 관련 스플래쉬화면 구현은 전부 가짜더라구요.
실제 작업부하가 많은 경우에 띄우는 것이 아니라,
화면만 띄우고 루프 걸거나 하는 식의 치팅이더라구요.
activity layout이 복잡해 지면 이거 띄우는 동안에도 검은색 화면이 나와서
구글검색해서 나오는 스플래쉬구현 예제는 전부 소용이 없었습니다.
setContentView() 여기서 오래 걸려서 그동안 화면이 검게 나온답니다.
그래서 그때 해결한 방법은
스플래쉬화면은 최대한 간단하게 activity로 만들어서 띄우고,
스플래쉬 activity에서 메인화면(activity)을 호출해 주도록 만들었답니다.
수고하세요!
MS 윈도우 환경에서는 Main window는 그대로 메인이고,
스플래쉬만 만들어서 Main 쪽에서 띄우면서 들어갈 수 있거든요.
그래서 인지,
안드로이드쪽도 예제 소스 찾아보면,
전부 Main Activity에서 스플래쉬 띄워놓고, 루프돌리다가 닫아주더라구요.
이렇게 해도 layout 복잡하면, Main activity 의 onCreate에서 검은화면 떠 버려서 소용이 없더라구요.
스플래쉬 activity를 먼저 띄우는 것은 이것이 Main(?) 또는 Launch activity가 되어 버려서
구조상은 별로 보기에 안 좋죠 ^^
안드로이드 개발자는 개고생 해야 하는다는 편견을 버릴수 있도록 자료는 공유되어야 한다고 생각합니다. ~!!