需求
最近项目需要实现这样一个需求,当外来数据进行注册时,需要提示progressDialog,而外来数据是在子线程中,需要handler加持,这样的话就需要很多handler的code,所以我打算在Application中去实现这样一个功能。
原理
ProgressDialog 显示需要非ApplicationContext的上下文来依附,所以我们不能使用getApplicitionContext方法来实现。
去网上查了很多教程最终还是选择了创建Activity这种方式,因为系统弹窗的方式需要权限,而这个权限在高版本又需要手动处理,舍弃
- 创建一个透明的Activity主题
<!-- 全局弹框Activity,设置背景颜色为透明 -->
<style name="Transparent" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowAnimationStyle">@android:style/Animation</item>
<item name="android:windowNoTitle">true</item>
</style>
- 创建一个Activity
materialDialog = new MaterialDialog.Builder(this)
.title("Progress")
.content("Please Wait...")
.progress(true, 0)
.progressIndeterminateStyle(true)
.canceledOnTouchOutside(false)
.show();
while (true)
{
//这个xxx是Application类中的一个静态变量,用来标志是否关闭dialog
if(!MyApplication.xxx)
{
materialDialog.dismiss();
finish();
Log.i(TAG, "ondo: maaa123");
}
}
- 在application中使用handler
/**
* 传递消息的handler
*/
private static class MyHandler extends Handler
{
@Override
public void handleMessage(Message msg) {
switch(msg.what)
{
case 0:
//进入一个刚才新建的activity
Intent intent = new Intent(getContext(),GlobalDialogActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getContext().startActivity(intent);
break;
case 1:
break;
case 2:
break;
default:
break;
}
}
}
private static MyHandler myHandler = new MyHandler();