• 前言本篇博客从开发的角度来介绍如何开发一个Android App,需要说明一点是,这里只是提供一个如何开发一个app的思路,并不会介绍很多技术上的细节,从整个大局去把握如何去构思一个app的开发,让你对独立开发一款app...

    前言

    本篇博客从开发的角度来介绍如何开发一个Android App,需要说明一点是,这里只是提供一个如何开发一个app的思路,并不会介绍很多技术上的细节,从整个大局去把握如何去构思一个app的开发,让你对独立开发一款app的时候有个理解,如果有说的不对的地方,欢迎大家拍砖留言讨论。

    开发环境

    Android应用层使用的开发语言是Java,自然需要用到Java运行环境,无论你在Window是系统还是Mac系统都需要安装JDK,并且配置它的环境变量,不懂什么叫环境变量的或者不知道怎么配的,请利用好自己的百度技能自行学习。

    JDK下载

    开发工具

    开发工具,Android因为历史原因,前面很长一段时间使用的是Eclipse,我们要开发Android应用的时候需要另外安装Google为它开发的插件ADT,Eclipse这个开源软件很优秀,也很专业,但仅仅只是使用它来开发Android就显得有点鸡肋了,如果没有对Eclipse进行优化的话,会很卡很卡,后面Google实在不愿意寄人篱下,就专门为我们开发者开发了目前很受广大开发者推崇的Android Studio,现在2.0预览版也出来啦,大伙赶紧去下吧。

    Android studio

    模拟器

    Android自带的模拟器一直广受诟病,实在是太卡太慢了,对比人家IOS模拟器是那么的流畅,Android开发者直喊好苦逼啊,不过还好后面出了第三方比原生流畅n倍的模拟器Genymotion,大家可以去下一个个人版的够你平时开发测试用了。最好的办法还是使用真机测试,毕竟真机才是真实的环境。

    Genymotion

    Android核心基础

    前面是准备工作,想开发一款Android app,你最起码要掌握Android的核心基础知识,针对初学Android的童鞋,想一口吃掉一个胖子是不可能的,还是得把基础打牢之后才能完成独立的开发,Android入门不难,学完基础你只是具备开发app的基本条件,想做一个优秀的app还有很长一段路要走,经验是靠不断实践堆出来的,找一套系统的课程去认真学习一下,在线教育的资源很多,比如慕课网,极客学院都有很多不错的学习资源,童鞋自己择优来学习即可。

    推广:http://edu.csdn.net/course/detail/545(笔者的课程)

    产品开发流程

    正常的互联网开发app的流程大致如下:
    - 产品规划,定产品方向
    - 需求调研,产出需求文档
    - 需求评审,修订需求文档
    - 产品狗画app线框图提供给射鸡师
    - 射鸡师根据线框图设计视觉稿
    - 程序猿根据视觉稿搭建UI框架
    - 程序猿根据需求文档开发功能
    - 测试媛编写测试用例,根据排期进行测试
    - 程序猿修复回归测试反馈的bug,提交beta版
    - 测试通过,提交给运营喵发布到渠道上线

    上面是笔者的经验总结,可能有不太准确的地方,但大致整个流程是这样,我们开发者要清楚自己在整个产品中充当的角色,明白自己的工作职责即可。

    快速搭建项目

    Android比没有想象那么难,只是刚开始要学习的东西多,一下子消化不了才会比较茫然,笔者写这篇博客就是想帮助大家整理一下开发思路。

    快速搭建项目也算是一项技能,而这项技能只能由你自己来完善,刚开始做开发的时候一定会有很多重复性的工作,如果没有意识去提高自己的开发效率的话,可能你的十年工作经验代表的只是一年的经验用了十年而已。

    那要怎么做,笔者提供一个自己总结的,仅供参考:
    - 定开发规范
    - 搭建UI框架
    - 选用开发库集成(或自造轮子)
    - 第三方服务集成(视情况而定)

    定开发规范

    一个项目一般不会只有一个人独立开发,就算是独立开发,我们也应该定一下开发规范,一般会有什么样的规范?
    - 命名规范
    - 代码规范
    - 代码管理规范

    命名规范

    命名规范包括:
    - 项目命名
    - 包命名
    - 类命名、成员变量命名
    - 资源文件命名
    我们做每一个产品都会有相应的命名,不要用中文来命名,最好用能表达中文意思的英文来表示,例如CSDN客户端,可以用CSDNClient作为命名,我们创建项目的时候可以以它作为Application name。
    可以看看以前写的这篇文章:
    http://blog.csdn.net/wwj_748/article/details/42347283

    代码规范

    代码规范视语言而定,开发android使用的是Java,自然要按照Java的编码规范进行编码,比如命名采用驼峰命名法,编码的时候也要符合Android的开发规范,比如UI线程不做任何耗时的操作,像网络请求、数据库操作都需要放到子线程中去做,只有UI的刷新才在UI线程中做,像这些规范,可以根据自身在项目遇到的问题来定,定规范的好处就是减少踩坑的几率,提高开发的质量。

    代码管理

    对于一个经常更新迭代的产品,不可能由头到尾不变,这个时候我们需要对代码进行分支管理,最好使用git代码仓库对代码进行管理,作为一个合格的开发者连git都不用实在说不过去,还用svn的童鞋赶紧放弃它投入git的怀抱,它的好处是不言而喻的,自己去体会。

    搭建UI框架

    搭建UI框架需要我们根据产品的导航模式来设计,市场上常用的导航模式有如下图几种:

    app导航

    我们的app如果不出意外一定是其中的一种导航模式,一般线框图出来我们就应该知道即将要开发的app长什么样子,开发者不必等视觉稿和素材出来才开始动工,我们先大致搭个架子,等视觉稿出来之后我们再做调整。

    选用开发库

    一般我们app涉及到的库会有:
    - UI框架(比如下拉刷新PullToRefresh、侧滑菜单Slidingmenu)
    - 网络请求库(比如okhtttp、AndroidAsyncHttp、Volley)
    - 数据操作库(比如GreenDao、Ormlite)
    - 图片缓存框架(比如Universal-Imageloader)
    - 数据解析库(比如Gson)

    之所以要选用这些库,肯定是为了避免重复造轮子,在开发效率的角度来说,选用优秀的开源库能大大缩短开发周期和提高开发效率,但从个人提升角度来看的话,我们可能就成了一个只会用API的程序猿了,如果想提升的话,造轮子或者分析这些优秀的源代码是一个不错的途径。

    第三方服务集成

    我们开发app的时候,肯定会遇到一些需求,比如推送的需求、自动升级、数据统计、社会化分享、用户反馈等等,然而对于一个刚起步的企业或者个人开发者的话,全都要自己去开发的话,那岂不是累死,像推送这种有一定的技术门槛,能做好都能成立一家公司了,所以选用一些第三方服务是一个可选之举。如果说你以后做大了,用第三方怕不好控制,那就自己做呗,有钱任性招兵买马就自己做,谁叫咱有钱呢。


    前面这些东西开发一个app够了,开发出来能不能用还得有靠谱的测试,有没有crash,操作流不流畅,体验好不好才会有用户去用。这里不从产品的角度去评判一个app的好与坏,程序员要考虑的是从代码层面、性能层面去让我们的app变得更好。

    云测

    我们开发完毕之后,需要给测试工程师进行基本的功能需求测试,他们传统的做法就是根据事先写好的测试用例来做回归测试,再把测试出来的bug反馈给工程师,工程师再去修bug,但这样实在是太不靠谱了,有时候我们太在意功能而忽略了一些更重要的东西,那就是体验,给用户最直接的感受就是你这个app够不够惊艳,够不够流畅,用户可能根本就不在乎你这个功能做的有多牛逼。所以我们更应该从非功能性方向去做测试,我们的目的是让用户用的爽,而不是加一些乱七八糟的功能。那怎么测非功能性的一些因素,这里就要提到『云测』这个东西,因为现在设备太多了,如果公司要买一堆设备来做测试,那得多少成本,况且设备更新得太快,你根本就跟不上,所以就有了云测这个东西,它是一个云测试平台服务,提供了一大批主流机型,我们就直接省去购买设备的成本,还能得到完善的测试报告。

    再来说一下它的好处:
    - 终端云,省去测试设备购买租赁成本
    - 高效率 节省测试人员成本及时间
    - 包含兼容性测试、性能测试、功能测试
    - 操作简单、详细测试报告生成

    这么多好处,你在缺少测试工程师的时候,不去尝试那实在说不过去。

    打包上线

    前面的开发环节、测试环节都没问题之后,你离实现一个app的完整开发就不远了,正常的互联网公司,会把签名打包的apk给到运营,交给他们去写文案,上传到应用渠道,让渠道给我们去首发和推广。如果是个人开发者,这些工作就得我们自己做了。

    总结

    本篇博客从整个app开发流程上去给大家梳理了一遍,没有讲太多技术上的东西,但理解app流程对自己把握产品很有益处,虽然我们只是一个小小的开发者,但如果你有追求,哪天轮到你去负责一个产品的时候,你就应该对开发的每一个环节都了如指掌,因为出了问题,你也知道怎么针对性的去解决。笔者虽然只是一个小小的开发者,但也乐于思考,很多时候不太愿意被别人牵着鼻子走,因为我们的人生就应该把握在自己手里。


    如果你觉得文章不错,那就扫码关注一下笔者的公众号吧,期待有志之士的你。

     wwjblog

    展开全文
  • 一丶概述前段时间配合开发,完成了一个APP拉起另一个...市面上比较流行的解决办法,第一个就是现在说的新开发一个管理型APP,其他APP需要时再下载,运用时拉起,另一个就是插件化,直接将多个APP合成一个APP,这个...

    本文出自:https://blog.csdn.net/DT235201314/article/details/80255143

    一丶概述

    前段时间配合开发,完成了一个APP拉起另一个APP的需求,负责接收数据跨登录部分。当然整个实现思路挺感兴趣就了解一下。先说说需求拉起另一个APP是为了方便统一使用管理,有些公司APP较多,部分人只需要用到部分APP,需要用到时就下载。市面上比较流行的解决办法,第一个就是现在说的新开发一个管理型APP,其他APP需要时再下载,运用时拉起,另一个就是插件化,直接将多个APP合成一个APP,这个感兴趣也可以了解一下。

    二丶效果图


    三丶需求分析

    1.A点击拉起B;

    2.如果B没安装,下载安装;

    3.如果B已安转,未在后台运行点击打开B,传值账号密码,做跨登录;

    4.如果B已安装,且正在后台运行,A打开B直接显示在后台运行的页面;

    简版流程图:


    四丶原理与实现

    1.先说A拉起B可实现的几种方法

    (1)包名,特定Activity名拉起

    Intent intent = new Intent(Intent.ACTION_MAIN);
    /**知道要跳转应用的包命与目标Activity*/
    ComponentName componentName = new ComponentName("kuyu.com.xxxx", "kuyu.com.xxxx.xxx.login.WelcomeActivity");
    intent.setComponent(componentName);
    intent.putExtra("", "");//这里Intent传值
    startActivity(intent);

    B应用需要在manifest文件对应Activity添加

    android:exported="true"

    (2)包名拉起(这里就是进去启动页)

    Intent intent = getPackageManager().getLaunchIntentForPackage("kuyu.com.xxxx");
    if (intent != null) {
        intent.putExtra("type", "110");
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    }

    (3)url拉起

    Intent intent = new Intent();
    intent.setData(Uri.parse("csd://pull.csd.demo/cyn?type=110"));
    intent.putExtra("", "");//这里Intent当然也可传递参数,但是一般情况下都会放到上面的URL中进行传递
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);

    B应用manifest文件需配置(注意:在原有intent-filter下方另外添加,不是在原先里面,两个同时存在)

    <intent-filter>
        <data
            android:host="pull.csd.demo"
            android:path="/cyn"
            android:scheme="csd" />
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
    </intent-filter>
    优点:不暴露包命   缺点:host path schemeA应用和B应用得规定死

    2.判断B应用是否安装

    /**
     * 检查包是否存在
     *
     * @param packname
     * @return
     */
    private boolean checkPackInfo(String packname) {
        PackageInfo packageInfo = null;
        try {
            packageInfo = getPackageManager().getPackageInfo(packname, 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return packageInfo != null;
    }

    3.判断B应用是否在后台运行并直接打开

    public static Intent getAppOpenIntentByPackageName(Context context,String packageName){
        //Activity完整名
        String mainAct = null;
        //根据包名寻找
        PackageManager pkgMag = context.getPackageManager();
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED|Intent.FLAG_ACTIVITY_NEW_TASK);
    
        List<ResolveInfo> list = pkgMag.queryIntentActivities(intent,
                PackageManager.GET_ACTIVITIES);
        for (int i = 0; i < list.size(); i++) {
            ResolveInfo info = list.get(i);
            if (info.activityInfo.packageName.equals(packageName)) {
                mainAct = info.activityInfo.name;
                break;
            }
        }
        if (TextUtils.isEmpty(mainAct)) {
            return null;
        }
        intent.setComponent(new ComponentName(packageName, mainAct));
        return intent;
    }
    
    public static Context getPackageContext(Context context, String packageName) {
        Context pkgContext = null;
        if (context.getPackageName().equals(packageName)) {
            pkgContext = context;
        } else {
            // 创建第三方应用的上下文环境
            try {
                pkgContext = context.createPackageContext(packageName,
                        Context.CONTEXT_IGNORE_SECURITY
                                | Context.CONTEXT_INCLUDE_CODE);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
        }
        return pkgContext;
    }
    
    public static boolean openPackage(Context context, String packageName) {
        Context pkgContext = getPackageContext(context, packageName);
        Intent intent = getAppOpenIntentByPackageName(context, packageName);
        if (pkgContext != null && intent != null) {
            pkgContext.startActivity(intent);
            return true;
        }
        return false;
    }
    if (checkPackInfo("kuyu.com.xxxxx")) {
    openPackage(this,"kuyu.com.xxxxx");
    } else {
        Toast.makeText(this, "没有安装" + "",Toast.LENGTH_LONG).show();
        //TODO  下载操作
    }
    这里运用的是模拟点击图标启动,不会出现程序多开,和栈顶Activity重复或者顺序错乱的问题。

    当然Activity的LaunchMode最好设为“singletop”

    4.B应用接受传值跨登录操作

    一般启动页有几种操作

    (1)定时直接跳转登录页面

    这个就简单了,直接在handle发送跳转做判断接收intent操作就可以了

    例:

    if(getIntent().hasExtra("xxxx")){
        otherOpen();
    }else {
        mHandler.removeMessages(0);
        mHandler.sendEmptyMessageDelayed(0, 3000);
    }

    (2)做了用户信息保存,跳过登录的,这个时候就通过handle的消息判断,做出相应操作

    例:

    /**
     * 跳去首页/登录页面
     */
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.arg1) {
                case 1009:
                    goToActivity(MainActivity.class);
                    WelcomeActivity.this.finish();
                    break;
                case 1010:
                    gotoLogin(handler1, runnable);
                    break;
            }
        }
    };

    展开全文
  • 由于博主长期从事海外App的开发,所以心系谷歌爸爸的动向呀,最近谷歌爸爸推出了一个Android App Bundle的东西,据说可以压缩包体,当然这仅限于上传Google Play的应用,国内市场不支持,当然我们也可以学习谷歌爸爸...

    由于博主长期从事海外App的开发,所以心系谷歌爸爸的动向呀,最近谷歌爸爸推出了一个Android App Bundle的东西,据说可以压缩包体,当然这仅限于上传Google Play的应用,国内市场不支持,当然我们也可以学习谷歌爸爸的思想。
    在这里插入图片描述

    概述

    Android App Bundle是Google最新推出的Apk动态打包,动态组件化的技术,与Instant App不同,AAB是借助Split Apk完成动态加载,使用AAB动态下发方式,可以大幅度减少应用体积。
    在这里插入图片描述

    从这个动态图中,我们就可以大概知道了App Bundle的原理是什么,App Bundle将这些特性在多个维度进行拆分,在资源维度,ABI维度和Language维度进行了拆分,你只要按需组装你的Apk然后安装即可。再说的直白一点就是,比如,项目中可能会xxhdpi,xhdpi各有一套图,或者x86,armeabi的又各有一套so库,以前的安装方式,是把这些全部装进用户的手机中,使用App Bundle,假设你是一个x86,xxhdpi的手机,那么App Bundle会帮你拼装好一个apk,这个apk的资源只有xxhdpi的,而且so库只有x86,其他无关的都会剔除。

    App Bundles将一个apk拆分成多个apk,我们的apk一般会被拆分为如下几个部分:

    Base Apk:首次安装的apk,公共代码和资源,所以其他的模块都基于Base Apk;
    Configuration APKs:native libraries 和适配当前手机屏幕分辨率的资源;
    Dynamic feature APKs:不需要在首次安装就加载的模块。

    在这里插入图片描述

    AAB并不是一个插件化框架,它利用的是Android Framework提供的split apks技术来完成的,而所有安装split apk工作均是通过IPC交由google play完成。 想了解更多关于split apks的内容,请关注这里:
    https://developer.android.com/studio/build/configure-apk-splits?authuser=2

    如何使用App Bundle

    在这里插入图片描述
    1.将你的Android Studio升级为3.2及其以上版本
    2.添加对Dynamic Delivery的支持
    其实就是一些基础apk需要东西,比如签名,MAIN入口等,详细请阅读:
    https://developer.android.google.cn/studio/projects/dynamic-delivery
    3.构建App Bundle
    在这里插入图片描述
    当你是3.2以上的studio时候,就可以选择build bundle,来构建app bundle的文件
    在这里插入图片描述
    构建出来就是一个.aab文件

    4.通过bundletool工具来测试你的.aab文件
    下载地址:https://github.com/google/bundletool
    解压出来就是一个jar包,以bundletool-all-0.6.0.jar为例子

    bundletool-all-0.6.0.jar build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
    

    这个命令构建出来的是没有签名的文件,要有签名的,需要如下:

    bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
    --ks=/MyApp/keystore.jks
    --ks-pass=file:/MyApp/keystore.pwd
    --ks-key-alias=MyKeyAlias
    --key-pass=file:/MyApp/key.pwd
    

    这些参数的说明详见如下:
    在这里插入图片描述
    在这里插入图片描述

    无疑就是一些打包的签名,密码等,还有一些特殊的属性,详细大家可以看英文介绍,使用命令后,出来的是app.apks文件,我们可以解压缩一下,出来就是如下的内容:
    在这里插入图片描述

    在这里插入图片描述

    从打包出来的东西,更印证了我们前面所说的原理

    5.app的签名上传google play
    6.将你的包上传到google console

    兼容性问题

    Api < 21的手机无法进行模块化,Google Play会对其进行Multiple Apks操作来进行下发操作。
    Enable on-demand: 是否启用按需下载,如果不启用,会直接打进Apk
    Fusing:熔断操作,是否安装到不支持按需下载的设备中
    Module title: 模块标题

    对于动态组件的一些使用场景

    语言包的动态下发
    当Split 针对语言进行划分时候,用户下载的Apk仅仅只能下载下来一个Base Apk,包含他的当前系统语言,你可以将其他语言包作为Dynamic feature下发给用户,做到语言包的动态下发

    功能的动态下发
    对于某些独立的feature,这其实跟之前的插件化方案有异曲同工之处,而且天然支持友好,动态下发业务需求能有效的减少包大小,增加启动速度,减少安装时间等等。

    展开全文
  • 最近一直在忙着工作的事,很久没有更新博客了,今天突发奇想要把自己学到的android方面的知识记录下来,方面是为了系统的回顾一下知识点自己的学习路线,另方面希望能帮到更多初学的朋友。学习android开发一定要...

    最近一直在忙着工作的事,很久没有更新博客了,今天突发奇想要把自己学到的android方面的知识记录下来,一方面是为了系统的回顾一下知识点自己的学习路线,另一方面希望能帮到更多初学的朋友。学习android开发一定要有java基础,最好是达到java中级或以上,没有java基础的话根本无法学习android的,所以,希望想走android这条路的朋友一定不要急于求成,先把java基础搞好,不然学习的道路会很艰辛。 

    本博客面向的是有java基础,想学习android知识的同学。首先,从线路方面向各位介绍如何开发一个app。 我理解的软件就是一系列数据的获取、存储、加工、转移、展示,android app也是如此。数据的获取有很多方式,可以从手机内存、缓存、SD卡、网络、数据库中获取,以后会详细讲到这些方式的实现。数据的展示就是app前端的实现了,activity是android显示的“脸面”,所有能看见的都是在activity上展示,其中还包括各种控件、view、viewgroup等。数据的加工就是app中数据的使用了。数据的转移涉及到线程和消息机制的问题,基础的同学慢慢就会了解。概括来说就是,从后端获取数据,展示到app界面上,然后用户操作,再将反馈传给后台取处理。 

    下面从产品的角度说一下app的流水线和公司各个部门的分工。 

    产品开发流程 正常的互联网开发app的流程大致如下: 

    - 产品规划,定产品方向 

    - 需求调研,产出需求文档

     - 需求评审,修订需求文档 

    - 产品狗画app线框图提供给射鸡师 

    - 射鸡师根据线框图设计视觉稿 

    - 程序猿根据视觉稿搭建UI框架 

    - 程序猿根据需求文档开发功能

     - 测试媛编写测试用例,根据排期进行测试

     - 程序猿修复回归测试反馈的bug,提交beta版 

    - 测试通过,提交给运营喵发布到渠道上线 

    上面是笔者的经验总结,可能有不太准确的地方,但大致整个流程是这样,我们开发者要清楚自己在整个产品中充当的角色,明白自己的工作职责即可。 快速搭建项目 Android比没有想象那么难,只是刚开始要学习的东西多,一下子消化不了才会比较茫然,笔者写这篇博客就是想帮助大家整理一下开发思路。 快速搭建项目也算是一项技能,而这项技能只能由你自己来完善,刚开始做开发的时候一定会有很多重复性的工作,如果没有意识去提高自己的开发效率的话,可能你的十年工作经验代表的只是一年的经验用了十年而已。 那要怎么做,笔者提供一个自己总结的,仅供参考: 

    - 定开发规范 

    - 搭建UI框架 

    - 选用开发库集成(或自造轮子) 

    - 第三方服务集成(视情况而定) 

    定开发规范 一个项目一般不会只有一个人独立开发,就算是独立开发,我们也应该定一下开发规范,一般会有什么样的规范? 

    - 命名规范 

    - 代码规范 

    - 代码管理规范 

    命名规范 

    命名规范包括: 

    - 项目命名 

    - 包命名 

    - 类命名、成员变量命名 

    - 资源文件命名 

    我们做每一个产品都会有相应的命名,不要用中文来命名,最好用能表达中文意思的英文来表示,例如CSDN客户端,可以用CSDNClient作为命名,我们创建项目的时候可以以它作为Application name。 可以看看以前写的这篇文章: http://blog.csdn.net/wwj_748/article/details/42347283 

    代码规范 代码规范视语言而定,开发android使用的是Java,自然要按照Java的编码规范进行编码,比如命名采用驼峰命名法,编码的时候也要符合Android的开发规范,比如UI线程不做任何耗时的操作,像网络请求、数据库操作都需要放到子线程中去做,只有UI的刷新才在UI线程中做,像这些规范,可以根据自身在项目遇到的问题来定,定规范的好处就是减少踩坑的几率,提高开发的质量。 

    代码管理 对于一个经常更新迭代的产品,不可能由头到尾不变,这个时候我们需要对代码进行分支管理,最好使用git代码仓库对代码进行管理,作为一个合格的开发者连git都不用实在说不过去,还用svn的童鞋赶紧放弃它投入git的怀抱,它的好处是不言而喻的,自己去体会。 

    搭建UI框架 搭建UI框架需要我们根据产品的导航模式来设计,市场上常用的导航模式有如下图几种: 我们的app如果不出意外一定是其中的一种导航模式,一般线框图出来我们就应该知道即将要开发的app长什么样子,开发者不必等视觉稿和素材出来才开始动工,我们先大致搭个架子,等视觉稿出来之后我们再做调整。 选用开发库 一般我们app涉及到的库会有: 

    - UI框架(比如下拉刷新PullToRefresh、侧滑菜单Slidingmenu) 

    - 网络请求库(比如okhtttp、AndroidAsyncHttp、Volley) 

    - 数据操作库(比如GreenDao、Ormlite) 

    - 图片缓存框架(比如Universal-Imageloader) 

    - 数据解析库(比如Gson) 之所以要选用这些库,肯定是为了避免重复造轮子,在开发效率的角度来说,选用优秀的开源库能大大缩短开发周期和提高开发效率,但从个人提升角度来看的话,我们可能就成了一个只会用API的程序猿了,如果想提升的话,造轮子或者分析这些优秀的源代码是一个不错的途径。 

    第三方服务集成 我们开发app的时候,肯定会遇到一些需求,比如推送的需求、自动升级、数据统计、社会化分享、用户反馈等等,然而对于一个刚起步的企业或者个人开发者的话,全都要自己去开发的话,那岂不是累死,像推送这种有一定的技术门槛,能做好都能成立一家公司了,所以选用一些第三方服务是一个可选之举。如果说你以后做大了,用第三方怕不好控制,那就自己做呗,有钱任性招兵买马就自己做,谁叫咱有钱呢。 前面这些东西开发一个app够了,开发出来能不能用还得有靠谱的测试,有没有crash,操作流不流畅,体验好不好才会有用户去用。这里不从产品的角度去评判一个app的好与坏,程序员要考虑的是从代码层面、性能层面去让我们的app变得更好。

    云测 我们开发完毕之后,需要给测试工程师进行基本的功能需求测试,他们传统的做法就是根据事先写好的测试用例来做回归测试,再把测试出来的bug反馈给工程师,工程师再去修bug,但这样实在是太不靠谱了,有时候我们太在意功能而忽略了一些更重要的东西,那就是体验,给用户最直接的感受就是你这个app够不够惊艳,够不够流畅,用户可能根本就不在乎你这个功能做的有多牛逼。所以我们更应该从非功能性方向去做测试,我们的目的是让用户用的爽,而不是加一些乱七八糟的功能。那怎么测非功能性的一些因素,这里就要提到『云测』这个东西,因为现在设备太多了,如果公司要买一堆设备来做测试,那得多少成本,况且设备更新得太快,你根本就跟不上,所以就有了云测这个东西,它是一个云测试平台服务,提供了一大批主流机型,我们就直接省去购买设备的成本,还能得到完善的测试报告。 再来说一下它的好处: 

    - 终端云,省去测试设备购买租赁成本 

    - 高效率 节省测试人员成本及时间 

    - 包含兼容性测试、性能测试、功能测试 

    - 操作简单、详细测试报告生成 这么多好处,你在缺少测试工程师的时候,不去尝试那实在说不过去。 打包上线 前面的开发环节、测试环节都没问题之后,你离实现一个app的完整开发就不远了,正常的互联网公司,会把签名打包的apk给到运营,交给他们去写文案,上传到应用渠道,让渠道给我们去首发和推广。如果是个人开发者,这些工作就得我们自己做了。 

    总结 本篇博客从整个app开发流程上去给大家梳理了一遍,没有讲太多技术上的东西,但理解app流程对自己把握产品很有益处,虽然我们只是一个小小的开发者,但如果你有追求,哪天轮到你去负责一个产品的时候,你就应该对开发的每一个环节都了如指掌,因为出了问题,你也知道怎么针对性的去解决。笔者虽然只是一个小小的开发者,但也乐于思考,很多时候不太愿意被别人牵着鼻子走,因为我们的人生就应该把握在自己手里。


    展开全文
  • 最近学习Android 开发,发现了一个很好的博客,我按照步骤一步步走,实现了我的第一个android app 把博客地址记录一下,防止忘记: ...

    最近学习Android 开发,发现了一个很好的博客,我按照步骤一步步走,实现了我的第一个android app

    把博客地址记录一下,防止忘记:

    https://www.bonkersabouttech.com/howto/how-to-build-an-android-app-from-scratch/482

    这个博客里还给出了很多android开发的有用网址,

    展开全文
  • Android一个APP内打开另一个APP 首先,第一步,我们要下载那个要打开的app,要安装。 然后我们需要根据它的包名才能进行跳转。 怎么知道它的包名呢? 我的第一个想法,先下载APK.然后解压。 看到熟悉的...
  • 一个android APP 最少有两个线程,一个是IPCThreadState::joinThreadPool 另外 一个是looper 线程,来处理消息队列,请问这两个线程之间如何交互呢?什么时候交互?
  • Android app需要启动一个新进程来运行是从ActivityManagerService中的startProcessLocked开始的 step1: ActivityManaagerService.java/startProcessLocked() call int pid = Process.start("android.app....
  • Android APP的签名

    2018-09-01 18:17:14
    Android项目以它的包名作为唯一的标识,如果在同部手机上安装两包名相同的APP,后者就会覆盖前面安装的应用。为了避免Android APP被随意覆盖,Android要求对APP进行签名。下面介绍对APP进行签名的步骤 1、选择...
  • 作为系统工程师,对这些跑分程序都非常的不屑,这个只能是一个不客观的参考,但客户都喜欢拿这个比较,于是乎,各家各厂都或多或少会针对此优化(甚至是作弊或直接的作假),这可不是什么好现象,浮夸的厉害,到处放...
  • 运行APP显示两个APP图标,一个打不开,删除一个后,另一个也会消失。 可能原因:你添加了两个intent-filter 的LAUNCHER 事件 <intent-filter> <action android:name="android.intent.action.MAIN" />...
  •   Android系统对每个APP一个逻辑内存限制,就算物理内存富余,如果应用超出APP逻辑内存,APP就会出现内存溢出crash。   android app的内存使用分java heapsize和native heapsize,这个逻辑内存限制也就是java...
  • 本节将介绍如何使用Android Studio开发Android APP,和前面Eclipse + ADT + SDK搭建Android开发环境一样,本节也只是介绍一些基本东西,深入的,比如快捷键,小技巧等会再另篇文章中详细地介绍! 1.下载And
  • android app跳转到微信

    2017-12-12 13:48:21
    android app跳转到微信
  • android app 启动第一个页面 <action android:name="android.intent.action.MAIN" />有什么作用呢? <category android:name="android.intent.category.LAUNCHER" />有什么作用呢?
  • 各位大神好! 我正在做一个项目是做一个Android App Bundle...还有一个比较重要的背景信息是这个项目是往一个已有的构建工具里扩展功能,所以大概设计思路就是先复制里面一个做apk的构建工具,然后改逻辑达到目的。
  • 本文是对我在知乎一个回答的整理,其中的内容大多是对我平时的阅读和实践的总结,希望对Android的开发者有所帮助。但毕竟是个人的一些思考,难免有疏漏,也欢迎对本文的内容提出建议。 1. 架构设计的目的  对...
  •  新的应用发布格式 Android App Bundle 是种更有效的方式来构建和发布您的应用。Android App Bundle 让您可以更轻松地以更小的应用程序大小提供出色的体验,从而支持当今各种各样的Android设备。切换很容易。您...
  • 最近在开发一个APP交互时,遇到这样的需求,1、APP拉起第三方的APP,并且传值,2第三方APP拉起我们的APP,并可以根据传递过来的值启动相对应的页面。 我们通过Intent的隐式启动来拉起。 隐式启动拉起第三方APP有三...
1 2 3 4 5 ... 20
收藏数 751,780
精华内容 300,712