1. 程式人生 > >不依賴具體activity彈出全域性性彈窗

不依賴具體activity彈出全域性性彈窗

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物件。
   每一個WindowManager物件都和一個特定的Display繫結。
   想要獲取一個不同的display的WindowManager,可以用 createDisplayContext(Display)來獲取那個displayContext,之後再使用:Context.getSystemService(Context.WINDOW_SERVICE)來獲取WindowManager

     呼叫的是WindowManager繼承自基類的addView方法和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<View, Integer> showViewMap = new HashMap<View, Integer>();
	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實現全域性彈窗樣式

    把activity樣式在AndroidManifest.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,需要的到請下載