当前位置: 代码迷 >> 综合 >> android在任意界面弹出popwindow的两种方方法
  详细解决方案

android在任意界面弹出popwindow的两种方方法

热度:46   发布时间:2023-10-23 14:37:29.0


方法一:创建一个基类,所有的activity都继承自这一个基类,在基类中注册广播接收者,收到弹出popwindow的广播后就弹出广播,需要注意的一点是,当前activity不可见
时是不需要弹出popwindow的,因此需要声明一个变量表示当前activity是否可见。

public
abstract
class
BaseActivity
extends
FragmentActivity
implements
OnClickListener {
protected boolean needPopOrderOver;//当前界面是否可见
@Override
protected void onCreate(BundlesavedInstanceState) { 
// TODO Auto-generated methodstub
super.onCreate(savedInstanceState);
//注册广播
MyReceive myReceive= new
MyReceive();
IntentFilterfilter = new
IntentFilter();
filter.addAction("android.intent.action.order_ok");
registerReceiver(myReceive, filter);
}
@Override
protected void onStop(){ 
super.onStop();//不可见时
needPopOrderOver = false;
}
@Overrideprotectedvoid onStart() { 
super.onStart();//可见时
needPopOrderOver = true;
}
public
class
MyReceive
extends
BroadcastReceiver {
@Override
public void onReceive(Contextcontext, Intent intent) {
Stringaction = intent.getAction(); 
if(Constants.ORDER_OK_ACTION.equals(action)){ 
//收到广播 弹出popwindow} }}
}



方法二:
声明一个activity管理类用来管理当前正在显示的activity,其中最主要的两个方法我用红色标出来
public class MyActivityManager {private static MyActivityManager sInstance = new MyActivityManager();private WeakReference<Activity> sCurrentActivityWeakRef;private MyActivityManager() {}public static MyActivityManager getInstance() {return sInstance;}public Activity getCurrentActivity() {Activity currentActivity = null;if (sCurrentActivityWeakRef != null) {currentActivity = sCurrentActivityWeakRef.get();}return currentActivity;}private static Stack mActivityStack;public void setCurrentActivity(Activity activity) {sCurrentActivityWeakRef = new WeakReference<Activity>(activity);}/*** 推出栈顶Activity*/public void popActivity(Activity activity) {if (activity != null) {activity.finish();mActivityStack.remove(activity);activity = null;}}/*** 获得当前栈顶Activity*/public Activity currentActivity() {//lastElement()获取最后个子元素,这里是栈顶的Activityif(mActivityStack == null || mActivityStack.size() ==0){return null;}Activity activity = (Activity) mActivityStack.lastElement();return activity;}/*** 将当前Activity推入栈中*/public void pushActivity(Activity activity) {if (mActivityStack == null) {mActivityStack = new Stack();}mActivityStack.add(activity);}/*** 弹出指定的clsss所在栈顶部的中所有Activity* @clsss : 指定的类*/public void popTopActivitys(Class clsss) {while (true) {Activity activity = currentActivity();if (activity == null) {break;}if (activity.getClass().equals(clsss)) {break;}popActivity(activity);}}/*** 弹出栈中所有Activity*/public void popAllActivitys() {while (true) {Activity activity = currentActivity();if (activity == null) {break;}popActivity(activity);}}}


然后在application中:
registerActivityLifecycleCallbacks是application中管理所有activity生命周期的一个方法,可以在该方法中处理我们的需求,当activity不可见和可见时设置刚才创建的
activitymanager中的activity对象,在需要弹出popwondow的地方,直接掉用即可。
@Overridepublic void onCreate() {super.onCreate();registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {@Overridepublic void onActivityCreated(Activity activity, Bundle bundle) {}@Overridepublic void onActivityStarted(Activity activity) {MyActivityManager.getInstance().setCurrentActivity(activity);}@Overridepublic void onActivityResumed(Activity activity) {}@Overridepublic void onActivityPaused(Activity activity) {MyActivityManager.getInstance().setCurrentActivity(null);}@Overridepublic void onActivityStopped(Activity activity) {}@Overridepublic void onActivitySaveInstanceState(Activity activity, Bundle bundle) {}@Overridepublic void onActivityDestroyed(Activity activity) {}});}


//调用方法:
MyActivityManager.getInstance().getCurrentActivity()// 就是当前正在运行的activity,然后弹出popwindow即可。


















  相关解决方案