Browsed by
分类:Android开发

Mac下Android Library工程使用gradle生成jar包

Mac下Android Library工程使用gradle生成jar包

在开发sdk生成jar在eclipse里相对比较容易操作,只要导出class时指定哪里导出就可以,但在用AndroidStudio开发时要导出jar就没那么容易,需要写gradle脚本,但gradle脚本的入门成本还是比较高,网上也有打包jar的脚本参考,但大多是通过生成classes.jar重命名来生成,这样生成的jar是包含工程里所有类的,有时我们需要指定一些包和类来生成jar。
创建Android Library工程:菜单导航到 File -> New -> New Module … ,选择 Android Library,包名(com.sqstudio.test)。在gradle中加入以下脚本:
task clearJar(type: Delete) {
    delete 'libs/sdk.jar'
}
task makeJar(type:org.gradle.api.tasks.bundling.Jar) {
    //指定生成的jar名
    baseName 'sdk'
    //从哪里打包class文件
    from('build/intermediates/classes/debug/com/sqstudio/test')
    //打包到jar后的目录结构 
    into('com/sqstudio/test/')
    //去掉不需要打包的目录和文件
    exclude('BuildConfig.class', 'R.class')
    //去掉R$开头的文件 
    exclude{ it.name.startsWith('R$');}
}
makeJar.dependsOn(clearJar, build)

build.gradle写上后,只要在命令行执行gradle makeJar就可以在build/libs目录下找到这个jar包。

如果gradle执行失败,需检查环境配置(首次使用,会下载安装相关资源,需要等待)

vim ~/.bash_profile 然后加入:
GRADLE_HOME=/Applications/Android\ Studio.app/Contents/gradle/gradle-3.2;
export GRADLE_HOME
export PATH=$PATH:$GRADLE_HOME/bin

上面是个简单的例子,只能打包某个包下面的所有文件,如果要实现只打某个包下面的某些子包或者文件可参考如下示例:

task makeSdkJar(type:org.gradle.api.tasks.bundling.Jar) {
    baseName 'pluginsdk'
    //只打包org.cmdmac下的org.cmdmac.pluginsdk.impl和org.cmdmac.gamecenter,其他子包不会被打包进去
    from('build/intermediates/classes/debug/org/cmdmac/') {
        include 'pluginsdk/impl'
        include 'gamecenter'
    }
    into('org/cmdmac/')
//    exclude('R.class')
//    exclude{ it.name.startsWith('R$');}
}

 

参考资料:http://www.alloyteam.com/2015/03/shi-yong-gradle-da-bao-zhi-ding-bao-ming-he-lei-di-jar/

Android国际化-多语言

Android国际化-多语言

1.  很大程度上,为什么我们能如此方便的实现国际化、分辨率匹配等?

主要就是得益于 Android 中这种独特的资源管理方式。程序员的代码可以不直接和资源发生关系。Android 中,我们通常通过 R 文件提供的索引来间接的引用某一个资源。而如何维护资源索引和真正的资源之间的关系,这个活,却是 Android 系统来做的。

这里面就可以大作文章了不是么?

我说过,最了解用户手机的,不是用户也不是程序员,而是Android操作系统。它最了解用户当前使用的是什么语言,最了解用户当前手机的分辨率是多少,了解电量,了解内存情况…等等。

既然你对自个的情况这么了解,为什么不自己把所有能完成的事情都做了?不要麻烦程序员好吧?好的,所以 Android 在这方面做得非常优秀。

基于这个角度,我们要转换的观念为:有可能,R 文件中的索引,并非是和资源一对一的。例如我们以前认为它就一定是对应了一张图片,对应了一个字符串,对应了一个布局文件。

而很可能,Android 其实会根据用户当前使用的环境对应几套方案:例如本文所讲的主题,从国际化角度,可能对应中文环境方案,英文环境方案?那么,这时候 R 文件对应的这个资源便不确定起来,当我们通过 R 文件调用一个图片资源显示在窗口上时,Android 操作系统会自动根据用户当前的环境,而选用最合适的图片(这个挑选过程却是透明的)。

程序员可以干预的是:英文环境到底对应哪套方案?中文环境对应到底哪套方案?

OK。这就简单了。

2. Android 中要实现国际化比较简单。

字符串国际化:只要在 res 文件夹下新建对应语言的 values 文件夹就好了,

如,英语环境下的,文件夹命名为:values-en

美国英文环境:values-en-rUS

中文环境为:values-zh

大陆地区中文环境: values-zh-cn

在 eclipse 下新建 Android 项目时,会在 res 目录下自动创建一个默认语言环境的文件夹 : values

当某一个资源没有在语言环境的对应的资源集合中找到时,就会使用 values 下的资源。

若某一个语言环境没有在项目中定义语言环境,那么也会使用 values 下的资源。

3. 图片国际化

同理。

在 res 下新建 drawable-zh 文件夹,存放中文环境下的图片

新建 drawable-en 作为英语环境下的图片

在 eclipse 下新建 Android 项目时,会在 res 目录下自动创建三个默认语言环境的文件夹:

drawable-hdpi

drawable-ldpi

drawable-mdpi

分别用于存放高、中。低分辨率的图片。Android 系统会根据手机的分辨率,而自动从不同的对应的某一个文件夹下去加载图片。

同样,它们也可以国际化,命名规则如:

drawable-zh-hdpi

drawable-en-ldpi

drawable-en-rUS-mdpi

使用。在 XML 中需要使用到图片的地方用表达式: @drawable/icon

代码中使用:R.drawable.icon。因为图片资源同样也会在 R 文件中生成一个索引

==================================================================

android多国语言文件夹文件汇总如下:

中文(中国):values-zh-rCN
中文(台湾):values-zh-rTW
中文(香港):values-zh-rHK
英语(美国):values-en-rUS
英语(英国):values-en-rGB
英文(澳大利亚):values-en-rAU
英文(加拿大):values-en-rCA
英文(爱尔兰):values-en-rIE

英文(印度):values-en-rIN
英文(新西兰):values-en-rNZ
英文(新加坡):values-en-rSG
英文(南非):values-en-rZA

阿拉伯文(埃及):values-ar-rEG
阿拉伯文(以色列):values-ar-rIL
保加利亚文:  values-bg-rBG
加泰罗尼亚文:values-ca-rES
捷克文:values-cs-rCZ
丹麦文:values-da-rDK
德文(奥地利):values-de-rAT
德文(瑞士):values-de-rCH
德文(德国):values-de-rDE
德文(列支敦士登):values-de-rLI
希腊文:values-el-rGR
西班牙文(西班牙):values-es-rES
西班牙文(美国):values-es-rUS
芬兰文(芬兰):values-fi-rFI
法文(比利时):values-fr-rBE
法文(加拿大):values-fr-rCA
法文(瑞士):values-fr-rCH
法文(法国):values-fr-rFR
希伯来文:values-iw-rIL
印地文:values-hi-rIN
克罗里亚文:values-hr-rHR
匈牙利文:values-hu-rHU
印度尼西亚文:values-in-rID
意大利文(瑞士):values-it-rCH
意大利文(意大利):values-it-rIT
日文:values-ja-rJP
韩文:values-ko-rKR
立陶宛文:valueslt-rLT
拉脱维亚文:values-lv-rLV
挪威博克马尔文:values-nb-rNO
荷兰文(比利时):values-nl-BE
荷兰文(荷兰):values-nl-rNL
波兰文:values-pl-rPL
葡萄牙文(巴西):values-pt-rBR
葡萄牙文(葡萄牙):values-pt-rPT
罗马尼亚文:values-ro-rRO
俄文:values-ru-rRU
斯洛伐克文:values-sk-rSK
斯洛文尼亚文:values-sl-rSI
塞尔维亚文:values-sr-rRS
瑞典文:values-sv-rSE
泰文:values-th-rTH
塔加洛语:values-tl-rPH
土耳其文:values–r-rTR
乌克兰文:values-uk-rUA
越南文:values-vi-rVN

AndroidStudio 升级配置,不只需要翻墙(Mac)

AndroidStudio 升级配置,不只需要翻墙(Mac)

翻了墙还不能升级AndroidStudio,今天中午下点功夫找找原因

原来还需要在安装包的bin文件夹下studio.vmoptions加上如下配置:
配置如下:
-Djava.net.preferIPv4Stack=true
-Didea.updates.url=http://dl.google.com/android/studio/patches/updates.xml
-Didea.patches.url=http://dl.google.com/android/studio/patches/

或者在 info.plist文件的<key>VMOptions</key> <string>里加上这些配置,也是一样的!

终于升级了,越来越好用了!

Mac下使用dex2jar

Mac下使用dex2jar

1.去http://sourceforge.net/projects/dex2jar/ 下载一个新版本dex2jar.  目前是2.0,下载后文件名dex2jar-2.0.zip

2.可以到这里看看用法:

http://sourceforge.net/p/dex2jar/wiki/Faq/

http://sourceforge.net/p/dex2jar/wiki/UserGuide/

3.解压缩dex2jar-2.0.zip 到文件夹dex2jar-2.0

4.注意修改文件属性为可执行文件:

   chmod +x /home/…/d2j-dex2jar.sh  /home/…/d2j_invoke.sh

5.输入命令

   sudo sh /home/…/dex2jar-version/d2j-dex2jar.sh   /home/…/someApk.apk

6.在命令文件夹下面即可看到someApk.jar文件包

在Mac上配置adb命令

在Mac上配置adb命令

在Mac上配置adb命令

在Mac OS中使用adb命令时,应进行变量配置,步骤如下:

一、终端中输入 cd ~
二、输入touch .bash_profile 回车

touch:如果没有,则创建文件,如果有,更新一下文件时间

三、输入open -e .bash_profile

open:打开文件

回车后会在TextEdit中打开这个文件(如果未配置过环境变量,应该是个空白文件)。在文件中加如以下内容

export PATH=${PATH}:/Users/xxx/Library/Android/sdk/platform-tools

上面是我的电脑上的路径,请自行修改,其实就是你android sdk的路径

在设置了android:parentActivityName后,点击子Activity返回键,父Activity总会调用OnDestroy()的解决方案

在设置了android:parentActivityName后,点击子Activity返回键,父Activity总会调用OnDestroy()的解决方案

一个Activity在manifet里声明了android:parentActivityName;这时候通过Activity左上角的返回按钮点击返回,

启动声明的父Activity,总会先调用父Activity的OnDestroy方法,具体如下面所说:

    <activity
        android:name="com.example.helloworld.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.helloworld.MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.helloworld.MainActivity" />
    </activity>
DisplayMessageActivity为子Activity,而MainActivity为父Activity,点击
DisplayMessageActivity的左上角返回按钮的时候,调用逻辑如下:
MainActivity.onDestroy()
MainActivity.onCreate(null)
MainActivity.onStart()
解决方案是:
为设置MainActivity属性android:launchMode=singleTop

顺便脑补android:parentActivityName的作用,就是为了左上角给子Activity加一个返回按钮,具体信息如下:
Android 4.1提高性能、增强用户体验
  App 栈导航:通过设置android:parentActivityName改变回退栈的内容,如果栈中没有parentActivity,则合成栈,通过onPrepareNavigateUpTaskStack()改变parentActivity中的内容。
Android文件读写操作

Android文件读写操作

Assets:该目录只可读,不可写。使用getResource().getAssets().open(“file_name”)获得FileInputStream,进行读取操作

Raw:该目录和Assets一样,可读不可写。使用getResource().openRawResource(R.raw.file_name)获得FileInputSteam,进行读取操作。

外部SD:可读可写,外部可见。先用Environment.getExtenalStorageDirectory获得sd卡的目录File,先检测是否可用。如果可用,再file = new File(sd_dir,filename),进行读写操作。

内部文件:

AndroidStudio添加assets目录

AndroidStudio添加assets目录

1: 打开 项目名称.iml 文件.

查找这行 : option name=”ASSETS_FOLDER_RELATIVE_PATH” value=”/src/main/assets”

2: 在“main”下建立一个子目录 “assets”  (即对应src/main/assets)

3: 把webview中要加载的文件放到这个目录中.

4: 在webview中载入,完成.

参考:

http://goodidea100.com/Android/744.html

http://stackoverflow.com/questions/18302603/where-to-place-assets-folder-in-android-studio

Android的startService与bindService

Android的startService与bindService

Service的生命周期 Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy
我们有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。

1 通过startService
Service会经历 onCreate -> onStart
stopService的时候直接onDestroy

如果是调用者(TestServiceHolder)自己直接退出而没有调用stopService的 话,Service会一直在后台运行。
下次TestServiceHolder再起来可以stopService。

2 通过bindService   
Service只会运行onCreate, 这个时候 TestServiceHolder 和TestService绑定在一起 TestServiceHolder 退出了,Srevice就会调用onUnbind->onDestroyed  所谓绑定在一起就共存亡了。

 

 

那有同学问了,要是这几个方法交织在一起的话,会出现什么情况呢?
一个原则是Service的onCreate的方法只会被调用一次,就是你无论多少次的startService又 bindService,Service只被创建一次。如果先是bind了,那么start的时候就直接运行Service的onStart方法,如果先 是start,那么bind的时候就直接运行onBind方法。如果你先bind上了,就stop不掉了,对啊,就是stopService不好使了,只 能先UnbindService, 再StopService,所以是先start还是先bind行为是有区别的。

看起来情况很多,不过我会把这次的代码包括上回Activity生命周期的研究代码都贴上了,希望你喜欢!大家有兴趣可以回去点点按钮看看log,多看几遍就知道了。

Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。服务的开发比较简单,如下:
第一步:继承Service类
public class SMSService extends Service { }

第二步:在AndroidManifest.xml文件中的<application>节点里对服务进行配置:
<service android:name=”.SMSService” />

服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。

如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。

如果打算采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()–>onDestroy()方法.

 

原文链接:http://blog.csdn.net/huanyufeng/article/details/5873407