精华内容
参与话题
问答
  • 设计模式—build模式

    万次阅读 2017-12-29 07:56:55
    简介Builder模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细的控制对象的构造流程。该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示...

    简介

    Builder模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细的控制对象的构造流程。该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来,两者之间的耦合度也降到最低。

    定义

    将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    使用场景

    1.相同的方法,不同的执行顺序,产生不同的事件结果。(View的封装,对外暴露的方法不同)

    2.多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时

    3.产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用

    4.初始化一个对象特别复杂,如参数特别多且很多都具有默认参数时

    关键点

    原始版-四个角色

    一个产品类—需要被构建的产品

    一个抽象Build类—隔离产品组件的构建

    一个具体构建产品的Build实现类—产品组件的具体构建

    一个组装类—组件与产品的组装

    简易版—两个角色

    一个产品类—需要被构建的产品

    一个Builder类—一般为产品类的静态内部类,负责组件的具体构建和产品的组装

    实现

    例:

    原始版

    /**
     * 产品类-Computer
     */
    public class Computer {
    
        private String mBoard;
        private String mDisplay;
        private String mOS;
    
        public String getmBoard() {
            return mBoard;
        }
    
        public void setmBoard(String mBoard) {
            this.mBoard = mBoard;
        }
    
        public String getmDisplay() {
            return mDisplay;
        }
    
        public void setmDisplay(String mDisplay) {
            this.mDisplay = mDisplay;
        }
    
        public String getmOS() {
            return mOS;
        }
    
        public void setmOS() {
            this.mOS = mOS;
        }
    }
    /**
     * 抽象Build类-构建与产品类相关的部件
     */
    public abstract class Builder {
    
        /**
         *构建主机组件
         */
        public abstract void setBoard(String board);
    
        /**
         * 构建显示器组件
         */
        public abstract void setDisplay(String display);
    
        /**
         * 构建操作系统组件
         */
        public abstract void setOs();
    
        /**
         * 构建产品
         */
        public abstract Computer create();
    }
    /**
     * 抽象Build的实现类-真正构建产品的类
     */
    public class ComputerBuilder extends Builder {
    
        private Computer computer = new Computer();
    
        @Override
        public void setBoard(String board) {
            computer.setmBoard(board);
        }
    
        @Override
        public void setDisplay(String display) {
            computer.setmDisplay(display);
        }
    
        @Override
        public void setOs() {
            computer.setmOS();
        }
    
        @Override
        public Computer create() {
            return computer;
        }
    }
    /**
     * 组装类:将builder构建的产品部件组装成产品,对外隐藏内部组装细节
     */
    public class Director {
    
        private Builder mBuilder;
    
        public Director(Builder builder) {
            this.mBuilder = builder;
        }
    
        public void construct(String board, String display) {
            mBuilder.setBoard(board);
            mBuilder.setDisplay(display);
            mBuilder.setOs();
        }
    }

    使用

    Builder builder = new ComputerBuilder();
            Director director = new Director(builder);
            director.construct("因特尔主板", "三星显示器");
            Computer computer = builder.create();

    简易版

    `/**
    * 产品类-Computer
    */
    public class Computer {

    private String mBoard;
    private String mDisplay;
    private String mOS;
    
    public String getmBoard() {
        return mBoard;
    }
    
    public void setmBoard(String mBoard) {
        this.mBoard = mBoard;
    }
    
    public String getmDisplay() {
        return mDisplay;
    }
    
    public void setmDisplay(String mDisplay) {
        this.mDisplay = mDisplay;
    }
    
    public String getmOS() {
        return mOS;
    }
    
    public void setmOS() {
        this.mOS = mOS;
    }
    
    
    public static class Builder {
    
        private String mBoard;
        private String mDisplay;
        private String mOS;
    
        public Builder setBoard(String board) {
            this.mBoard = board;
            return this;
        }
    
        public Builder setDisplay(String display) {
            this.mDisplay = display;
            return this;
        }
    
        public Builder setOs() {
            return this;
        }
    
        /**
         * 组装产品
         */
        private void construct(Computer computer) {
            computer.setmBoard(mBoard);
            computer.setmDisplay(mDisplay);
            computer.setmOS();
        }
    
        public Computer create() {
            Computer computer = new Computer();
            construct(computer);
            return computer;
        }
    }
    
    使用
    Computer computer = new Computer.Builder().setBoard("")
                    .setDisplay("")
                    .setOs()
                    .create();

    小结

    Builder模式通常作为配置类的构建器将配置的构建和表示分离开来,同时也是将配置从目标类中隔离出来,避免作为过多的setter方法。Builder模式比较常见的实现形式是通过链式调用,这样使得代码更加简洁、易懂。

    优点:

    1.良好的封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节

    2.建造者独立,容易扩展

    缺点:

    会产生多余的Builder对象以及Director对象,消耗内存。

    展开全文
  • Maven build之pom.xml文件中的Build配置

    万次阅读 多人点赞 2018-03-28 14:44:50
    maven是什么,用通俗的话来将,maven能帮你构建工程,管理jar包,编译代码,还能帮你自动运行单元测试,打包,生成报表,甚至能帮你部署项目使用maven构建的项目均可以直接使用maven build完成项目的编译测试打包,...
    前言

    在阅读详细文档之前我们先来谈谈我自己对maven的一些个人理解,以助于从整体大局上了解maven。
    • maven是什么,用通俗的话来将,maven能帮你构建工程,管理jar包,编译代码,还能帮你自动运行单元测试,打包,生成报表,甚至能帮你部署项目
    • 使用maven构建的项目均可以直接使用maven build完成项目的编译测试打包,无需额外配置
    • Maven是通过pom.xml来执行任务的,其中的build标签描述了如何来编译及打包项目,而具体的编译和打包工作是通过build中配置的 plugin 来完成。当然plugin配置不是必须的,默认情况下,Maven 会绑定以下几个插件来完成基本操作。
    即在没有配置的情况下,执行mvn clean install时,maven会调用默认的plugin来完成编译打包操作,具体来讲,执行mvn clean install时会执行
    maven-clean-plugin:2.5:clean (default-clean)
    maven-resources-plugin:2.6:resources (default-resources)
    maven-compiler-plugin:3.1:compile (default-compile)
    maven-resources-plugin:2.6:testResources (default-testResources)
    maven-compiler-plugin:3.1:testCompile (default-testCompile)
    maven-surefire-plugin:2.12.4:test (default-test)
    maven-jar-plugin:2.4:jar (default-jar)
    maven-install-plugin:2.4:install (default-install)
    等plugin
    • 4.如果有需要可以针对各个 plugin 进行特殊配置,需要在pom.xml中的<plugins>标签中显示指定 plugin 和 属性配置。

    如上配置了maven-compiler-plugin的版本和编译时使用的jdk版本

    POM.XML的build标签
    在Maven的pom.xml文件中,Build相关配置包含两个部分,一个是<build>,另一个是<reporting>,这里我们只介绍<build>。

    1.pom.xml中的两种build
    在Maven的pom.xml文件中,存在如下两种<build>:

    说明:
    一种<build>被称为Project Build,即是<project>的直接子元素。另一种<build>被称为Profile Build,即是<profile>的直接子元素。
    Profile Build包含了基本的build元素,而Project Build还包含两个特殊的元素,即各种<...Directory>和<extensions>。

    2.Profile Build和Project Build的共有元素
    1) 共用的基本build元素
    示例如下:

    说明:
    • defaultGoal,执行构建时默认的goal或phase,如jar:jar或者package等
    • directory,构建的结果所在的路径,默认为${basedir}/target目录
    • finalName,构建的最终结果的名字,该名字可能在其他plugin中被改变

    2) <resources>
    资源往往不是代码,无需编译,而是一些properties或XML配置文件,构建过程中会往往会将资源文件从源路径复制到指定的目标路径。
    <resources>给出各个资源在Maven项目中的具体路径。示例如下:

    说明:
    • resources,build过程中涉及的资源文件
    • targetPath,资源文件的目标路径
    • filtering,构建过程中是否对资源进行过滤,默认false
    • directory,资源文件的路径,默认位于${basedir}/src/main/resources/目录下
    • includes,一组文件名的匹配模式,被匹配的资源文件将被构建过程处理
    • excludes,一组文件名的匹配模式,被匹配的资源文件将被构建过程忽略。同时被includes和excludes匹配的资源文件,将被忽略。
    • filters,给出对资源文件进行过滤的属性文件的路径,默认位于${basedir}/src/main/filters/目录下。属性文件中定义若干键值对。在构建过程中,对于资源文件中出现的变量(键),将使用属性文件中该键对应的值替换。
    • testResources,test过程中涉及的资源文件,默认位于${basedir}/src/test/resources/目录下。这里的资源文件不会被构建到目标构件中

    3) <plugins>
    <plugins>给出构建过程中所用到的插件。

    说明:
    • groupId
    • artifactId
    • version
    • extensions,是否加载该插件的扩展,默认false
    • inherited,该插件的configuration中的配置是否可以被(继承该POM的其他Maven项目)继承,默认true
    • configuration,该插件所需要的特殊配置,在父子项目之间可以覆盖或合并
    • dependencies,该插件所特有的依赖类库
    • executions,该插件的某个goal(一个插件中可能包含多个goal)的执行方式。一个execution有如下设置:
    • id,唯一标识
    • goals,要执行的插件的goal(可以有多个),如<goal>run</goal>
    • phase,插件的goal要嵌入到Maven的phase中执行,如verify
    • inherited,该execution是否可被子项目继承
    • configuration,该execution的其他配置参数
    4) <pluginManagement>
    在<build>中,<pluginManagement>与<plugins>并列,两者之间的关系类似于<dependencyManagement>与<dependencies>之间的关系。<pluginManagement>中也配置<plugin>,其配置参数与<plugins>中的<plugin>完全一致。只是,<pluginManagement>往往出现在父项目中,其中配置的<plugin>往往通用于子项目。子项目中只要在<plugins>中以<plugin>声明该插件,该插件的具体配置参数则继承自父项目中<pluginManagement>对该插件的配置,从而避免在子项目中进行重复配置。

    3. Project Build特有的<...Directory>
    往往配置在父项目中,供所有父子项目使用。示例如下:

    目录可以使用绝对路径,如示例所示。如果使用相对路径,则所有的相对路径都是在${basedir}目录下。

    4. Project Build特有的<extensions>
    <extensions>是执行构建过程中可能用到的其他工具,在执行构建的过程中被加入到classpath中。
    也可以通过<extensions>激活构建插件,从而改变构建的过程。
    通常,通过<extensions>给出通用插件的一个具体实现,用于构建过程。
    <extensions>的使用示例如下:


    ==================================================================
    ****************************** maven默认的输入输出目录 ************************************
    ==================================================================


    构建Maven项目的时候,如果没有进行特殊的配置,Maven会按照标准的目录结构查找和处理各种类型文件。

    src/main/java和src/test/java 
    这两个目录中的所有*.java文件会分别在comile和test-comiple阶段被编译,编译结果分别放到了target/classes和targe/test-classes目录中,但是这两个目录中的其他文件都会被忽略掉。
    src/main/resouces和src/test/resources
    这两个目录中的文件也会分别被复制到target/classes和target/test-classes目录中。

    当是web项目时,会在target下生成myproject目录,myproject是你的项目名
    src/main/webapps
    这个目录中的文件会被复制到target/myProject目录中
    target/classes
    默认会把这个目录中的所有内容复制到target/myProject/WEB-INF/classes目录中
    Dependency
    默认会将项目的依赖复制到target/myProject/WEB-INF/lib




    展开全文
  • build

    2019-09-24 07:05:07
    总的build``` // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { google() jcenter() } dependencies { classpath 'c...

    总的build```
    // Top-level build file where you can add configuration options common to all sub-projects/modules.

    buildscript {

    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
    
        classpath 'com.android.tools.build:gradle:3.1.3'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
        //项目的build.gradle中添加
        classpath 'com.jakewharton:butterknife-gradle-plugin:9.0.0-rc1'
    
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
    

    }

    allprojects {
    repositories {
    google()
    jcenter()
    maven { url ‘https://jitpack.io’ }
    }
    }

    task clean(type: Delete) {
    delete rootProject.buildDir
    }

    项目下的build
    
    

    apply plugin: ‘com.android.application’
    //添加以下apply
    apply plugin: ‘com.jakewharton.butterknife’
    apply plugin: ‘org.greenrobot.greendao’

    android {
    compileSdkVersion 28
    defaultConfig {
    applicationId “com.lmx.shopcar”
    minSdkVersion 15
    targetSdkVersion 28
    versionCode 1
    versionName “1.0”
    testInstrumentationRunner “android.support.test.runner.AndroidJUnitRunner”
    }
    buildTypes {
    release {
    minifyEnabled false
    proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
    }
    }

    configurations.all {
        resolutionStrategy.eachDependency { DependencyResolveDetails details ->
            def requested = details.requested
            if (requested.group == 'com.android.support') {
                if (!requested.name.startsWith("multidex")) {
                    details.useVersion '28.0.0'
                }
            }
        }
    }
    

    }

    //添加GreenDao的配置
    greendao {
    schemaVersion 1//数据库版本号,必须依次增大,用来判断数据库版本,是否需要更新
    daoPackage ‘com.lmx.shopcar.greendao’//设置DaoMaster、DaoSession、Dao包名
    targetGenDir ‘src/main/java’//设置DaoMaster、DaoSession、Dao目录
    }

    dependencies {
    implementation fileTree(include: [’*.jar’], dir: ‘libs’)
    implementation ‘com.android.support:appcompat-v7:28.0.0’
    implementation ‘com.android.support.constraint:constraint-layout:1.1.3’
    testImplementation ‘junit:junit:4.12’
    androidTestImplementation ‘com.android.support.test?1.0.2’
    androidTestImplementation ‘com.android.support.test.espresso:espresso-core:3.0.2’
    implementation ‘cn.yipianfengye.android:zxing-library:2.2’
    //导入eventBus的依赖
    implementation ‘org.greenrobot:eventbus:3.1.1’
    implementation ‘com.squareup.okhttp3:okhttp:3.2.0’
    //ok 日志的拦截器
    implementation ‘com.squareup.okhttp3:logging-interceptor:3.12.0’
    implementation ‘com.google.code.gson:gson:2.8.5’
    implementation ‘com.github.bumptech.glide:glide:4.9.0’
    implementation ‘com.jcodecraeer:xrecyclerview:1.5.9’
    //有时导一个依赖会报错 加上这个就可以了
    implementation ‘com.android.support:design:28.0.0’
    //导入GreenDao依赖
    implementation ‘org.greenrobot:greendao:3.2.2’
    implementation ‘com.jakewharton:butterknife:9.0.0-rc1’
    annotationProcessor ‘com.jakewharton:butterknife-compiler:9.0.0-rc1’
    //导入RetroFit依赖
    implementation ‘com.squareup.okhttp3:logging-interceptor:3.11.0’
    implementation ‘com.squareup.retrofit2:retrofit:2.3.0’
    implementation ‘io.reactivex:rxandroid:1.2.1’
    implementation ‘io.reactivex:rxjava:1.3.0’
    implementation ‘com.hwangjr.rxbus:rxbus:1.0.6’
    implementation ‘com.squareup.retrofit2:converter-gson:2.1.0’
    implementation ‘com.squareup.retrofit2:adapter-rxjava:2.0.2’
    implementation ‘com.github.xiaohaibin:XBanner:1.6.4’
    //省市区
    implementation ‘com.contrarywind:Android-PickerView:4.1.6’

    implementation 'com.github.lovetuzitong:MultiImageSelector:1.2'
    //如果使用图片加载框架,添加依赖,下面用Glide示例
    implementation 'com.github.bumptech.glide:glide:3.6.1'
    implementation 'com.jaikydota.imagespickers:imagespickers:1.0.6'
    //Fresco图片加载框架
    implementation 'com.facebook.fresco:fresco:1.12.1'
    

    }

    清单文件
    
    
    <?xml version="1.0" encoding="utf-8"?>

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
    <application
        android:name=".MyApp"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:usesCleartextTraffic="true">
        <activity android:name=".LoginActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity" />
        <activity android:name=".DetailsActivity" />
        <activity android:name=".MoreActivity" />
        <activity android:name=".viewpager.mine.Parsonal_dataActivity" />
        <activity android:name=".viewpager.mine.AddressActivity" />
        <activity android:name=".viewpager.mine.AddAddressActivity" />
        <activity android:name=".Publishing_circlesActivity" />
        <activity android:name=".CreateorderActivity" />
        <activity android:name=".PaymentActivity" />
        <activity android:name=".EvaluateActivity" />
        <activity android:name=".viewpager.mine.FootprintActivity" />
        <activity android:name=".viewpager.mine.UpdateAddressActivity" />
        <activity android:name=".viewpager.mine.ConsumptionActivity" />
        <activity android:name=".viewpager.mine.MineCircleActivity" />
        <activity android:name=".SearchActivity"></activity>
    </application>
    
    ```
    展开全文
  • Build

    2019-06-23 17:21:22
    public class Build { //当一个版本属性不知道时所设定的值。 public static final String UNKNOWN = "unknown"; //修订版本列表码 public static final String ID = getString("ro.build.id"); //显示屏参数 ...

    public class Build {

    //当一个版本属性不知道时所设定的值。

    public static final String UNKNOWN = "unknown";

    //修订版本列表码

    public static final String ID = getString("ro.build.id");

    //显示屏参数

    public static final String DISPLAY = getString("ro.build.display.id");

    //整个产品的名称

    public static final String PRODUCT = getString("ro.product.name");

    //设备参数

    public static final String DEVICE = getString("ro.product.device");

    //主板

    public static final String BOARD = getString("ro.product.board");

    //cpu指令集

    public static final String CPU_ABI = getString("ro.product.cpu.abi");

    //cpu指令集2

    public static final String CPU_ABI2 = getString("ro.product.cpu.abi2");

    //硬件制造商

    public static final String MANUFACTURER = getString("ro.product.manufacturer");

    //系统定制商

    public static final String BRAND = getString("ro.product.brand");

    //版本即最终用户可见的名称

    public static final String MODEL = getString("ro.product.model");

    //系统启动程序版本号

    public static final String BOOTLOADER = getString("ro.bootloader");

    //硬件名称

    public static final String HARDWARE = getString("ro.hardware");

    //硬件序列号

    public static final String SERIAL = getString("ro.serialno");

    //build的类型

    public static final String TYPE = getString("ro.build.type");

    //描述build的标签,如未签名,debug等等。

    public static final String TAGS = getString("ro.build.tags");

    //唯一识别码

    public static final String FINGERPRINT = getString("ro.build.fingerprint");

     

    public static final long TIME = getLong("ro.build.date.utc") * 1000;

    public static final String USER = getString("ro.build.user");

    public static final String HOST = getString("ro.build.host");

    //获取无线电固件版本

    public static String getRadioVersion() {

    return SystemProperties.get(TelephonyProperties.PROPERTY_BASEBAND_VERSION, null);

    }

     

    private static String getString(String property) {

    return SystemProperties.get(property, UNKNOWN);

    }

     

    private static long getLong(String property) {

    try {

    return Long.parseLong(SystemProperties.get(property));

    } catch (NumberFormatException e) {

    return -1;

    }

    }

     

    //各种版本字符串

    public static class VERSION {

    public static final String INCREMENTAL = getString("ro.build.version.incremental");

    public static final String RELEASE = getString("ro.build.version.release");

    public static final int SDK_INT = SystemProperties.getInt(

    "ro.build.version.sdk", 0);

    public static final String CODENAME = getString("ro.build.version.codename");

    }

     

    //目前已知的版本代码的枚举类

    public static class VERSION_CODES {

    public static final int CUR_DEVELOPMENT = 10000;

     

    /** * October 2008: The original, first, version of Android. Yay! */

    public static final int BASE = 1;

     

    /** * February 2009: First Android update, officially called 1.1. */

    public static final int BASE_1_1 = 2;

     

    /** * May 2009: Android 1.5. */

    public static final int CUPCAKE = 3;

     

    /** * September 2009: Android 1.6. */

    public static final int DONUT = 4;

     

    /** * November 2009: Android 2.0 */

    public static final int ECLAIR = 5;

     

    /** * December 2009: Android 2.0.1 */

    public static final int ECLAIR_0_1 = 6;

     

    /** * January 2010: Android 2.1 */

    public static final int ECLAIR_MR1 = 7;

     

    /** * June 2010: Android 2.2 */

    public static final int FROYO = 8;

     

    /** * November 2010: Android 2.3 */

    public static final int GINGERBREAD = 9;

     

    /** * February 2011: Android 2.3.3. */

    public static final int GINGERBREAD_MR1 = 10;

     

    /** * February 2011: Android 3.0. */

    public static final int HONEYCOMB = 11;

     

    /** * May 2011: Android 3.1. */

    public static final int HONEYCOMB_MR1 = 12;

     

    /** * June 2011: Android 3.2. */

    public static final int HONEYCOMB_MR2 = 13;

     

    /** * October 2011: Android 4.0. */

    public static final int ICE_CREAM_SANDWICH = 14;

     

    /** * December 2011: Android 4.0.3. */

    public static final int ICE_CREAM_SANDWICH_MR1 = 15;

     

    /** * June 2012: Android 4.1. */

    public static final int JELLY_BEAN = 16;

     

    /** * Android 4.2: Moar jelly beans! */

    public static final int JELLY_BEAN_MR1 = 17;

     

    /** * Android 4.3: Jelly Bean MR2, the revenge of the beans. */

    public static final int JELLY_BEAN_MR2 = 18;

     

    /** * Android 4.4: KitKat, another tasty treat. */

    public static final int KITKAT = 19;

    }

     

    }

    下面举个例子:

    /** * 获取设备信息 * * @return */private String getDeviceInfo() {

    StringBuffer sb = new StringBuffer();

    sb.append(主板: + Build.BOARD);

    sb.append(系统启动程序版本号: + Build.BOOTLOADER);

    sb.append(系统定制商: + Build.BRAND);

    sb.append(cpu指令集: + Build.CPU_ABI);

    sb.append(cpu指令集2 + Build.CPU_ABI2);

    sb.append(设置参数: + Build.DEVICE);

    sb.append(显示屏参数: + Build.DISPLAY);

    sb.append(www.2cto.com无线电固件版本: + Build.getRadioVersion());

    sb.append(硬件识别码: + Build.FINGERPRINT);

    sb.append(硬件名称: + Build.HARDWARE);

    sb.append(HOST: + Build.HOST);

    sb.append(修订版本列表: + Build.ID);

    sb.append(硬件制造商: + Build.MANUFACTURER);

    sb.append(版本: + Build.MODEL);

    sb.append(硬件序列号: + Build.SERIAL);

    sb.append(手机制造商: + Build.PRODUCT);

    sb.append(描述Build的标签: + Build.TAGS);

    sb.append(TIME: + Build.TIME);

    sb.append(builder类型: + Build.TYPE);

    sb.append(USER: + Build.USER);

    return sb.toString();

    }

    2、ActivityManager获取内存信息

    在ActivityManager里面有个getMemoryInfo函数,可以获取到内存信息。

    public void getMemoryInfo(MemoryInfo outInfo) {

    try {

    ActivityManagerNative.getDefault().getMemoryInfo(outInfo);

    } catch (RemoteException e) {

    }

    }

    下面我们来看看MemoryInfo这个类:

    public static class MemoryInfo implements Parcelable {

    public long availMem;

    public long totalMem;

    public long threshold;

    public boolean lowMemory;

     

    public MemoryInfo() {

    }

     

    public int describeContents() {

    return 0;

    }

     

    public void writeToParcel(Parcel dest, int flags) {

    dest.writeLong(availMem);

    dest.writeLong(totalMem);

    dest.writeLong(threshold);

    dest.writeInt(lowMemory ? 1 : 0);

    dest.writeLong(hiddenAppThreshold);

    dest.writeLong(secondaryServerThreshold);

    dest.writeLong(visibleAppThreshold);

    dest.writeLong(foregroundAppThreshold);

    }

     

    public void readFromParcel(Parcel source) {

    availMem = source.readLong();

    totalMem = source.readLong();

    threshold = source.readLong();

    lowMemory = source.readInt() != 0;

    hiddenAppThreshold = source.readLong();

    secondaryServerThreshold = source.readLong();

    visibleAppThreshold = source.readLong();

    foregroundAppThreshold = source.readLong();

    }

     

    public static final Creator<MemoryInfo> CREATOR

    = new Creator<MemoryInfo>() {

    public MemoryInfo createFromParcel(Parcel source) {

    return new MemoryInfo(source);

    }

    public MemoryInfo[] newArray(int size) {

    return new MemoryInfo[size];

    }

    };

     

    private MemoryInfo(Parcel source) {

    readFromParcel(source);

    }

    }

    另外,需要说明的是,我们可以直接读取系统的一个文件来获取内存信息。这个文件目录为:/proc/meminfo 

    如下图:

    3、获取SDCard存储

    /** * 获得SD卡总大小 * * @return */

    private String getSDTotalSize() {

    File path = Environment.getExternalStorageDirectory();

    StatFs stat = new StatFs(path.getPath());

    long blockSize = stat.getBlockSize();

    long totalBlocks = stat.getBlockCount();

    return Formatter.formatFileSize(MainActivity.this, blockSize * totalBlocks);

    }

     

    /** * 获得sd卡剩余容量,即可用大小 * * @return */

    private String getSDAvailableSize() {

    File path = Environment.getExternalStorageDirectory();

    StatFs stat = new StatFs(path.getPath());

    long blockSize = stat.getBlockSize();

    long availableBlocks = stat.getAvailableBlocks();

    return Formatter.formatFileSize(MainActivity.this, blockSize * availableBlocks);

    }

     

    /** * 获得机身内存总大小 * * @return */

    private String getRomTotalSize() {

    File path = Environment.getDataDirectory();

    StatFs stat = new StatFs(path.getPath());

    long blockSize = stat.getBlockSize();

    long totalBlocks = stat.getBlockCount();

    return Formatter.formatFileSize(MainActivity.this, blockSize * totalBlocks);

    }

     

    /** * 获得机身可用内存 * * @return */

    private String getRomAvailableSize() {

    File path = Environment.getDataDirectory();

    StatFs stat = new StatFs(path.getPath());

    long blockSize = stat.getBlockSize();

    long availableBlocks = stat.getAvailableBlocks();

    return Formatter.formatFileSize(MainActivity.this, blockSize * availableBlocks);

    }

    另外,我们可以通过StorageManager来获取其他的信息,但需要注意的是有些方法需要使用反射来调用,因为它们是不可见的。

    4、读取CPU信息

    我们可以读取系统目录下/proc/cpuinfo的文件来获取CPU信息。如下图所示,事实上,我们可以查看/proc目录的所有文件,来查看各种信息。

     

    /proc/cmdline:显示内核启动的命令行。

    /proc/cpuinfo:显示系统cpu的信息。

    /proc/filesystems,显示当前注册了的文件系统列表,nodev表示为虚拟文件系统。

    /proc/interrupts:显示当前系统的中断信息.

    /proc/ioports:被占用的输入/输出地址范围列表。

    /proc/kmsg:输出内核消息日志。

    /proc/loadavg:监控cpu平均负载,其数值为所有核上cpu占用的累加值,前三个分别表示最近1、5、15分钟的平均负载,第四个表示当前运行进程数和进程总数,最后一个表示最近运行的进程id。

    /proc/locks:打开文件上的加锁信息。

    /proc/meminfo:显示物理及虚拟内存使用情况。

    /proc/misc:内核函数misc_register登记的设备驱动程序。

    /proc/modules:加载的内核模块列表。

    /proc/mounts:当前系统所安装的文件系统信息(包括手动安装的)。

    /proc/stat:系统简要信息。

    /proc/uptime:分别表示系统启动时间和系统空闲时间。

    /proc/version:系统内核版本。

    /proc/net:其实际挂载点是/proc/self/net,能够显示当前各种网络情况,例如通过tcp文件可以查看tcp连接数及连接情况。

    /proc/sys 报告各种不同的内核参数,某些参数能在root的情况下进行修改。

    /proc/devices 当前挂载的所有软硬件设备(字符设备和块设备),包括主设备号和设备名称。

    /proc/asound:声卡相关的信息。

    /proc/buddyinfo:每个内存区中每个order有多少块可用,和内存碎片问题有关。

    /proc/bus:输入设备信息。

    /proc/cgroups:查看cgroups子系统信息。

    /proc/diskstats:用于显示磁盘、分区和统计信息。

    /proc/execdomains:安全相关的信息。

    /proc/fb:帧缓冲设备信息。

    /proc/iomem:记录物理地址的分配情况。

    /proc/kallsyms:内核符号表信息。

    /proc/pagetypeinfo:内存分页信息。

    /proc/partitions:分区信息

    /proc/sched_debug:cpu调度信息。

    /proc/softirqs:软中断情况。

    /proc/vmallocinfo:vmalloc内存分配信息。

    /proc/vmstat:统计虚拟内存信息。

    /proc/pid:显示进城相关的所有信息。

    5、获取电池电量信息

    获取到电池信息一般可以通过两个类获取:android.content.BroadcastReceiver类和android.os.BatteryManager类

    在BroadcastReceiver的onReceive()事件,接收到的Intent.ACTION_BATTERY_CHANGED,包括下面的信息:

     

    “status”(int类型)…状态,定义值是BatteryManager.BATTERY_STATUS_XXX。

    “health”(int类型)…健康,定义值是BatteryManager.BATTERY_HEALTH_XXX。

    “present”(boolean类型)

    “level”(int类型)…电池剩余容量

    “scale”(int类型)…电池最大值。通常为100。

    “icon-small”(int类型)…图标ID。

    “plugged”(int类型)…连接的电源插座,定义值是BatteryManager.BATTERY_PLUGGED_XXX。

    “voltage”(int类型)…mV。

    “temperature”(int类型)…温度,0.1度单位。例如 表示197的时候,意思为19.7度。

    “technology”(String类型)…电池类型,例如,Li-ion等等。

    public class BatteryTestActivity extends Activity {

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    }

     

    @Override

    protected void onResume() {

    super.onResume();

     

    IntentFilter filter = new IntentFilter();

     

    filter.addAction(Intent.ACTION_BATTERY_CHANGED);

    registerReceiver(mBroadcastReceiver, filter);

    }

     

    @Override

    protected void onPause() {

    super.onPause();

     

    unregisterReceiver(mBroadcastReceiver);

    }

     

    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {

    @Override

    public void onReceive(Context context, Intent intent) {

    String action = intent.getAction();

    if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {

    int status = intent.getIntExtra("status", 0);

    int health = intent.getIntExtra("health", 0);

    boolean present = intent.getBooleanExtra("present", false);

    int level = intent.getIntExtra("level", 0);

    int scale = intent.getIntExtra("scale", 0);

    int icon_small = intent.getIntExtra("icon-small", 0);

    int plugged = intent.getIntExtra("plugged", 0);

    int voltage = intent.getIntExtra("voltage", 0);

    int temperature = intent.getIntExtra("temperature", 0);

    String technology = intent.getStringExtra("technology");

     

    String statusString = "";

     

    switch (status) {

    case BatteryManager.BATTERY_STATUS_UNKNOWN:

    statusString = "unknown";

    break;

    case BatteryManager.BATTERY_STATUS_CHARGING:

    statusString = "charging";

    break;

    case BatteryManager.BATTERY_STATUS_DISCHARGING:

    statusString = "discharging";

    break;

    case BatteryManager.BATTERY_STATUS_NOT_CHARGING:

    statusString = "not charging";

    break;

    case BatteryManager.BATTERY_STATUS_FULL:

    statusString = "full";

    break;

    }

     

    String healthString = "";

     

    switch (health) {

    case BatteryManager.BATTERY_HEALTH_UNKNOWN:

    healthString = "unknown";

    break;

    case BatteryManager.BATTERY_HEALTH_GOOD:

    healthString = "good";

    break;

    case BatteryManager.BATTERY_HEALTH_OVERHEAT:

    healthString = "overheat";

    break;

    case BatteryManager.BATTERY_HEALTH_DEAD:

    healthString = "dead";

    break;

    case BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE:

    healthString = "voltage";

    break;

    case BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE:

    healthString = "unspecified failure";

    break;

    }

     

    String acString = "";

     

    switch (plugged) {

    case BatteryManager.BATTERY_PLUGGED_AC:

    acString = "plugged ac";

    break;

    case BatteryManager.BATTERY_PLUGGED_USB:

    acString = "plugged usb";

    break;

    }

     

    Log.v("status", statusString);

    Log.v("health", healthString);

    Log.v("present", String.valueOf(present));

    Log.v("level", String.valueOf(level));

    Log.v("scale", String.valueOf(scale));

    Log.v("icon_small", String.valueOf(icon_small));

    Log.v("plugged", acString);

    Log.v("voltage", String.valueOf(voltage));

    Log.v("temperature", String.valueOf(temperature));

    Log.v("technology", technology);

    }

    }

    };

    }

    应用程序为了取得电池的状态,通常的做法是监听ACTION_BATTERY_CHANGED这个intent,只能在收到这个intent的时候才能取得电池的状态信息,有没有同步取得电池信息的办法呢?

    实际上,系统driver维护着保存电池信息的一组文件。

     

    /sys/class/power_supply/ac/online AC电源连接状态

    /sys/class/power_supply/usb/online USB电源连接状态

    /sys/class/power_supply/battery/status 充电状态

    /sys/class/power_supply/battery/health 电池状态

    /sys/class/power_supply/battery/present 使用状态

    /sys/class/power_supply/battery/capacity 电池level

    /sys/class/power_supply/battery/batt_vol 电池电压

    /sys/class/power_supply/battery/batt_temp 电池温度

    /sys/class/power_supply/battery/technology 电池技术

    当电池状态发生变化时,driver会更新这些文件,因此在应用程序中通过读取这些文件的办法,可以做到同步取得电池信息。

    6、获取手机各种状态信息

     

    TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE); /*

    * 电话状态:

    * 1.tm.CALL_STATE_IDLE=0 无活动

    * 2.tm.CALL_STATE_RINGING=1 响铃

    * 3.tm.CALL_STATE_OFFHOOK=2 摘机

    */ tm.getCallState();//int /*

    * 电话方位:

    * */ tm.getCellLocation();//CellLocation /*

    * 唯一的设备ID:

    * GSM手机的 IMEI 和 CDMA手机的 MEID.

    * Return null if device ID is not available.

    */ tm.getDeviceId();//String /*

    * 设备的软件版本号:

    * 例如:the IMEI/SV(software version) for GSM phones.

    * Return null if the software version is not available.

    */ tm.getDeviceSoftwareVersion();//String /*

    * 手机号:

    * GSM手机的 MSISDN.

    * Return null if it is unavailable.

    */ tm.getLine1Number();//String /*

    * 附近的电话的信息:

    * 类型:List<NeighboringCellInfo>

    * 需要权限:android.Manifest.permission#ACCESS_COARSE_UPDATES

    */ tm.getNeighboringCellInfo();//List<NeighboringCellInfo> /*

    * 获取ISO标准的国家码,即国际长途区号。

    * 注意:仅当用户已在网络注册后有效。

    * 在CDMA网络中结果也许不可靠。

    */ tm.getNetworkCountryIso();//String /*

    * MCC+MNC(mobile country code + mobile network code)

    * 注意:仅当用户已在网络注册时有效。

    * 在CDMA网络中结果也许不可靠。

    */ tm.getNetworkOperator();//String /*

    * 按照字母次序的current registered operator(当前已注册的用户)的名字

    * 注意:仅当用户已在网络注册时有效。

    * 在CDMA网络中结果也许不可靠。

    */ tm.getNetworkOperatorName();//String /*

    * 当前使用的网络类型:

    * 例如: NETWORK_TYPE_UNKNOWN 网络类型未知 0

    NETWORK_TYPE_GPRS GPRS网络 1

    NETWORK_TYPE_EDGE EDGE网络 2

    NETWORK_TYPE_UMTS UMTS网络 3

    NETWORK_TYPE_HSDPA HSDPA网络 8

    NETWORK_TYPE_HSUPA HSUPA网络 9

    NETWORK_TYPE_HSPA HSPA网络 10

    NETWORK_TYPE_CDMA CDMA网络,IS95A 或 IS95B. 4

    NETWORK_TYPE_EVDO_0 EVDO网络, revision 0. 5 NETWORK_TYPE_EVDO_A EVDO网络, revision A. 6

    NETWORK_TYPE_1xRTT 1xRTT网络 7

    */ tm.getNetworkType();//int /*

    * 手机类型:

    * 例如: PHONE_TYPE_NONE 无信号

    PHONE_TYPE_GSM GSM信号

    PHONE_TYPE_CDMA CDMA信号

    */ tm.getPhoneType();//int /*

    * Returns the ISO country code equivalent for the SIM provider's country code.

    * 获取ISO国家码,相当于提供SIM卡的国家码。

    * */ tm.getSimCountryIso();//String /*

    * Returns the MCC+MNC (mobile country code + mobile network code) of the provider of the SIM. 5 or 6 decimal digits.

    * 获取SIM卡提供的移动国家码和移动网络码.5或6位的十进制数字.

    * SIM卡的状态必须是 SIM_STATE_READY(使用getSimState()判断).

    */ tm.getSimOperator();//String /*

    * 服务商名称:

    * 例如:中国移动、联通

    * SIM卡的状态必须是 SIM_STATE_READY(使用getSimState()判断).

    */ tm.getSimOperatorName();//String /*

    * SIM卡的序列号:

    * 需要权限:READ_PHONE_STATE

    */ tm.getSimSerialNumber();//String /*

    * SIM的状态信息:

    * SIM_STATE_UNKNOWN 未知状态 0

    SIM_STATE_ABSENT 没插卡 1

    SIM_STATE_PIN_REQUIRED 锁定状态,需要用户的PIN码解锁 2 SIM_STATE_PUK_REQUIRED 锁定状态,需要用户的PUK码解锁 3

    SIM_STATE_NETWORK_LOCKED 锁定状态,需要网络的PIN码解锁 4 SIM_STATE_READY 就绪状态 5 */ tm.getSimState();//int /*

    * 唯一的用户ID:

    * 例如:IMSI(国际移动用户识别码) for a GSM phone.

    * 需要权限:READ_PHONE_STATE

    */ tm.getSubscriberId();//String /*

    * 取得和语音邮件相关的标签,即为识别符

    * 需要权限:READ_PHONE_STATE

    */ tm.getVoiceMailAlphaTag();//String /*

    * 获取语音邮件号码:

    * 需要权限:READ_PHONE_STATE

    */ tm.getVoiceMailNumber();//String /*

    * ICC卡是否存在

    */ tm.hasIccCard();//boolean /*

    * 是否漫游:

    * (在GSM用途下)

    */ tm.isNetworkRoaming();//

    值得注意的是,这个需要android.permission.READ_PHONE_STATE权限。

    6、获取流量信息

    有两种方法,一种是使用TrafficStats类,另一种就是读取系统流量文件:/proc/net/xt_qtaguid/stats

    关于第一种方法:参考文章:Android中TrafficStats流量监控类

    参考文章: 

    获取Android手机各种状态信息

    Android 获取系统 cpu 信息,内存,版本,电量等信息

    Android系统/proc目录详解

    Android获取SD卡总容量,可用大小,机身内存总容量及可用大小的系统方法

    Android Low Memory Killer

    展开全文
  • build和compile的区别[编程语言]

    万次阅读 2012-08-27 19:21:05
    最近想到一个问题,在写完代码之后运行之前需要编译一下,但是还有一个build功能,这两个到底有没有区别呢? 网上查了一下,buid比compile强大一点。运行的时候就知道,时间是不一样的。有人用过下面的方程式:...
  • build.gradle详解

    万次阅读 多人点赞 2018-01-16 17:05:16
    简述: 1 > java开发中有两个大名鼎鼎的项目构建ANT、Maven。...Gradle是用了一种基于Groovy的领域特定语言(DSL,Domain Specific Language)来声明项目设置,摒弃了XML(如ANT和Maven)的各种繁
  • build.gradle结构分析与常见gradle命令

    千次阅读 2018-04-18 00:05:27
    module-build.gradle结构分析与相关使用介绍 gradle基本结构: apply plugin: 'com.android.application' android { // 编译版本 compileSdkVersion 27 buildToolsVersion &amp;amp;amp;amp;amp;...
  • Android Studio Error:Could not find com.android.tools.build:gradle

    万次阅读 多人点赞 2016-10-11 17:05:24
    今天更新Android Studio后打开Project,报...Error:Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/android-studio-ide-145.3276617-windo
  • 终于从eclipse逐渐转移到Android Studio上来了。刚开始,真不习惯,感觉又慢,快捷键又和eclipse不一样。 但现在越来越多的项目示例等,是android studio格式的,只得慢慢转移过来。 以下是,最不能忍受的问题,一...
  • gradle系列-1-gradle -x test clean build

    千次阅读 2019-01-24 00:32:25
    大家好,一别就是好久啊,我亲爱的博客。今天就介绍这个命令...gradle -x test clean build的作用。 二、实践 gradle -x test ——表明在打包的时候(把通用的类打成jar包供其他服务调用),排除名称为test的Task...
  • build.gradle配置

    千次阅读 2019-06-03 10:43:29
    文章目录1 build.gradle配置1.1 project下的build.gradle1.2 module下的build.gradle2 Apk版本号的命名规则及配置方法2.1 命名规则2.2 配置方法2.3 生成apk命名3 Android studio 3.0以下及3.0以上gradle ...
  • Gradle第六章:Build脚本基础

    千次阅读 2015-05-21 11:33:57
    本文来源于:http://blog.csdn.net/maosidiaoxian/article/details/45664943 ...projects 和 tasks是Gradle中最重要的两个概念 ...Everything in Gradle sits on top of two basic concepts
  • gradlebuild.gradle详解

    万次阅读 2019-06-28 15:07:52
    一个项目中只放置一个build.gradlebuild.gradle可以理解为一个Project框架,提供了对一个项目的基本配置。 project的常用: 属性: group name(artifact) version项目版本(全局的) sourceCompatibility = ...
  • android studio 一直卡在Gradle:Build Running的解决办法

    万次阅读 多人点赞 2016-09-13 13:52:50
    在使用AS开发安卓应用程序的时候经常会遇到Gradle build running一直在运行甚至卡死的情况,本文列出了几种解决方法以供参考。
  • gradle学习(9)-获取build相关信息

    千次阅读 2015-01-09 21:44:04
    (以下所有内容都是根据官方文档学习。如果你对gradle有兴趣,希望你能直接学习官方文档,官方文档是最权威的。而且这样才能产生2份有意义的学习资料)
  • Android studio build.gradle 基本设置配置

    千次阅读 2018-12-12 12:01:11
    今天给大家示范一下基本设置和说明 ps:博主的这套配置让你的项目可以在任意电脑使用as打开无需额外文件、无需额外配置哦,当然as的版本是不能差距太大 复制项目减少体积见:...首先根目录project的build.grad...
  • Gradlebuild.gradle 语法案例

    千次阅读 2018-05-02 11:43:44
    group 'gradle-demo' //项目的版本号 version '1.0-SNAPSHOT' // 使用maven做为jar包的...// 指定项目为java项目,项目编译(在项目提示符下执行:gradle build)时生成项目的jar包。 apply plugin: 'java' // Intel...
  • 一、问题描述 同事在Jenkins新建一个job准备...07:29:49.994 [DEBUG] [org.gradle.launcher.daemon.server.SynchronizedDispatchConnection] thread 15: received class org.gradle.launcher.daemon.protocol.Close...
  • Gradle - build.gradle常用用法

    万次阅读 2018-07-27 11:12:24
    一个项目中只放置一个build.gradlebuild.gradle可以理解为一个Project框架,提供了对一个项目的基本配置。如果需要执行更过的task,比如对java进行编译、打包、部署、移动等操作,就需要引入相应的插件...
  • github项目地址 ...build.gradle示例一 plugins { id 'java' } //相当于maven的groupid group 'com.cyjz' //相当于maven的version version '1.0-SNAPSHOT' //maven中的artifactId相当于name,...
  • build.gradle subprojects { apply plugin: 'java' apply plugin: 'eclipse' repositories { mavenCentral() } } settings.gradle include 'app' include 'core' 子项目app的: apply plugin: 'application'...
  • 看字面意思,这个问题是Gradle没有对应版本。在搜索引擎失效之后,尝试自己解决。...Could not find com.android.tools.build:gradle:3.0.0. 首先,看报错,大概是长这样的: Error:Could ...
  • build或者refresh的时候会卡在gradlebuild这个步骤,然后daemon就超时了,错误提示如下 Error:Timeout waiting to connect to the Gradle daemon. Daemon uid: 4aa9dc3c-21a2-4eec-97ab-4f498f453a32 with ...
  • https://docs.gradle.org/current/userguide/build_lifecycle.html 这是来自官网的学习笔记,含有很多复制粘贴,链接也都贴在上面和文章超链接里了 1. Five ...
  • Maven和Gradle对比 Java世界中主要有三大构建工具:Ant、Maven和Gradle。经过几年的发展,Ant几乎销声匿迹、Maven也日薄西山,而Gradle的发展则如日中天。笔者有幸见证了Maven的没落和Gradle的兴起。Maven的主要...
  • build.gradle配置文件的用法

    千次阅读 2017-05-19 10:39:20
    build文件的各种配置肯定一查一大把,这个是为了方便自己使用查找写的。 1、配置libs".jar"文件: dependencies { ... compile fileTree(include: ['*.jar'], dir: 'libs') } 2、从eclipse工程转到AS工程,里面...
  • > Could not GET 'https://jcenter.bintray.com/com/android/tools/build/gradle/2.2.2/gradle-2.2.2.pom'. Received status code 400 from server: Bad Request ``` 十分诡异!studio和idea 的 gradle设置几乎是...
  • build.gradle常见配置方式

    万次阅读 2017-01-09 21:27:48
    随着Android Studio的横空出世,以及Google大力推荐,使用Gradle编译Android App的小伙伴越来越多,因此我们有必要稍微了解一些使用Gradle编译Android App的常见配置方式。 1、统一配置工程中的...
  • Gradle build.gradle配置

    千次阅读 2018-05-20 20:06:50
    Gradle build.gradle配置 每个构建脚本build.gradle都有一个默认的Project的实例,脚本中所有的操作都在project实例的作用域 1 项目信息 项目信息指项目的坐标 //group version为project的方法 //项目...
  • CommandInvokationFailure: Gradle build failed. F:/Program Files/Unity/2019.3.0b3/Editor/Data/PlaybackEngines/AndroidPlayer/Tools\OpenJDK\Windows\bin\java.exe -classpath "F:\Program Files\Unity\2019....

空空如也

1 2 3 4 5 ... 20
收藏数 1,943,266
精华内容 777,306
关键字:

build