Groovy基础
个人博客:http://www.milovetingting.cn
Groovy基础Groovy是基于JVM虚拟机的一种动态语言。每个Gradle的build脚本文件都是一个Groovy脚本文件。
字符串在Groovy中,分号不是必需的。在Groovy中,单引号和双引号都可以定义一个字符串变量 ,单引号标记的是纯粹的字符串变量,而不是对字符串里的表达式做运行,但是双引号可以。
1234567task printString { def str1 = '单引号' def str2 = "双引号" println "单引号定义的字符串类型:"+str1.getClass().name println "双引号定义的字符串类型:"+str2.getClass().name}
输出结果:
12单引号定义的字符串类型:java.lang.String双引号定义的字符串类型:java.lang.String
而双引号可以做运算:
123456task printStringVar ...
Activity的生命周期和启动模式
个人博客:http://www.milovetingting.cn
Activity的生命周期和启动模式1、Activity的生命周期1.1、典型情况下的生命周期
在有用户参与的情况下,Activity所经过的生命周期的改变。
Activity会经历如下生命周期:
onCreate-onRestart-onStart-onResume-onPause-onStop-onDestroy
1.2、异常情况下的生命周期
Activity被系统回收或者由于当前设备的Configuration发生改变从而导致Activity被销毁重建。
1.2.1资源相关的系统配置发生改变导致Activity被杀死并重新创建系统只在Activity异常终止的时候才会调用onSaveInstanceState和onRestoreInstanceState来存储和恢复数据,其它情况不会触发这个过程。
1.2.2资源内存不足导致低优先级的Activity被杀死Activity优先级:
1、前台Activity–正在和用户交互的Activity,优先级最高。
2、可见但非前台Activity–Activit ...
Gradle入门
个人博客:http://www.milovetingting.cn
Gradle入门配置Gradle环境安装之前确保已经安装配置好Java环境,要求JDK6以上,并且在环境变量里配置了JAVA_HOME,查看Java版本可以在终端输入如下命令:
1java -version
显示结果如下:
1234java version "1.8.0_221"Java(TM) SE Runtime Environment (build 1.8.0_221-b11)Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
Linux下搭建Gradle构建环境先到Gradle官网https://gradle.org下载好Gradle SDK。建议下载all版本,包含了Gradle SDK所有相关内容,包括源代码,文档,示例等。下载后解压。
要运行Gradle,必须把Gradle_HOME/bin目录添加到环境变量PATH中。在Linux下,如果只想为当前登录的用户配置可以运行Gradle,那么可 ...
Android Studio NDK 开发
个人博客:http://www.milovetingting.cn
Android Studio NDK 开发记录在Android Studio中NDK简单开发的步骤
用到的Android Studio版本为3.5。
配置NDK下载NDK一般在SDK下已经有自带的ndk文件夹,如sdk目录下的ndk-bundle文件夹。
如果没有,可以在SDK Manager中下载
下载LLDB、NDK两项
下载完成后,可以在sdk目录下看到ndk的文件夹
配置环境变量我的电脑-属性-高级系统设置-环境变量
新建一个ANDROID_NDK变量,配置上ndk文件夹的位置(在这个文件夹下可以看ndk-build.cmd等文件)
然后将这个变量加入到path变量中
生成SO库新建一个Hello.java文件,里面增加一个本地方法
1public static native String hi();
执行Build-Make Project,在app\build\intermediates\javac\debug\classes目录下执行以下cmd命令生成头文件:
1javah -jni ...
Android多渠道打包--Gradle打包
个人博客:http://www.milovetingting.cn
Android多渠道打包–Gradle打包前言由于App一般都会在多个应用市场上架,为了分析App在每个不同渠道的具体的数据,一般都会对不同渠道打包不同的App。多渠道打包有多种方式,这里只介绍利用Gradle进行多渠道打包。
步骤1、在AndroidManifest.xml中增加配置123<meta-data android:name="APP_CHANNEL" android:value="${APP_CHANNEL_VALUE}" />
其中,APP_CHANNEL为配置的属性名。APP_CHANNEL_VALUE为在build.gradle中配置的变量。
2、在build.gradle中增加productFlavors配置12345678productFlavors { baidu { manifestPlaceholders = ...
Android中的线程池
个人博客:http://www.milovetingting.cn
Android中的线程池在Android中,主线程不能执行耗时的操作,否则可能会导致ANR。那么,耗时操作应该在其它线程中执行。线程的创建和销毁都会有性能开销,创建过多的线程也会由于互相抢占系统资源而导致阻塞的现象。这个时候,就需要使用线程池。
线程池的优点可以概括为以下几点:
1、重用线程池中的线程,避免线程创建、销毁带来的性能开销;
2、能有效地控制线程池的最大并发数,避免大量的线程之间因互相抢占系统资源导致的阻塞现象;
3、能够对线程进行简单的管理。
以上线程池的优点引用自《Android开发艺术探索》
线程池的具体实现类为ThreadPoolExecutor,ThreadPoolExecutor继承自AbstractExecutorService,AbstractExecutorService又实现了ExecutorService接口,ExecutorService继承自Executor。
ThreadPoolExecutor有四个重载的构造方法:
12345678910111213141 ...
IntentService原理分析
个人博客:http://www.milovetingting.cn
IntentService原理分析IntentService是一个异步处理请求的服务,通过Context#startService(Intent)可以将请求发送给IntentService,IntentService在工作线程中依次串行处理每一个Intent,当处理完所有请求后,IntentService会自动停止。
在IntentService内部是通过HandlerThread来切换线程和处理消息的。
当IntentService首次启动时,会调用onCreate()方法:
12345678910111213 @Override public void onCreate() { super.onCreate();//创建HandlerThread HandlerThread thread = new HandlerThread("IntentService[" + mName + "]"); //启动线程thread.sta ...
HandlerThread原理分析
个人博客:http://www.milovetingting.cn
HandlerThread原理分析HandlerThread是一个内部拥有Handler和Looper的特殊Thread,可以方便地在子线程中处理消息。
简单使用HandlerThread的使用比较简单。
12mHandlerThread = new HandlerThread(THREAD_NAME);mHandlerThread.start();
首先,实例化一个HandlerThread,然后调用start()方法。在start()方法中,会调用run()方法:
1234567891011121314151617 @Override public void run() { mTid = Process.myTid();//实例化looper对象 Looper.prepare(); synchronized (this) { //获取looper对象 mLooper = Looper.myLooper(); //通知其它线程 ...
AsyncTask机制
个人博客:http://www.milovetingting.cn
AsyncTask机制AsyncTask可以让我们更容易地使用UI线程。它允许执行后台操作,并把结果发布到UI线程上,而不需要操作线程或Handler。AsyncTask被设计成一个和Thread、Handler相关的一个帮助类。AsyncTask用于短时(最多是几秒)的操作。
AsyncTask使用需要注意以下几点:
AsyncTask类必须在UI线程上加载。AsyncTask必须在UI线程实例化。execute()方法也必须在UI线程调用。
不要手动调用onPreExecute()、onPostExecute()、doInBackground()、onProgressUpdate()方法。
每个AsyncTask实例只能调用一次execute,如果再次调用,则会抛出异常。
AsyncTask首次引入时,AsyncTask中的任务是串行的。从Android1.6之后,AsyncTask被设计成并行的。从Android3.0后,AsyncTask被重新设计成串行。如果在3.0后的版本需要并行,则可 ...
Handler消息机制
个人博客:http://www.milovetingting.cn
Handler消息机制Handler消息机制主要涉及Looper、Handler、MessageQueue、Message。其中,Looper主要负责获取消息,Handler负责发送消息及处理消息,MessageQueue是消息队列,Message是消息类。
Looper循环获取消息
1、ActivityThread的main()方法:
123456789101112131415 public static void main(String[] args) { ...//准备looper Looper.prepareMainLooper(); ...//进入无限循环 Looper.loop();//如果loop()循环退出,则抛出异常,整个应用退出 throw new RuntimeException("Main thread loop unexpectedly exited"); }
2、prepareMain ...