关于gradle

什么是gradle
如果从eclipse转到android studio上开发android,首先遇到的一个问题是是gradle,发现和一切和eclipse都不一样了,没错,因为android studio是基于gradle来构建项目的。
Gradle和C语言的make,以及eclipse使用的ant一样,是一种项目自动化构建工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,但是要比ANT使用XML构建配置要灵活的多。在编写配置时,你可以像编程一样灵活(比如加入各种条件判断),Gradle是基于Groovy的DSL语言。

什么是Groovy
Groovy是Java平台上设计的面向对象编程语言。这门动态语言拥有类似Python、Ruby和Smalltalk中的一些特性,可以作为Java平台的脚本语言使用(也运行于Java虚拟机中)。

Groovy的语法与Java非常相似,以至于多数的Java代码也是正确的Groovy代码。Groovy代码动态的被编译器转换成Java字节码。由于其运行在JVM上的特性,Groovy可以使用其他Java语言编写的库。
可以理解为Groovy是基于java平台的脚本语言,但它有自己定义的一套语法,很多时候也兼容java语法,如调用一个方法:

println(“hello”)

也可以写成

 println “hello”

等等,grade里很多都使用这种形式来调用方法,方法的定义和调用像ruby语言。

android studio的gradle
Android Studio的工程目录结构通常是这样的:

├── app #Android App目录
│   ├── app.iml
│   ├── build #构建输出目录
│   ├── build.gradle #构建脚本
│   ├── libs #so相关库
│   ├── proguard-rules.pro #proguard混淆配置
│   └── src #源代码,资源等
├── build
│   └── intermediates
├── build.gradle #工程构建文件
├── gradle
│   └── wrapper
│         └── gradle-wrapper.properties
├── gradle.properties #gradle的配置
├── gradlew #gradle wrapper linux shell脚本
├── gradlew.bat
├── LibSqlite.iml
├── local.properties #配置Androod SDK位置文件
└── settings.gradle #工程配置

首先是settings.gradle,用于配置project,通常一个project有一个或者多个module(在eclipse下称为project),在这个文件下,把所有要加入构建的module都在这个文件里加入进来,,比如这里包含一个:app module

include ‘:app’

和settings.gradle在同一目录下的build.gradle是一个顶级的build配置文件,在这里可以为所有project以及module配置一些常用的配置。

buildscript {
    repositories {
        jcenter()//使用jcenter库
    }
    dependencies {
        // 依赖android提供的2.1.0的gradle build插件来编译android
        classpath ‘com.android.tools.build:gradle:2.1.0′

    …

android本地定时通知

android本地通知略有不同,分为立即触发和延时触发

1.即时通知

android默认的Notification为立即触发

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClass(_gameActivity, _gameActivity.getClass());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
PendingIntent content = PendingIntent.getActivity(context, 0, intent, 0);
final NotificationManager notiMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
final Notification noti = new Notification(R.drawable.icon, notiResult.getPayload(), System.currentTimeMillis());
String app_name = _gameActivity.getResources().getString(R.string.app_name);
noti.setLatestEventInfo(context, app_name, notiResult.getPayload(), content);

notiMgr.notify(atomicInteger.incrementAndGet(), noti);

 

2.延时触发

想让一定时间后再触发通知,其实是用系统的AlarmManager来实现的。

具体的AlarmManager解释参考

http://yuanzhifei89.iteye.com/blog/1131523

http://blog.csdn.net/ryantang03/article/details/9317499

添加一个ALARM_SERVICE

/*
* name:通知名字,作为通知id使用
* content:通知内容
* time:倒时时(秒)
* */
public static void addLocalNotication(String name, String content, int time)
{
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
cal.add(Calendar.SECOND, (int) time);

Activity activity = _gameActivity;
Intent intent = new Intent(activity, NotificationReceiver.class);
intent.setClass(activity, NotificationReceiver.class);
intent.setData(Uri.parse(name));
intent.putExtra(“msg”, “play_hskay”);

intent.putExtra(“content”, content);
PendingIntent pi = PendingIntent.getBroadcast(activity, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

AlarmManager am = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pi);
}

 

添加一个系统通知类,用于在倒计时间到时,接收系统轮询通知

import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import …