当前位置:  编程技术>移动开发
本页文章导读:
    ▪可喜,没发现内存泄漏出现        可喜,没有发现内存泄漏出现 在实现即时比分客户端时,生怕这个模块会出现内存泄漏,所以一写完,马上用Instruments Leaks跑一遍,到目前为止,没有发现内存泄漏出现,可喜可贺一下。   .........
    ▪ 兑现关机动画        实现关机动画 实现关机动画 关机动画和开机动画功能是大体一致的,只是播放的动画不一样而已。 既然关机动画和开机动画如此相似,所以,先了解一下开机动画的流程是怎样的。 一. 开.........
    ▪ 一些日期学问,copy过来的       一些日期知识,copy过来的 引自:http://astd520.com/forum.php?mod=viewthread&tid=9今天花了好大一点时间把java的日期类做了一下整理,哈1、         Date类(该类现在很少用了)l         D.........

[1]可喜,没发现内存泄漏出现
    来源: 互联网  发布时间: 2014-02-18
可喜,没有发现内存泄漏出现

在实现即时比分客户端时,生怕这个模块会出现内存泄漏,所以一写完,马上用Instruments Leaks跑一遍,到目前为止,没有发现内存泄漏出现,可喜可贺一下。

 

新人新手啊,不容易。

 

Leaks 监控

 

1 楼 gypgyp 2012-06-01  
instrument 并不能发现所有的内存泄漏。有时还是需反复执行程序的某一功能,并观测内存的变化,才能确定是否有内存泄漏。

    
[2] 兑现关机动画
    来源: 互联网  发布时间: 2014-02-18
实现关机动画

实现关机动画

关机动画和开机动画功能是大体一致的,只是播放的动画不一样而已。

既然关机动画和开机动画如此相似,所以,先了解一下开机动画的流程是怎样的。

一. 开机动画的图片存放位置:

1. 默认位置

/development/data/etc/bootanimation.zip

2. 不同的项目存放的位置

/device/qcom/项目名称/bootanimation.zip

二. 开机动画的服务

1. 文件位置

/system/core/rootdir/init.rc

该文件定义了许多的服务,其中就定义了开机动画的服务,代码如下:

service bootanim /system/bin/bootanimation

    user graphics

    group graphics

    disabled

oneshot

以上代码我所理解的含义是这样了,这是个服务。解析之后,会生成一个bootanimation的shell命令, 以后通过adb shell进入系统,执行bootanimation命令之后会启动该服务。至于字符串bootanim,它是唯一标识,用来表示该shell命令。

 

三. 播放动画

1. 文件位置

/frameworks/base/cmds/bootanimation/BootAnimation.cpp

/frameworks/base/cmds/bootanimation/BootAnimation.h 头文件

/frameworks/base/cmds/bootanimation/bootanimation_main.cpp 入口文件

BootAnimation.cpp主要用来读取bootanimation.zip文件,然后播放动画。函数readToRun用来读取动画文件,如下代码:

        status_t err = mZip.open("/data/local/bootanimation.zip");

        if (err != NO_ERROR) {

            err = mZip.open("/system/media/bootanimation.zip");

            if (err != NO_ERROR) {

                mAndroidAnimation = true;

            }

        }

 

以上便是开机动画的主要文件,那么,我们该如何实现关机动画呢?

显然,开机动画和关机动画只是读取的动画文件不同而已,那么,在BootAnimation.cpp的函数readToRun中读取动画文件时,需要加入一个标志来判断,如果是开机,则读取开机动画,如果是关机,则读取关机动画。因此,我们我们加入一个bool类型变量mShutdown,mShutdown为true表示关机。修改BootAnimation.h头文件,增加变量mShutdown,考虑到外界需要对这个变量进行设值来控制,提供一个函数isShutdown,添加如下申明:

void BootAnimation::isShutdown(bool shutdown);

修改BootAnimation.cpp文件,实现函数isShutdown。实现代码如下:

void BootAnimation::isShutdown(bool shutdown){

    mShutdown = shutdown;

}

另外,修改函数readToRun读取动画文件的部分,实现代码如下:

if(!mShutdown){

        LOGD("boot strap");

        status_t err = mZip.open("/data/local/bootanimation.zip");

        if (err != NO_ERROR) {

            err = mZip.open("/system/media/bootanimation.zip");

            if (err != NO_ERROR) {

                mAndroidAnimation = true;

            }

        }

    } else {

        LOGD("shutdown");

        status_t err = mZip.open("/data/local/shutdownanimation.zip");

        if (err != NO_ERROR) {

            err = mZip.open("/system/media/shutdownanimation.zip");

            if (err != NO_ERROR) {

                mAndroidAnimation = true;

            }

        }

        mShutdown = false;

    }

代码中可以看出,程序会从/system/media/下读取bootanimation.zip和shutdownanimation.zip文件,因此,先制作一个shutdownanimation.zip文件,参考bootanimation.zip文件,放在路径/development/data/etc/或者/device/qcom/项目名称/目录下。并且修改mk文件。增加如下代码:

device/qcom/xxx/shutdownanimation.zip:system/media/shutdownanimation.zip。

这样才能通过mk命令将此文件shutdownanimation.zip复制到system/media/下,所以代码中是到/system/media/下找相关文件。

另外,尽管变量mShutdown的默认值是false的,但为了保险起见,最好在BootAnimation.cpp的构造函数中人为添加mShutdown = false。

至此,播放动画的逻辑完成。接下来,我们该如何做呢?既然,播放动画的逻辑是根据变量mShutdown来控制的。那么,我们该在哪里给变量赋值来达到控制的要求呢?

肯定是在bootanimation_main.cpp文件中,因为它是入口文件,会在BootAnimation.cpp文件之前执行。在bootanimation_main.cpp的main函数中对变量进行赋值,以控制BootAnimation.cpp文件中读取的动画文件的不同。那么在bootanimation_main.cpp的main函数中我们该根据什么来对变量进行相应的赋值呢?很自然的想到,只能根据main函数的参数来判断了。那么我们该如何给main函数添加参数呢?本文开始处,曾提到,init.rc文件中开机动画的服务。它会生成一个bootanimation的shell的命令。实际上,当你adb shell进入系统之后,执行bootanimation时,它会从bootanimation_main.cpp的main函数开始执行,进而播放动画。所以,我们只要系统能执行命令bootanimation 参数名即可,当系统关机时,会执行到frameworks/base/core/java/com/android/internal/app/ShutdownThread.java文件中的beginShutdownSequence函数。默认情况下,会弹出ProgressDialog对话框,提示正在关机操作,先将该段代码注释掉,需要在这里添加实现让系统执行命令bootanimation 参数名的功能即可。那么我们该如何让系统执行该命令呢?有两种方法:

第一种:直接调用系统shell的命令

需要使用ProcessBuilder类,该类可以直接操作shell命令。除此之外,还有一些方法,可以上网查询下。将以下代码添加到ShutdownThread.java的beginShutdownSequence函数的注释后面即可。

        String[] cmds = {"bootanimation","-shutdown"};

        try{

            ProcessBuilder builder = new ProcessBuilder(cmds);   

            builder.directory(new File("/")) ;

            builder.redirectErrorStream (true) ;

            builder.start();

        } catch(Exception e) {

            e.printStackTrace();

    }

通过以上代码,系统会执行bootanimation -shutdown的shell命令。在bootanimation_main.cpp文件中main函数需要判断参数名是否是-shutdown,判断是否是关机。修改bootanimation_main.cpp文件如下:

int main(int argc, char** argv)

{

#if defined(HAVE_PTHREADS)

    setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);

#endif

 

    char value[PROPERTY_VALUE_MAX];

    property_get("debug.sf.nobootanimation", value, "0");

    int noBootAnimation = atoi(value);

    LOGI_IF(noBootAnimation,  "boot animation disabled");

    argc--;

    argv++;

    if (!noBootAnimation) {

 

        sp<ProcessState> proc(ProcessState::self());

        ProcessState::self()->startThreadPool();

        // create the boot animation object  

        sp<BootAnimation> boot = new BootAnimation();

        if (argc > 0) {

            LOGD(argv[0]);

            if (!strcmp(argv[0],"-shutdown")) {            

                boot->isShutdown(true);

            }

        }

 

        IPCThreadState::self()->joinThreadPool();

 

    }

    return 0;

}

 

第二种:在init.rc文件中添加一个类似于开机动画service

代码如下:

service shutdownanim /system/bin/bootanimation -shutdown

    user graphics

    group graphics

Disabled

通过以上代码,shutdownanim代表了bootanimation -shutdown的shell命令。

在ShutdownThread.java文件的beginShutdownSequence函数的注释后面添加如下代码:

SystemProperties.set("ctl.start","shutdownanim");

通过该段代码,系统会寻找标识符为shutdownanim的shell命令,然后执行它。

至此,就完成了关机动画的所有功能.(希望此文对大家有帮助,谢谢!)

 

 

 

 


    
[3] 一些日期学问,copy过来的
    来源: 互联网  发布时间: 2014-02-18
一些日期知识,copy过来的
引自:http://astd520.com/forum.php?mod=viewthread&tid=9

今天花了好大一点时间把java的日期类做了一下整理,哈

1、         Date类(该类现在很少用了)
l         Date类对象的创建:



n         创建一个当前时间

//默认是创建一个代表系统当前日期的Date对象
  Date d = new Date();

n         创建一个我们指定的时间的Date对象:
下面是使用带参数的构造方法,可以构造指定日期的Date类对象,Date类中年份的参数应该是实际需要代表的年份减去1900,实际需要代表的月份减去1以后的值。
//创建一个代表2009年6月12号的Date对象
Date d1 = new Date(2009-1900, 6-1, 12); (注意参数的设置啊!)

l         正确获得一个date对象所包含的信息

如:

    Date d2 =  new Date(2009-1900, 6-1, 12);

        //获得年份 (注意年份要加上1900,这样才是日期对象d2所代表的年份)

        int year = d2.getYear() + 1900;

        //获得月份  (注意月份要加1,这样才是日期对象d2所代表的月份)

        int month = d2.getMonth() + 1;

        //获得日期

        int date = d2.getDate();

        //获得小时

        int hour = d2.getHours();

        //获得分钟

        int minute = d2.getMinutes();

        //获得秒

        int second = d2.getSeconds();

        //获得星期 (注意:0代表星期日、1代表星期1、2代表星期2,其他的一次类推了)

        int day = d2.getDay();

运行结果:

年份:2009

月份:6

日期:12

小时:0  //不设置默认是0

分钟:0  //不设置默认是0

秒:0    //不设置默认是0

星期:5  //09-6-12今天就是星期5,又是一个星期天哦





2、         Calendar类
Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些


l         Calendar类对象的创建

Calendar类是一个抽象类,在实际使用时实现特定的子类的对象。由于Calendar类是抽象类,且Calendar类的构造方法是protected的,所以无法使用Calendar类的构造方法来创建对象,API中提供了getInstance方法用来创建对象。


n         创建一个代表系统当前日期的Calendar对象

Calendar c = Calendar.getInstance();//默认是当前日期

n         创建一个指定日期的Calendar对象
使用Calendar类代表特定的时间,需要首先创建一个Calendar的对象,然后再设定该对象中的年月日参数来完成。
//创建一个代表2009年6月12日的Calendar对象

Calendar c1 = Calendar.getInstance();

c1.set(2009, 6 - 1, 12);



l         Calendar类对象字段类型



Calendar类中用一下这些常量表示不同的意义,jdk内的很多类其实都是采用的这种思想

Calendar.YEAR——年份

Calendar.MONTH——月份

Calendar.DATE——日期

Calendar.DAY_OF_MONTH——日期,和上面的字段意义完全相同

Calendar.HOUR——12小时制的小时

Calendar.HOUR_OF_DAY——24小时制的小时

Calendar.MINUTE——分钟

Calendar.SECOND——秒

Calendar.DAY_OF_WEEK——星期几





l         Calendar类对象信息的设置与获得

n         Calendar类对象信息的设置

u       Set设置

如:Calendar c1 = Calendar.getInstance();

调用:public final void set(int year,int month,int date)

c1.set(2009, 6 - 1, 12);//把Calendar对象c1的年月日分别设这为:2009、6、12

利用字段类型设置

如果只设定某个字段,例如日期的值,则可以使用如下set方法:

调用:public void set(int field,int value)

//把 c1对象代表的日期设置为10号,其它所有的数值会被重新计算

c1.set(Calendar.DATE,10);

//把c1对象代表的年份设置为2008年,其他的所有数值会被重新计算

c1.set(Calendar.YEAR,2008);

         其他字段属性set的意义以此类推

u       Add设置

Calendar c1 = Calendar.getInstance();

//把c1对象的日期加上10,也就是c1所表的日期的10天后的日期,其它所有的数值会被重新计算

c1.add(Calendar.DATE, 10);

//把c1对象的日期加上10,也就是c1所表的日期的10天前的日期,其它所有的数值会被重新计算
c1.add(Calendar.DATE, -10);

其他字段属性的add的意义以此类推

n         Calendar类对象信息的获得

Calendar c1 = Calendar.getInstance();

// 获得年份

int year = c1.get(Calendar.YEAR);

// 获得月份

int month = c1.get(Calendar.MONTH) + 1;

// 获得日期

int date = c1.get(Calendar.DATE);

// 获得小时

int hour = c1.get(Calendar.HOUR_OF_DAY);

// 获得分钟

int minute = c1.get(Calendar.MINUTE);

// 获得秒

int second = c1.get(Calendar.SECOND);

// 获得星期几(注意(这个与Date类是不同的):1代表星期日、2代表星期1、3代表星期二,以此类推)

int day = c1.get(Calendar.DAY_OF_WEEK);





3、         GregorianCalendar类
GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家使用的标准日历系统。

GregorianCalendar类对象的创建

GregorianCalendar有自己的构造方法,而其父类Calendar没有公开的构造方法哦。

GregorianCalendar()
          在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar。

GregorianCalendar(int year, int month, int dayOfMonth)
          在具有默认语言环境的默认时区内构造一个带有给定日期设置的 GregorianCalendar。

GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute)
          为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar。

GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute, int second)
          为具有默认语言环境的默认时区构造一个具有给定日期和时间设置的 GregorianCalendar。


创建一个代表当前日期的GregorianCalendar对象

GregorianCalendar gc = new GregorianCalendar();

//创建一个代表2009年6月12日的GregorianCalendar对象(注意参数设置哦,与其父类是一样的哦,月份要减去1)

GregorianCalendar gc = new GregorianCalendar(2009,6-1,12);

字段属性什么的都是随其父Calendar了,呵

另外:GregorianCalendar有下面一个方法:

isLeapYear(int year)
          确定给定的年份是否为闰年

4、         DateFormat类
DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并分析日期或时间。日期/时间格式化子类(如 SimpleDateFormat)允许进行格式化(也就是日期 -> 文本)、分析(文本-> 日期)和标准化。将日期表示为 Date 对象,或者表示为从 GMT(格林尼治标准时间)1970 年,1 月 1 日 00:00:00 这一刻开始的毫秒数。

5、         SimpleDateFormat类
public class SimpleDateFormat extends DateFormatSimpleDateFormat 是一个以与语言环境相关的方式来格式化和分析日期的具体类。它允许进行格式化(日期 -> 文本)、分析(文本 -> 日期)和规范化。

所以本类可以实现:String 到 Date   Date到String的互转,如下:



SimpleDateFormat对象最常用的就是一下两招了:

//注意构造函数中是SimpleDateFormat类解析日期的模式,大小写代表的意义完全不一样哦

       SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

           //日期到字符串的转换

           String today = df.format(new Date());

           //字符串到日期的转换

           Date date = df.parse("2009-06-12 02:06:37");

           System.out.println(df.format(new Date()));

   

6、         日期类对象之间的互转
l         Date类对象与long型时间的互转

//将Date类的对象转换为long型时间

Date d= new Date();

//使用对象的getTime()方法完成

long dLong = d.getTime();



//将long型时间转换为Date类的对象

long time = 1290876532190L;

//使用Date的构造方法完成

Date d2 = new Date(time);

l         Calendar对象和long型时间之间的互转

// 将Calendar对象转换为相对时间

Calendar c = Calendar.getInstance();

long t1 = c.getTimeInMillis();



// 将相对时间转换为Calendar对象

Calendar c1 = Calendar.getInstance();

long t = 1252785271098L;

c1.setTimeInMillis(t1);

l         Calendar对象和Date对象之间的互转

// 将Calendar对象转换为相对时间

Calendar c = Calendar.getInstance();

Date d = c.getTime();



// 将相对时间转换为Calendar对象

Calendar c1 = Calendar.getInstance();

Date d1 = new Date();

//通过setTime()方法后,日历c1所表示的日期就d1的日期

c1.setTime(d1);



7、         Ok,利用以上各个类的功能,我们可以很简单的实现一些时间计算的功能哦,呵呵,下面看几个方法:
l         判断是否是闰年

    /**

     * 给定一个年份判断该年份是否为闰年 create date:2009-6-10 author:Administrator

     *

     * @param year

     * @return

     */

    public static boolean isLeapYear(int year) {

       GregorianCalendar calendar = new GregorianCalendar();

       return calendar.isLeapYear(year);

    }



l         获取当前日期的字符串表示形式

    /**

     * 利用SimpleDateFormat获取当前日期的字符串表示形式 格式:2009-55-05

     *

     * create date:2009-6-5 author:Administrator

     *

     * @return

     */

    public static String getCurrentDate() {

       // 注意 SimpleDateFormat("yyyy-MM-dd")的参数间隔符号可以随意设置的,如:

       // yyyy年MM月dd日 返回格式:2009年06月09日

       // yyyy-MM-dd 返回格式: 2009-06-09

       // SimpleDateFormat dateFormat = new SimpleDateFormat(

       // "yyyy-MM-dd HH:mm:ss");

       SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

       return dateFormat.format(System.currentTimeMillis());



    }



l         给出任意一个年月日得到该天是星期几

    /**

     * 给出任意一个年月日得到该天是星期几 create date:2009-6-10 author:Administrator

     *

     * @param date

     *            参数格式 2009-6-10

     *   返回值:0 代表星期日,1代表星期1,2代表星期2,以此类推

     */

   

    public static int getWeek(String date) {



       // 注意参数的大小写格式

       SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");

       Calendar c = Calendar.getInstance();

       try {

           Date d = dateFormat.parse(date);

           c.setTime(d);

       } catch (ParseException e) {

       }



       return c.get(Calendar.DAY_OF_WEEK)-1;



    }

l         获得今天n天以后或者n天以前是那一天

    /**

     * 获得距离今天n天的那一天的日期 create date:2009-6-11 author:Administrator

     *

     * @param day

     * @return

     */

    public static String getDistanceDay(int day) {



       Calendar calen = Calendar.getInstance();

       calen.add(Calendar.DAY_OF_MONTH, day);

       Date date = calen.getTime();



       // 这里也个用SimpleDateFormat的format()进行格式化,然后以字符串形式返回格式化后的date

       SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");



       return dateFormat.format(date);

    }



l         获得距离指定日期n天的那一天的日期

/**

     * 获得距离指定日期n天的那一天的日期 create date:2009-6-11 author:Administrator

     *

     * @param date

     *            格式:2009-6-11

     * @param day

     * @return

     */

    public static String getDistanceDay(String date, int day) {



       SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");

       Date d;

       Calendar c =Calendar.getInstance();

       try {

           d = dateFormat.parse(date);

           c.setTime(d);

           c.add(Calendar.DATE, day);

       } catch (ParseException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }



       return dateFormat.format(c.getTime());

    }







/**

     * 获得给定两个日期相差度天数
     * create date:2009-6-23 author:Administrator
     *
     * @param date1
     *            参数格式:2009-06-21
     * @param date2
     */
    public static long getGapDays(String date1, String date2) {


       String[] d1 = date1.split("-");
       String[] d2 = date2.split("-");
       Calendar c = Calendar.getInstance();


       c.set(Integer.parseInt(d1[0]), Integer.parseInt(d1[1]), Integer
              .parseInt(d1[2]), 0, 0, 0);
       long l1 = c.getTimeInMillis();
       c.set(Integer.parseInt(d2[0]), Integer.parseInt(d2[1]), Integer
              .parseInt(d2[2]), 0, 0, 0);
       long l2 = c.getTimeInMillis();


       return (Math.abs(l1 - l2) / (24 * 60 * 60 * 1000));
    }

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3