CC's blog

CC的技术博客 专注于 it 互联网的技术爱好者

分类 Android 下的文章

Android Studio apk 自动签名打包

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"

    defaultConfig {
        applicationId "com.example.bear.myapplication"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
    }
    signingConfigs {
        release {
            storeFile
            storePassword
            keyAlias
            keyPassword
        }
    }
    //调用配置文件
    getSigningProperties()


    buildTypes {
        release {
            minifyEnabled true //混淆
            zipAlignEnabled true //Zipalign优化
            shrinkResources true // 移除无用的resource文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            //注意要添加签名
            //signingConfig signingConfigs.release
            //自定义apk名字
            signingConfig signingConfigs.release

            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    output.outputFile = new File(
                            output.outputFile.parent,
                            "应用前缀-release-${defaultConfig.versionName}-${releaseTime()}.apk".toLowerCase())
                }
            }

        }
    }


}

<!--more-->

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:25.+'
    compile 'com.android.support:design:25.+'
}



//获取时间
def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}

//读取签名配置文件 这个需要放在android{}外面
def getSigningProperties(){
             android.signingConfigs.release.storeFile = file('./signKey/android.keystore')
            android.signingConfigs.release.storePassword = 15223245
            android.signingConfigs.release.keyAlias = 'test'
            android.signingConfigs.release.keyPassword = 15223245

}

阅读全文
none

如何在现有的Android 项目中集成 React Native

1.创建一个 android 工程

2.在工程的总的 build.gradle 中加入

allprojects {
    repositories {
        mavenLocal()
        jcenter()
        flatDir {
            dirs 'libs'
        }
        maven {
            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
            url "$rootDir/../node_modules/react-native/android"
        }
    }
}


3. 在app 的build.gradle 中加入


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.+'
    compile "com.facebook.react:react-native:+"
}


configurations.all {
    resolutionStrategy.force 'com.google.code.findbugs:jsr305:3.0.1'
}

4.重写Application

package com.example.bear.myapplication;

import com.facebook.react.ReactApplication;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.shell.MainReactPackage;

import java.util.Arrays;
import java.util.List;

/**
 * Created by bear on 17/11/1.
 */
public class Application extends android.app.Application implements ReactApplication {

    private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {

        /**
         * 是否支持开发模式,如果支持就返回true,此时需要打开悬浮窗权限。
         * 不支持的话就返回false
         * @return
         */
        @Override
        public boolean getUseDeveloperSupport() {
            return BuildConfig.DEBUG;
        }

        @Override
        protected List<ReactPackage> getPackages() {
            return Arrays.<ReactPackage>asList(
                    new MainReactPackage()
            );
        }
    };

    @Override
    public ReactNativeHost getReactNativeHost() {
        return mReactNativeHost;
    }
}

5. 在需要加载 React Native 的代码中 继承ReactActivity并重写 getMainComponentName 方法

package com.example.bear.myapplication;
import com.facebook.react.ReactActivity;

public class MainActivity extends ReactActivity {


    @Override
    protected String getMainComponentName() {
        return "testApp"; //这里是 React Native 中注册的 App 名称
    }
}

6. 别忘了编辑manifest,加入网络请求 和 调试界面的注册


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.bear.myapplication" >
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:name=".Application"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity android:name=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.facebook.react.devsupport.DevSettingsActivity"/>
    </application>

</manifest>
阅读全文
none

Android 兼容包

Android Support兼容包详解<v4、v7>

google官方提供了Android Support Library package 系列的包来保证高版本sdk开发的向下兼容性。
注意:
gradle引用appcompat-v7包的时候就不需要引用v4了,因为v7里默认包含了v4包;
compile ‘com.android.support:appcompat-v7:21.0.3’ 中的21代表API level 21推出的兼容包.
v4包冲突这个错误:多个module所引用的v4包版本不一致造成的; 把其他module的v4包修改成主module所使用的v4包即可!

support-v4

用在API lever 4(即Android 1.6)或者更高版本之上。它包含了相对更多的内容,而且用的更为广泛,例如:Fragment,NotificationCompat,
LoadBroadcastManager,ViewPager,PageTabAtrip,Loader,FileProvider 等

Gradle引用方法:

compile 'com.android.support:support-v4:21.0.3'

support-v7

这个包是为了考虑API level 7(即Android 2.1)及以上版本而设计的,但是v7是要依赖v4这个包的,v7支持了Action Bar以及一些Theme的兼容。

Gradle引用方法:

compile 'com.android.support:appcompat-v7:21.0.3'

阅读全文
none

Fragment 使用

许多初学者接触Android的时候都会发现,当下版本的ADT再创建 android application project的时候,跟许多教材和网上的教程存在差异,比如说res/layout目录下有两个xml文件,而不是教程里面的一个.

而在这个时候,如果大家按照教程上的方法,在src目录下的MainActivity.java中的 protected void on Create(Bundle saveInstanceState)

方法中直接对控件fragment_main.xml中的控件,比如Button,TextView等进行操作的话,大家就会发现,当对控件设置监听器的时候,例如:

button.setOnClickListener(new OnClickListener()){}

程序是不会报错的.可是当大家在虚拟机上或者手机上run的时候.程序就会闪退,在虚拟机上还会弹出报错对话框.

其实,这是因为大家创建的控件实在fragment_main.xml里面的, 而

protected void on Create(Bundle saveInstanceState)

方法是与activity_main.xml关联的,程序运行的时候,找不到控件

其实新建的android application project已经在MainActivity.java中已经为我们创建了与fragment_main.xml对应的类,就在MainActivity.java类的下面

public static class PlaceHolderFragment extends Fragment

在这个类的方法:

public view onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState )

中,大家可以看到,方法中已经自动帮你得到了fragment_main的view:

View rootView = inflater.inflate(R.layout.fragment_main, container, false);

这个时候,大家直接在下面对控件进行操作即可, 例如:

public view onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState ){
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
TextView textView = (TextView)rootView.findViewById(R.id.textView);
textView.setText(“laugh”);
Return rootView;
}

然后大家就可以看到,在设备上,程序成功run起来了.


阅读全文
none

Android 工程目录详解

对Android项目中的文件夹进行解释:

  

  · src

:里面存放的是Activity程序,或者是以后的其他组件,在此文件夹之中建立类的时候一定要注意,包名称不能是一级。

    · 

gen

:此文件夹中的内容是自动生成的,用户不可修改,即:保存的是所有的ID;

      |- R.java: 保存着所有的资源程序,此文件自动编写。

      |- 即:在以后的程序之中,程序不会直接与所有的配置文件操作,都是通过映射名称找到的,这一点符合了Java EE的Key = value的形式;

· 

Android 2.3.3

:此以现在的要使用的Android的开发版本;

· 

assests

:存放一些大型的资源文件,例如:图片、音乐、文字等等;但是一般不用。

· 存放一些资源文件使用,例如:图片、音乐、文字等。

|- drawable-hdpi:存放图片的文件夹,存放高清图片的;

|- drawable-ldpi:存放图片的文件夹,存放低分辨率的图片;

|- drawable-mdpi:存放图片的文件夹,存放中分辨率的图片;

|- 

layout

: 存放所有的布局管理器的配置信息;

|- 

values:

存放所有的文字信息,这一点的设计也非常符合于MVC设计模式;

 

补充:关于values文件夹的内容。

    随着日后的学习,在此文件夹会建立许多的子文件夹,除了string.xml文件夹基本的内容之外,还可能存在其他的信息:array.xml, color.xml,style.xml,这些名称都是约定俗成的;

 

       以上的几个文件夹都是在建立项目的时候自动的在res文件夹之中出现的,除了这几个文件夹之外,在res文件夹之中以后也会增加如下的几个文件夹:

         ·res\raw:存放一些原生文件,例如,视频、音乐;

         ·res\xml:存放一些xml文件的配置;

         ·res\anim::用于进行动画效果配置的文件夹;


阅读全文