【android应用】简单的升级相关弹窗---解决了service中弹出弹窗问题、Handler的使用实例、进度条

最近又在开始捣鼓升级相关的UI显示,还得在service中显示出来。


弹窗相关

1、弹窗AlertDialog

    private AlertDialog mAlertDialog;

    private AppInstaller(Context context){
        if (null == mContext) {
            mContext = context;
        }
        if (null != mContext) {
            mAlertDialog = new AlertDialog.Builder(mContext).create();
        }
    }

    /**
     * 显示升级成功
     * */
    private void showInstallSeccessfulUi(){
        closeWindow();
        mAlertDialog.setIcon(R.mipmap.ic_launcher);
        mAlertDialog.setTitle("安装提示");
        mAlertDialog.setMessage("安装成功");

        setServiceShow(1);
        mAlertDialog.show();
        return;
    }

    /**
     * 关闭窗口
     * */
    private void closeWindow(){
        if(mAlertDialog.isShowing()){
            mAlertDialog.dismiss();
        }
    }

2、进度条ProgressDialog

ProgressDialog比较简单,网上也有各种介绍,这里主要是为了以后方便自己查阅就不详细介绍了。

    private ProgressDialog mProgressDialog;

    private AppInstaller(Context context){
        if (null == mContext) {
            mContext = context;
        }
        if (null != mContext) {
            mProgressDialog = new ProgressDialog(mContext);
        }
    }

    /**
     * 关闭窗口
     * */
    private void closeWindow(){
        if(mProgressDialog.isShowing()){
            mProgressDialog.dismiss();
        }
    }

    /**
     * 更新升级状态
     * */
    private void updateProgress(int progress){
        mProgressDialog.setIndeterminate(false);
        mProgressDialog.setMax(100);
        mProgressDialog.setProgress(progress);
        Log.i(TAG, "updateProgress: progress "+progress);
    }

    /**
     * 显示下载
     * */
    private void showDownloadUi(){
        closeWindow();
        mProgressDialog.setIcon(R.mipmap.ic_launcher);
        mProgressDialog.setTitle("下载");
        mProgressDialog.setMessage("正在下载中...");
        mProgressDialog.setMax(100);
        //设置进度
        mProgressDialog.setProgress(1);
        //mProgressDialog.STYLE_SPINNER  默认进度条是转圈
        //mProgressDialog.STYLE_HORIZONTAL  横向进度条
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

        setServiceShow(0);
        mProgressDialog.show();
        return;
    }

Handler的使用实例

  1. Android 中负责发送和处理消息,通过它可以实现不同线程之间的消息通信。
  2. 每个 Handler 都需要绑定一个 Looper 来管理消息队列和消息循环。
  3. Activity 被创建时就默认创建了 Looper,所以在主线程中默认可以直接使用 Handler。这时 Handler 绑定的是 ActivityLooper
  4. 当然也可以设置其他的 Looper,如果没有指定 Looper,默认使用 new Handler() 时线程所持有的 Looper
  5. 如果当前线程没有创建 Looper,就会报错。
//消息类型
    private static final int MSG_DOWNLOAD = 0;   //开始下载
    private static final int MSG_PROGRESS = 1;   //更新状态
    private static final int MSG_INSTALL_START = 2;  //开始安装
    private static final int MSG_INSTALL_SUCCESSFUL = 3; //安装成功
    private static final int MSG_INSTALL_FAIL = 4; //安装失败
    private static final int MSG_CLOSE_WINDOW = 5; //关闭窗口

//发送消息
    Message msg = mHandler.obtainMessage(MSG_PROGRESS);
    msg.arg1 = i;
    mHandler.sendMessage(msg);

//处理消息
    public Handler mHandler = new Handler()
    {
        @Override
        public void handleMessage(Message msg){
            super.handleMessage(msg);

            Log.i(TAG, "handlerMessage: is MSG_INSTALL "+msg.what);
            switch (msg.what){
                case MSG_DOWNLOAD:
                    showDownloadUi();
                    break;
                case MSG_INSTALL_START:
                    showInstallUi();
                    break;
                case MSG_INSTALL_SUCCESSFUL:
                    showInstallSeccessfulUi();
                    break;
                case MSG_INSTALL_FAIL:
                    showInstallFailUi();
                    break;
                case MSG_PROGRESS:
                    updateProgress(msg.arg1);
                    break;
                case MSG_CLOSE_WINDOW:
                    closeWindow();
                    break;
                default:
                    break;
            }
        }
    };

默认使用主进程,也可以mHandler = new Handler(Looper.getMainLooper())申明

有很多耗时操作不能再主线程中进行,所以需要用到mHandlerThread。

HandlerThread 继承自 Thread,本质就是个 Thread
其与普通 Thread 的区别在于实现了自己的 Looper,可以单独分发和处理消息。

用来实现线程间的通信,主要是子线程和子线程间的通信。 Handler 更多的主要是子线程到主线程。

//创建
private HandlerThread mHandlerThread;
......
mHandlerThread = new HandlerThread("MyHandlerThread");
handlerThread.start();

//Handler 中使用 mHandlerThread.getLooper()
mHandler = new Handler(mHandlerThread.getLooper()) {
    @Override
    public void handleMessage(Message msg) {
        System.out.println("收到消息 : " + Thread.currentThread());
    }
};

//在子线程使用 mHandler 发送消息
new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Thread.sleep(1000);//模拟耗时操作
            System.out.println("发送消息 : " + Thread.currentThread());
            mHandler.sendEmptyMessage(0);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}).start();

//发送消息
mHandler.sendMessage(msg);

//退出、释放
@Override
protected void onDestroy() {
    super.onDestroy();
    if (mHandlerThread != null) {
        mHandlerThread.quit();
        //mHandlerThread.quitSafely(); 需要API>=18
    }
}

如何在service中弹出弹窗问题

//xml文件中添加权限
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

//java文件中添加
    /**
     * 允许服务中弹窗
     * */
    private void setServiceShow(int type){
        if(type == 0){
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M&&Build.VERSION.SDK_INT < Build.VERSION_CODES.O){
                //android6.0~7.0
                mProgressDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);
            }else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
                //android8.0以上
                mProgressDialog.getWindow().setType((WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY));
            }else {
                mProgressDialog.getWindow().setType((WindowManager.LayoutParams.TYPE_SYSTEM_ALERT));
            }
        }else if(type == 1){
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M&&Build.VERSION.SDK_INT < Build.VERSION_CODES.O){
                //android6.0~7.0
                mAlertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);
            }else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
                //android8.0以上
                mAlertDialog.getWindow().setType((WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY));
            }else {
                //其他
                mAlertDialog.getWindow().setType((WindowManager.LayoutParams.TYPE_SYSTEM_ALERT));
            }
        }
    }

源码实例

【源码】简单的升级相关弹窗源码

结束语

以上就是本次分享的升级相关弹窗的实例。最后惯例给大家推介一下我们的技术工作号,欢迎大家来交流技术问题,谢谢!

在这里插入图片描述

发布了61 篇原创文章 · 获赞 45 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/twk121109281/article/details/101029787