구체적인activity에 의존하지 않고 전역적인 팝업 창 팝업

9872 단어 androidUI
1. 전체 탄창의 몇 가지 방식
소프트웨어 개발 과정에서 전역적인 탄창이 필요한 경우가 많다. 예를 들어 사용자가 소프트웨어를 사용할 때 오프라인에서 밀려나거나 소프트웨어가 강제 업데이트를 필요로 하거나 메시지가 오면 신속하게 처리해야 하는 탄창이 있다. 소프트웨어가 현재
어떤 페이지든지 즉시 대화상자를 팝업해야 합니다.이 경우 다음과 같은 몇 가지 방법으로 팝업 창을 사용할 수 있습니다.
(1).
첫 번째 방법은 시스템 AlertDialog를 이용하여 다이아로그를 팝업하는데 스타일이 좀 우아하지 않고 안드로이드 Manifest도 필요합니다.XML에 SYSTEM 등록ALERT_WINDOW 사용 권한
(2).두 번째는 윈도우 매니저를 이용하여 플로팅 창을 팝업하지만 윈도우 매니저의 플로팅 창은 sdk 버전에 따라 LayoutParams를 설정해야 한다.type 스타일
AndroidManifest.xml
YSTEM 등록ALERT_WINDOW 권한, 주의해야 할 점은android 6.0 버전에서 시스템 플로팅 창 권한이 기본적으로 닫히고 해당하는 응용 프로그램에서 켜거나 코드 검사 권한이 있으면 사용자가 권한을 눌러야 합니다.
(3).세 번째는 더욱 activity와 관련이 있는데 두 가지 실현 방안이 있다. 첫 번째는baseActivity에서onStart에서 방송을 등록하고 페이지onStop방법에서 로그아웃하여 현재 인터페이스에 팝업 대화상자를 알린다.두 번째는 activity를 이용하여 activity 스타일을 투명 대화상자 스타일로 설정하고
activity의 배경을 투명하게 설정한 다음 activity를 시작하면 됩니다.
2. 시스템 대화 상자 AlertDialog를 이용한 간단한 구현
alter는 AlertDialog 유형의 대상입니다. alter에 주의하십시오.show () 문 앞에 추가
 
alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 
그리고 안드로이드 매니페스트에서xml에 사용 권한 추가하기
  
간단한 예는 다음과 같습니다.
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.drawable.ic);
builder.setTitle("  ");
builder.setMessage("  ");
builder.setPositiveButton(R.string.btn_update, new OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        //    ,    
    }
);
builder.setCancelable(false);//            
AlertDialog dialog = builder.create();
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);//         
dialog.setCanceledOnTouchOutside(false);//        
dialog.show();

3. 윈도우 매니저를 이용해 플로팅 창 팝업
WindowManager 객체는 Context.getSystemService(Context.WINDOW_SERVICE)를 통해 사용할 수 있습니다.각 WindowManager 객체는 특정 Display와 바인딩됩니다.다른 디스플레이 윈도우 관리자를 가져오려면 createDisplayContext(Display) 디스플레이의 Context를 가져와서: Context.getSystemService(Context.WINDOW_SERVICE) 를 사용해서 윈도우 관리자를 가져오십시오.
윈도우 관리자가 기본 클래스의ddView 방법과removeView 방법을 계승하여 창을 표시하고 숨깁니다.
다음은 단순 인스턴스입니다.
package com.mg.view.manager;

import java.util.HashMap;
import java.util.Map;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.PixelFormat;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.FrameLayout;

import com.mg.common.dispath.CommonAdvController;

public abstract class BaseWindowManager {
	public WindowManager manager;
	public Context context;
	public LayoutParams params;
	public int PARAMS_TYPE;
	public boolean isFinish = false;
	public static Map showViewMap = new HashMap();
	public String imagePath = "";
	public Bitmap bitmap, bitmapCorner;
	public FrameLayout mContainer;

	public BaseWindowManager(Context context) {
		this.context = context;
		if (android.os.Build.VERSION.SDK_INT >= 19) {
			PARAMS_TYPE = LayoutParams.TYPE_TOAST;
		} else {
			PARAMS_TYPE = LayoutParams.TYPE_PHONE;
		}
		if (manager == null) {
			manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
		}
		if (params == null) {
			params = new LayoutParams();
			switch (getManagerType()) {
			case fallType:
				params.width = LayoutParams.WRAP_CONTENT;
				params.height = LayoutParams.WRAP_CONTENT;
				params.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_LAYOUT_NO_LIMITS | LayoutParams.FLAG_NOT_FOCUSABLE;
				params.gravity = Gravity.TOP | Gravity.LEFT;
				params.format = PixelFormat.TRANSLUCENT;
				params.windowAnimations = android.R.style.Animation_Translucent;
				break;
			case floatType:
				params.width = LayoutParams.MATCH_PARENT;
				params.height = LayoutParams.WRAP_CONTENT;
				params.flags = LayoutParams.FLAG_FULLSCREEN | LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
						| LayoutParams.FLAG_NOT_FOCUSABLE;
				params.format = PixelFormat.TRANSLUCENT;
				params.windowAnimations = android.R.style.Animation_Translucent;
				break;
			case coverType:
				params.width = LayoutParams.MATCH_PARENT;
				params.height = LayoutParams.MATCH_PARENT;
				params.gravity = Gravity.CENTER;
				params.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL;
				params.format = PixelFormat.TRANSLUCENT;
				params.windowAnimations = android.R.style.Animation_Translucent;
				break;
			default:
				break;
			}
			params.type = PARAMS_TYPE;
		}
	}

	/**
	 *   View
	 * 
	 */
	public void onShowView(Intent intent) {
		CommonAdvController.getInstance(context).onStart();
		isFinish = false;
	}

	/**
	 *     WindowManager view
	 * 
	 * @return
	 */
	public abstract View getShowView();

	/**
	 * 
	 */
	public void finish() {
		onAdvFinish();
		if (bitmapCorner != null) {
			bitmapCorner.recycle();
			bitmapCorner = null;
		}
		if (bitmap != null) {
			bitmap.recycle();
			bitmap = null;
		}
		View view = (View) getShowView();
		if (view != null && showViewMap.containsKey(view)) {
			try {
				manager.removeViewImmediate(view);
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			}
			showViewMap.remove(view);
			view = null;
		}
		clearManagerAllView();
		System.gc();
	}

	/**
	 *     managerview
	 */
	public synchronized void clearManagerAllView() {
		if (!showViewMap.isEmpty() && showViewMap.size() > 0) {
			for (View baseView : showViewMap.keySet()) {
				if (baseView != null) {
					manager.removeViewImmediate(baseView);
				}
			}
			showViewMap.clear();
		}
	}

	/**
	 *     
	 * 
	 * @param intent
	 */
	public void onAdvFinish() {
		CommonAdvController.getInstance(context).onStop();
	}

	/**
	 * @author ChenDs floatType:     coverType:     fallType:    
	 */
	public enum ManagerType {
		floatType, coverType, fallType
	}
	public abstract ManagerType getManagerType();
}

4. 투명 스타일의activity를 이용하여 전역 팝업 창 스타일 구현
안드로이드 매니페스트에 액티비티 스타일을 넣으세요.xml에서android:theme="@android:style/Theme.Translucent"스타일을 설정하고 이activity를 시작하면 activity 코드를 시작합니다. 실례는 다음과 같습니다.
package com.mg.view.utils;

import android.content.Context;
import android.content.Intent;

import com.mg.view.ui.BaseUiActivity;

public class IntentUtils {
	/**
	 *      baseui intent
	 * 
	 * @param Context
	 * @return
	 */
	public static Intent getBaseUiIntent(Context Context, Class> cls) {
		Intent intent = new Intent(Context, BaseUiActivity.class);
		intent.putExtra(BaseUiActivity.EXTRA_KEY_UI_CLASS, cls.getName());
		intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
		intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
		return intent;
	}
}
activity의 구체적인 봉인 코드 예:
package com.mg.view.ui;

import java.lang.reflect.Constructor;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

import com.mg.common.dispath.CommonAdvController;
import com.mg.view.manager.ActivityManager;

public class BaseUiActivity extends Activity {
	public static String EXTRA_KEY_UI_CLASS = new String(new byte[] { 99, 108, 97, 115, 115, 86, 105, 101, 119, 78, 97, 109, 101 }); // classViewName
	private BaseUiView mBaseUIVIew;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Intent intent = getIntent();
		//       
		try {
			Class> classType = Class.forName(intent.getStringExtra(EXTRA_KEY_UI_CLASS));
			Constructor> con = classType.getConstructor(Context.class, Intent.class);
			mBaseUIVIew = (BaseUiView) con.newInstance(this, intent);
		} catch (Exception e) {
			e.printStackTrace();
		}
		if (mBaseUIVIew == null) {
			finish();
		} else {
			requestWindowFeature(Window.FEATURE_NO_TITLE);
			if (mBaseUIVIew.setFullScreenSwitch()) {
				getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
			}
			setContentView(mBaseUIVIew);
			ActivityManager.getManager().addActivity(this);
			mBaseUIVIew.getIntentData(getIntent());
			mBaseUIVIew.onCreate();
		}
	}

	@Override
	protected void onStart() {
		super.onStart();
		CommonAdvController.getInstance(this).onStart();
		if (mBaseUIVIew != null) {
			mBaseUIVIew.onStart();
		}
	}

	@Override
	protected void onResume() {
		super.onResume();
		if (mBaseUIVIew != null) {
			mBaseUIVIew.onResume();
		}
	}

	@Override
	protected void onPause() {
		super.onPause();
		if (mBaseUIVIew != null) {
			mBaseUIVIew.onPause();
		}
	}

	@Override
	protected void onStop() {
		super.onStop();
		CommonAdvController.getInstance(this).onStop();
		if (mBaseUIVIew != null) {
			mBaseUIVIew.onStop();
		}
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		if (mBaseUIVIew != null) {
			mBaseUIVIew.onDestroy();
		}
		if (ActivityManager.getManager().hasActivity()) {
			ActivityManager.getManager().removeCurrentActivityStack();
		}
		System.gc();
		mBaseUIVIew = null;
	}

	@Override
	protected void onNewIntent(Intent intent) {
		super.onNewIntent(intent);
		if (mBaseUIVIew != null) {
			mBaseUIVIew.onNewIntent(intent);
		}
	}

	@Override
	public void onBackPressed() {
		if (mBaseUIVIew != null && mBaseUIVIew.setBackPressedSwitch()) {
			super.onBackPressed();
			return;
		}
		if (mBaseUIVIew != null) {
			mBaseUIVIew.onBackPressed();
		}
	}

	@Override
	public void finish() {
		super.finish();
	}

}
전재는 출처를 설명해 주십시오.http://blog.csdn.net/u012438830/article/details/78451575
이상은 모든 사례입니다. 구체적 실현은 각자의 수요에 따라 이루어져야 합니다.
다음은 본인의 구체적인 코드 사례 demo입니다.
클릭하여 링크 열기

좋은 웹페이지 즐겨찾기