最近又在开始捣鼓升级相关的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的使用实例
- 在
Android
中负责发送和处理消息,通过它可以实现不同线程之间的消息通信。- 每个
Handler
都需要绑定一个Looper
来管理消息队列和消息循环。Activity
被创建时就默认创建了Looper
,所以在主线程中默认可以直接使用Handler
。这时Handler
绑定的是Activity
的Looper
。- 当然也可以设置其他的
Looper
,如果没有指定Looper
,默认使用new Handler()
时线程所持有的Looper
。- 如果当前线程没有创建
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));
}
}
}
源码实例
结束语
以上就是本次分享的升级相关弹窗的实例。最后惯例给大家推介一下我们的技术工作号,欢迎大家来交流技术问题,谢谢!