学习Android前后有快有1个月了,本着不耍流氓,谈恋爱就要结婚的信念(其实AD开发也挺有趣的),做了自己的第一个Android小应用。本来准备今天和大家分享的,考虑到在不同屏幕上的效果没测试和本着节约大家流量的前提下准备后天和大家分享我的APP,抽时间把一些大一点的数据缓冲到手机,不每次都去网络上下载。今天和大家分享我在开发这个app中的一些知识点。

1、请求webservices

  上次和大家说到的是请求wcf,以前有一个现成的.net网站里面提供了webservices服务,我就没有把webservices上功能拉出来部署为wcf服务了。先实现功能再说。今天先说webservices了,以后有机会再聊wcf。其实调用webservices服务挺简单的,下面把代码贴上来

    /**
     * 调用webservices服务
     *
     * @param url
     *            服务地址/方法名。 例如:http://www.wenyunge.com/webservices/XXX.asmx/
     *            QueryTopsNew
     * @param params方法参数
     *            例如:List params = new ArrayList(); params.add(new
     *            BasicNameValuePair("count", count));
     * @return
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public String Request(String url, List params) {
        HttpPost request = new HttpPost(url);
        String result = "";
        try {

            request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
            HttpResponse httpResponse = new DefaultHttpClient()
                    .execute(request);
            if (httpResponse.getStatusLine().getStatusCode() != 404) {
                result = EntityUtils.toString(httpResponse.getEntity());
            }
        } catch (Exception e) {
            try {
                throw e;
            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
        return result;
    }

简单吧,我就不细说了。

 2、Service、BootBroadcastReceiver学习

  自己用文云阁来看小说,总是要进去后才知道最近有没有更新,这种体验实在是糟透了。作为屌丝的程序员,肯定总能想到办法啦。1、使用BootBroadcastReceiver设置为开机启动(这个好像只有在android4.0以上的系统中才能用上),然后在从写2、onReceive方法时候启动个Service,3、再然后再Service的onCreate里面写一个定时器。定时去检查有没有更新,4、有的话再通过NotificationManager在android通知里面告诉你。这样是不是很屌丝啊。嘿嘿

1、使用BootBroadcastReceiver设置为开机启动

AndroidManifest.xml
权限:
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
设置开机启动
<receiver android:name="BootBroadcastReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" >
                </action>

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </receiver>

2、onReceive方法时候启动个Service

public void onReceive(Context context, Intent intent) {
        // 后边的XXX.class就是要启动的服务
        Intent service = new Intent(context, BookUpdateService.class);
        context.startService(service);
        Log.v("TAG", "更新提醒服务已经启动");
        // 启动应用,参数为需要自动启动的应用的包名
        // Intent intent = getPackageManager().getLaunchIntentForPackage(
        // packageName);

        // context.startActivity(intent);
    }

3、再然后再Service的onCreate里面写一个定时器

public void onCreate() {
        // TODO Auto-generated method stub
        // Log.i("myService", "onCreate");

        Timer timer = new Timer();

        // 3. 启动定时器,
        timer.schedule(task, , );

        Log.e("myService", "onCreate");
        System.out.print("onCreate");
    }

特意设置1800000半小时检查一次,太快了流量还要钱呢。

4、有的话再通过NotificationManager在android通知里

@SuppressLint("HandlerLeak")
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            // 要做的事情
            Bitmap btm = BitmapFactory.decodeResource(getResources(),
                    R.drawable.ic_launcher);
            NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
                    BookUpdateService.this)
                    .setSmallIcon(R.drawable.ic_launcher)
                    .setContentTitle("文云阁").setContentText("您的书架有新更新");
            mBuilder.setTicker("您的书架有新更新");// 第一次提示消息的时候显示在通知栏上
            mBuilder.setNumber(msg.arg2);
            mBuilder.setLargeIcon(btm);
            mBuilder.setAutoCancel(true);// 自己维护通知的消失

            // 构建一个Intent
            Intent resultIntent = new Intent(BookUpdateService.this,
                    MainActivity.class);
            // 封装一个Intent
            PendingIntent resultPendingIntent = PendingIntent.getActivity(
                    BookUpdateService., resultIntent,
                    PendingIntent.FLAG_UPDATE_CURRENT);
            // 设置通知主题的意图
            mBuilder.setContentIntent(resultPendingIntent);
            // 获取通知管理器对象
            NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            mNotificationManager.notify(, mBuilder.build());
        }
    };
 3、系统更新

屌丝的人生你不懂,做出来的东西也就是马马虎虎的,总有bug,总要升级

private void notNewVersionShow() {
        StringBuffer sb = new StringBuffer();
        sb.append("当前版本:");
        sb.append(BaseActivity.getVerName(ToolActivity.this));
        sb.append(" Code:");
        sb.append(BaseActivity.getVerCode(ToolActivity.this));
        sb.append(",/n已是最新版,无需更新!");
        Dialog dialog = new AlertDialog.Builder(ToolActivity.this)
                .setTitle("软件更新").setMessage(sb.toString())// 设置内容
                .setPositiveButton("确定",// 设置确定按钮
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog,
                                    int which) {
                            }
                        }).create();// 创建
        // 显示对话框
        dialog.show();
    }

    private void doNewVersionUpdate() {
        StringBuffer sb = new StringBuffer();
        sb.append("当前版本:");
        sb.append(BaseActivity.getVerName(ToolActivity.this));
        sb.append(" Code:");
        sb.append(BaseActivity.getVerCode(ToolActivity.this));
        sb.append(", 发现新版本:");
        sb.append(name);
        sb.append(" Code:");
        sb.append(code);
        sb.append(", 是否更新?");
        Dialog dialog = new AlertDialog.Builder(ToolActivity.this)
                .setTitle("软件更新").setMessage(sb.toString())
                // 设置内容
                .setPositiveButton("更新",// 设置确定按钮
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog,
                                    int which) {
                                pBar = new ProgressDialog(ToolActivity.this);
                                pBar.setTitle("正在下载");
                                pBar.setMessage("请稍候...");
                                pBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                                downFile();
                            }
                        }).create();// 创建
        // .setNegativeButton("暂不更新",
        // new DialogInterface.OnClickListener() {
        // public void onClick(DialogInterface dialog,
        // int whichButton) {
        // // 点击"取消"按钮之后退出程序
        //
        // }
        // }).create();// 创建
        // 显示对话框
        dialog.show();
    }

    ProgressDialog pBar;

    void downFile() {
        pBar.show();
        new Thread() {
            public void run() {
                HttpClient client = new DefaultHttpClient();
                HttpGet get = new HttpGet(getResources().getString(
                        R.string.site_url)
                        + "wenyunge.apk");
                HttpResponse response;
                try {
                    response = client.execute(get);
                    HttpEntity entity = response.getEntity();
                    long length = entity.getContentLength();
                    InputStream is = entity.getContent();
                    FileOutputStream fileOutputStream = null;
                    if (is != null) {
                        File file = new File(
                                Environment.getExternalStorageDirectory(),
                                "wenyunge.apk");
                        fileOutputStream = new FileOutputStream(file);
                        ];
                        ;
                        ) {
                            fileOutputStream.write(buf, , ch);
                            ) {
                            }
                        }
                    }
                    fileOutputStream.flush();
                    if (fileOutputStream != null) {
                        fileOutputStream.close();
                    }
                    down();
                } catch (ClientProtocolException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();

    }

    void down() {
        handler.post(new Runnable() {
            public void run() {
                pBar.cancel();
                update();
            }
        });
    }

    void update() {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        File f = new File(Environment.getExternalStorageDirectory(),
                "wenyunge.apk");
        if (f.exists()) {
            intent.setDataAndType(Uri.fromFile(f),
                    "application/vnd.android.package-archive");
            startActivity(intent);
        }
    }

其实这段代码是我看别人的,那兄弟的网址不记得了,不然给大家贴出来
我跟大家分享个错误,在升级app的时候提示,在下面

 4、an existing package by the same name with a conflicting signature is already installed

是因为新app签名和原来的不同

 5、最后了,app还是有问题,大家喜欢的下来玩玩,有问题,告诉我,我会尽快给解决。
 支持分享,有愿意一起学习的也可以Q我,我的源码放在svnChina上了。

扫描二维码下载

 觉得还看的过去的,一定要先赞下啊。呵呵
 仅为学习,和方便大家

Android宝典入门篇-进阶的更多相关文章

  1. Android宝典入门篇-基础知识

    今天跟大家分享的是我学android时的笔记.以前搞net很多年了,现在还在搞这.本着活到老学到老抽了点时间学习了下android.android网上有很多的视频教程,当时对于我这样以前不了解java ...

  2. Android从入门到进阶——布局

    一.组件 1.UI组件 (Android.view.View的子类或者间接子类) 2.容器组件(Android.view.ViewGroup子类或者间接子类) 二.UI组件:TextView,Spin ...

  3. Android测试入门篇

    Android本身是一套软件堆叠(Software Stack),或者成为软件叠层架构,叠层主要分成三层:操作系统.中间件和应用程序. Android构架 1. Application 应用程序层:用 ...

  4. 服务端技术进阶(八)GitHub入门篇

    服务端技术进阶(八)GitHub入门篇 前言 在投递简历的过程中,发现有的公司会要求填写自己的GitHub地址,而自己却还没有GitHub帐号,准确点说是自己还不太会使用GitHub.(貌似开源社区中 ...

  5. Android Studio2.0 教程从入门到精通Windows版 - 入门篇

    http://www.open-open.com/lib/view/open1468121363300.html 本文转自:深度开源(open-open.com)原文标题:Android Studio ...

  6. Scala进阶之路-并发编程模型Akka入门篇

    Scala进阶之路-并发编程模型Akka入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Akka Actor介绍 1>.Akka介绍 写并发程序很难.程序员不得不处 ...

  7. 【Android开发日记】之入门篇(十二)——Android组件间的数据传输

    组件我们有了,那么我们缺少一个组件之间传递信息的渠道.利用Intent做载体,这是一个王道的做法.还有呢,可以利用文件系统来做数据共享.也可以使用Application设置全局数据,利用组件来进行控制 ...

  8. 【Android开发日记】之入门篇(三)——Android目录结构

    本来的话,这一章想要介绍的是Android的系统架构,毕竟有了这些知识的储备,再去看实际的项目时才会更清楚地理解为什么要这样设计,同时在开发中遇到难题,也可以凭借着对Android的了解,尽快找出哪些 ...

  9. Android数据绑定DataBinding(二)入门篇

    前言 之前写了Android数据绑定DataBinding(一)入门篇,很简单的记录了如何使用DataBinding,其初衷是想要代码中的数据发生改变,不需要繁琐的setText等操作,在最后说到了只 ...

随机推荐

  1. Wannafly挑战赛18 B - 随机数

    思路:化简公式,Pn 表示 进行n 次操作,有奇数次1的概率 Pn = (1 - x) * Pn - 1  + x * (1 - Pn - 1) 得通项公式 Pn = (1 - (1 - 2 * x) ...

  2. 创建数据模型(View Models )和监控属性(Observables)

    Knockout是建立在以下3个核心功能之上的: 1. 属性监控与依赖跟踪 2. 声明式绑定 3. 模版机制 在本节中,我们将学习3个核心里面的第一个.但在这之前,先让我们学习一下MVVM设计模式和V ...

  3. PHP视频教程 字符串处理函数(三)

    字符串替换函数: str_replace() 替换字符串或数组元素,区分大小,第四个参数可选用于统计替换次数. str_ireplace() 不区分大小写替换 字符串函数比较 strcmp()比较字符 ...

  4. java8新特性——四大内置核心函数式接口

    在前面几篇简单介绍了一些Lambda表达式得好处与语法,我们知道使用Lambda表达式是需要使用函数式接口得,那么,岂不是在我们开发过程中需要定义许多函数式接口,其实不然,java8其实已经为我们定义 ...

  5. 企业级SOA之路——在Web Service中使用HTTP和JMS

    原文:http://www.tibco.com/resources/solutions/soa/enterprise_class_soa_wp.pdf   概述     IT业界在早期有一种误解,认为 ...

  6. 【SDOI2017】树点染色【线段树+LCT】

    本来只是想练练LCT,没想到是个线段树 对于操作1:诶新的颜色?这不是access吗? 也就是说,我们用一棵splay来表示一种颜色 操作2直接在LCT上乱搞-- 不对啊,操作3要查子树 诶好像是静态 ...

  7. 【hash】BZOJ3751-[NOIP2014]解方程

    [题目大意] 已知多项式方程:a0+a1*x+a2*x^2+...+an*x^n=0.求这个方程在[1,m]内的整数解(n和m均为正整数). [思路] *当年考场上怒打300+行高精度,然而没骗到多少 ...

  8. [CF226E]Noble Knight's Path

    [CF226E]Noble Knight's Path 题目大意: 一棵\(n(n\le10^5)\)个结点的树,初始时所有结点都是白色.\(m(m\le10^5)\)次操作,操作包含以下两种: 将点 ...

  9. Linux进程守护——Supervisor 使用记录

    0.旁白 Supervisor是个父进程,你要守护的进程会以Supervisor的子进程形式存在,所以老子才可以管儿子 官网链接:http://supervisord.org/ [5.参数]那块不要看 ...

  10. php上传文件常见问题(基础)

    既然上一篇文章<php上传中文文件文件名乱码问题>遇到了文件上传的问题,干脆把php上传文件时经常碰到的几个问题总结一下吧,以后用到时不用再去找了. 1.先做个最简单的上传文件 <h ...