1. 背景
之前设计了一个支付SDK,因为需要展示loading以及支付页面,也为了不需要用户传入Activity引用,设计了一个透明得Activity,但是发现在实践得时候,关闭这个Activity会有闪烁一下的问题。本来觉得并不是什么大问题,产品硬是要说这是个bug,这是强行让我涨姿势啊,太难了,想了想还是把手中的扳🔪给放下了。
2. 现实
2.1 Activity采用对话框样式
<style name="ActivityDialogStyle" parent="@android:style/Theme.Translucent.NoTitleBar">
<!--背景色,此处的背景色请一定要设置为透明度背景色-->
<item name="android:windowBackground">@android:color/transparent</item>
<!--window Is Translucent 窗口是半透明的-->
<item name="android:windowIsTranslucent">true</item>
<!--window No Title窗口无标题-->
<item name="android:windowNoTitle">true</item>
<!--弹出动画-->
<item name="android:windowAnimationStyle">@null</item>
</style>
2.2 Activity的实现
package plat.boshuaili.action.main;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.WindowManager;
import java.lang.ref.WeakReference;
import java.util.Map;
public class ActionActivity extends Activity {
private MyHandler mHandler;
private AVLoadingIndicatorView loadingView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_action);
loadingView = findViewById(R.id.indicator);
loadingView.show();
mHandler = new MyHandler(this);
/.../
}
@Override
protected void onDestroy() {
mHandler.removeCallbacksAndMessages(null);
super.onDestroy();
}
private static class MyHandler extends Handler {
// WeakReference to the outer class's instance.
private WeakReference<Activity> mOuter;
private Activity activity;
public MyHandler(Activity activity) {
mOuter = new WeakReference<>(activity);
this.activity = activity;
}
@Override
public void handleMessage(Message msg) {
/.../
activity.finish();
}
}
}
}
其实就是在收到支付结果之后将loading给取消,测试了各种办法,比如修改style啊,然后修改系统的动画啊,等等,最后发现一种简单的方法,起先我并不会用,因为人家就给了一句代码overridePendingTransition(0, 0);,我还以为是在Activity中重写,我是这么实现的:
@Override
public void overridePendingTransition(int enterAnim, int exitAnim) {
overridePendingTransition(0, 0);
}
然后发现并没有什么卵用,我还在想这特么什么鬼,真low,最后发现我才是个弟弟。
3. 解决
3.1 第一步,启动修改:
Intent.FLAG_ACTIVITY_NO_ANIMATION
Intent intent = new Intent(ContextUtils.getContext(), ActionActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
ContextUtils.getContext().startActivity(intent);
3.2 第二步,finish之后:
在调用 activity.finish();之后加上这么一句就可以了:
activity.overridePendingTransition(0, 0);
并不需要重写。
4. 参考
1. https://blog.youkuaiyun.com/qq_32306959/article/details/85063842