Android 优化 透明Activity展示loading关闭时闪烁

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.csdn.net/qq_32306959/article/details/85063842

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值