Android 用service实现不依赖activity的版本更新功能

这篇博客介绍了如何在Android中使用Service实现一个不依赖Activity的版本更新功能。通过OkHttp发送网络请求获取新版本信息,展示系统对话框,并在用户确认后下载更新文件。同时,还涉及到对Home键监听的处理。
摘要由CSDN通过智能技术生成
    做Android开发的同学可能都很熟悉service了,四大组件之一吗,在后台运行没那么容易被杀死,可以处理一些不用显示在前台界面操作和功能。比如,音乐播放器的后台实现,网络下载等工作。我要写的是,关于app的版本检测和更新功能在service里的实现。
    先介绍下项目背景。大部分app都需要提供一个在线更新的功能,一般有自动弹出对话框,或者点击某个按钮后,弹出对话框提示有新版本的更新。一般来说,我们会在app的第一个activity的oncreate方法里,开启一条线程,去访问服务器,得到一个json或者xml数据,然后解析,判断是否有新版本。如果有,弹出对话框提示用户。好像没什么问题,开始我也是这么做的。后来,出现了问题后才使用现在的解决方案的。
    我们设想一下,这样的流程中弹出的对话框,是依赖于这个界面的,也就是这个activity的,对吧,而网络访问,解析,是耗时的操作,如果,用户每次在你的更新界面不做多的停留,那么他是不是永远都不知道有新版本了?再想的糟糕点,如果这个界面跟欢迎界面一样,就只出现一次,跳过了就finish掉了,或者是被系统回收了。那就不是看不到这个对话框了,你的程序会崩掉。因为你的dialog依赖于这个activity。怎么样能较好的处理上述几个问题呢。没错,这个时候你可以考虑系统对话框,完全独立的对话框,不依赖于activity。甚至,你都不要在activity里去调用这个系统对话框,让她和活动彻底分手。
    你可以写一个继承自Application的类,在这个类里来操作和控制dialog。但是控制力度没有在service里来操作更方便自如。废话有点多了。说说具体要实现的东西。在service里,开启网络访问下载文件,这里我用的是okhttp框架。解析json数组,版本号小于解析的版本信息,就弹出对话框。上代码:
    package net.xprinter.utils;

import java.io.File;
import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;

import net.xprinter.R;
import net.xprinter.entity.VersionEntity;
import net.xprinter.testview.HomeListener;
import net.xprinter.testview.HomeListener.OnHomePressedListener;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.app.Service;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import android.view.WindowManager;
import android.widget.Toast;

public class DownLoadService extends Service{
public static boolean isRunning=false;
//ok3的构建对象方法
private static OkHttpClient client=new OkHttpClient.Builder().connectTimeout(6, TimeUnit.SECONDS).build();

private HomeListener mHomeListener;
Handler mHandler;
Dialog dialog;
@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}
@Override
public void onCreate() {
    // TODO Auto-generated method stub
    //Log.i("TAG","onCreateservice");
    super.onCreate();
    //此处代码是监听home键用的,系统会话框在按下home后并不会消失,监听home键,调用dialog.cancle;
    mHomeListener=new HomeListener(getApplicationContext());
    mHomeListener.setOnHomePressedListener(new OnHomePressedListener() {

        @Override
        public void onHomePressed() {
            // TODO Auto-generated method stub
            if (dialog!=null) {
                dialog.cancel();
            }
        }

        @Override
        public void onHomeLongPressed() {
            // TODO Auto-generated meth
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值