About getExternalFilesDir()

Posted by & filed under Android.

It is always good practice to use the getExtennalFilesDir() method to find the location of the SD Card on an Android device.(Don’t fix using \sdcard). Because Android can run on a large number of devices with different specications, the location …

Android 开发人员必须掌握的 10 个开发工具 –转自oschina.net

Posted by & filed under Android.

Android SDK 本身包含很多帮助开发人员设计、开发、测试和发布 Android 应用的工具,在本文中,我们将讨论 10 个最常用的工具。

#1: Eclipse ADT

Eclipse ADT 是 Eclipse 平台下用来开发 Android 应用程序的插件。

Eclipse + ADT

#2: The SDK and AVD Manager

该工具包含很多重要的功能,包括管理不同的 Android SDK 版本(构建目标),你知道的 Android 的版本众多,API上有些兼容性问题。另外该工具还用于管理 Android 虚拟设备配置 (AVD) ,用来配置模拟器。

#3: Android Debug Bridge

adb(Android Debug Bridge)是Android提供的一个通用的调试工具,借助这个工具,我们可以管理设备或手机模拟器的状态。…

android的国际化和本地化

Posted by & filed under Android.

internationalization (国际化)简称 i18n,因为在i和n之间还有18个字符,localization(本地化 ),简称L10n。 一般说明一个地区的语言时,用 语言_地区的形式,如  zh_CN, zh_TW.

各国语言缩写  http://www.loc.gov/standards/iso639-2/php/code_list.php,国家和地区简写http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html

 

android 对i18n和L10n提供了非常好的支持。android没有专门的API来提供国际化,而是通过对不同resource的命名来达到国际化,同时这种命名方法还可用于对硬件的区分,如不同的新视屏用不同的图片。

      在eclipse的工程中,res目录有默认几项resource,如 drawable, layout,menu,values

其余还有

res/anim/   用来放置动画
res/xml/     用来放置style theme等xml定义。
res/raw/    用来放置data数据

android res 结构

 

 我们引用这些resource时候,在java代码中是通过R.resource_type.resource_name的方式来使用,如setTitle(R.string.main_title);

还有一种是在xml中直接引用,如

<TextView  
    android:id =”@+id/hello_view”
    android:layout_width=”fill_parent” 
    android:layout_height=”wrap_content” 
    android:text=”@string/hello”

Code Style Guidelines for Contributors

Posted by & filed under Java.

The rules below are not guidelines or recommendations, but strict rules. Contributions to Android generally will not be accepted if they do not adhere to these rules.

Not all existing code follows these rules, but all new code is expected …

探索并发编程(五)——Java多线程开发技巧

Posted by & filed under Java.

很多开发者谈到Java多线程开发,仅仅停留在new Thread(…).start()或直接使用Executor框架这个层面,对于线程的管理和控制却不够深入,通过读《Java并发编程实践》了解到了很多不为我知但又非常重要的细节,今日整理如下。

不应用线程池的缺点

有些开发者图省事,遇到需要多线程处理的地方,直接new Thread(…).start(),对于一般场景是没问题的,但如果是在并发请求很高的情况下,就会有些隐患:

  • 新建线程的开销。线程虽然比进程要轻量许多,但对于JVM来说,新建一个线程的代价还是挺大的,决不同于新建一个对象
  • 资源消耗量。没有一个池来限制线程的数量,会导致线程的数量直接取决于应用的并发量,这样有潜在的线程数据巨大的可能,那么资源消耗量将是巨大的
  • 稳定性。当线程数量超过系统资源所能承受的程度,稳定性就会成问题

制定执行策略

在每个需要多线程处理的地方,不管并发量有多大,需要考虑线程的执行策略

  • 任务以什么顺序执行
  • 可以有多少个任何并发执行
  • 可以有多少个任务进入等待执行队列
  • 系统过载的时候,应该放弃哪些任务?如何通知到应用程序?
  • 一个任务的执行前后应该做什么处理

线程池的类型

不管是通过Executors创建线程池,还是通过Spring来管理,都得清楚知道有哪几种线程池:

  • FixedThreadPool:定长线程池,提交任务时创建线程,直到池的最大容量,如果有线程非预期结束,会补充新线程
  • CachedThreadPool:可变线程池,它犹如一个弹簧,如果没有任务需求时,它回收空闲线程,如果需求增加,则按需增加线程,不对池的大小做限制
  • SingleThreadExecutor:单线程。处理不过来的任务会进入FIFO队列等待执行
  • SecheduledThreadPool:周期性线程池。支持执行周期性线程任务

其实,这些不同类型的线程池都是通过构建一个ThreadPoolExecutor来完成的,所不同的是corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,threadFactory这么几个参数。具体可以参见JDK DOC。

线程池饱和策略

由以上线程池类型可知,除了CachedThreadPool其他线程池都有饱和的可能,当饱和以后就需要相应的策略处理请求线程的任务,ThreadPoolExecutor采取的方式通过队列来存储这些任务,当然会根据池类型不同选择不同的队列,比如FixedThreadPool和SingleThreadExecutor默认采用的是无限长度的LinkedBlockingQueue。但从系统可控性讲,最好的做法是使用定长的ArrayBlockingQueue或有限的LinkedBlockingQueue,并且当达到上限时通过ThreadPoolExecutor.setRejectedExecutionHandler方法设置一个拒绝任务的策略,JDK提供了AbortPolicy、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy几种策略,具体差异可见JDK DOC

线程无依赖性

多线程任务设计上尽量使得各任务是独立无依赖的,所谓依赖性可两个方面:

  • 线程之间的依赖性。如果线程有依赖可能会造成死锁或饥饿
  • 调用者与线程的依赖性。调用者得监视线程的完成情况,影响可并发量

当然,在有些业务里确实需要一定的依赖性,比如调用者需要得到线程完成后结果,传统的Thread是不便完成的,因为run方法无返回值,只能通过一些共享的变量来传递结果,但在Executor框架里可以通过Future和Callable实现需要有返回值的任务,当然线程的异步性导致需要有相应机制来保证调用者能等待任务完成,关于Future和Callable的用法见下面的实例就一目了然了:

 

  1. public class FutureRenderer {  
  2.     private final

Android中利用App实现消息推送机制的代码实例

Posted by & filed under Android.

 

1.消息推送机制
    
服务器器端需要变被动为主动,通知客户一些开发商认为重要的信息,无论应用程序是否正在运行或者关闭。
    
我想到了一句话:don’t call me,i will call you!
     qq
今天在右下角弹出了一个对话框:奥巴马宣布本拉登挂了…”,正是如此。
    
自作聪明,就会带点小聪明,有人喜欢就有人讨厌。

2.独立进程
    
无论程序是否正在运行,我们都要能通知到客户,我们需要一个独立进程的后台服务。
    
我们需要一个独立进程的后台服务。
    
androidmanifest.xml中注册service时,有一个android:process属性,如果这个属性以“.”开头,则为此服务开启一个

全局的独立进程,如果以“:”

Android中如何做到Service被关闭后又自动启动

Posted by & filed under Android.

首先要说的是,用户可能把这种做法视为流氓软件。大部分时候,程序员也不想把软件做成流氓软件,没办法,领导说了算。

 

我们在使用某些Android应用的时候,可能会发现安装了某应用以后,会有一些服务也会随之运行。而且,这些服务每次都会随着手机开机而启动。有的服务做的更绝,当用户在运行的服务中手动停止该服务以后,过了一段时间,服务又自动运行了。虽然,从用户的角度来说,这种方式比较流氓。但是,从程序员的角度来说,这是如何做到的呢?经过研究,我发现有一种方式是可以实现的。下面就和大家分享。

 

先简单介绍,一会儿会贴上全部代码。

 

如何做到开机启动?

 

这个比较简单,网上的资料够多,只要实现一个BroadcastReceiver,监听手机启动完成的事件ACTION_BOOT_COMPLETED即可。需要注意的是,好像不能用模拟器,要用手机测试。

 

那如何做到启动一个Service,并且在用户关闭后能自动又启动了呢?

 

一般的,都会在上面说到的BroadcastReceiver的实现里面,监听手机启动完成后,启动一个Service,这是一般的做法。问题是,用户可以关闭掉该Service。那么怎样才能使它被关闭掉以后,再次启动呢?聪明的你一定立即就想到了,如果不直接启动Service,而是启动一个timmer,或者alarmManager,然后每隔一段时间去启动Service,就可以了。

 

 

还是看下面的全部代码吧,不过多解释了。这些代码中还是有不少概念的,不熟悉AlarmManager、PendingIntent、BroadcastReceiver、Service等等这些概念的同学可以百度一下。

 

  1. package com.arui.framework.android.daemonservice;  
  2.   
  3. import android.app.AlarmManager;  
  4. import android.app.PendingIntent;  
  5. import android.content.BroadcastReceiver;  
  6. import android.content.Context;  
  7. import android.content.Intent;  
  8. import android.os.SystemClock;  
  9.   
  10. public class BootBroadcast extends BroadcastReceiver {  
  11.   

Android中Context详解 —- 你所不知道的Context

Posted by & filed under Android.

             前言:本文是我读《Android内核剖析》第7章 后形成的读书笔记 ,在此向欲了解Android框架的书籍推荐此书。

          大家好,  今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友—–Context类 ,说它熟悉,是应为我们在开发中

   时刻的在与它打交道,例如:Service、BroadcastReceiver、Activity等都会利用到Context的相关方法 ; 说它陌生,完全是

   因为我们真正的不懂Context的原理、类结构关系。一个简单的问题是,一个应用程序App中存在多少个Context实例对象呢?

   一个、两个? 在此先卖个关子吧。读了本文,相信您会豁然开朗的 。

  

      Context,中文直译为“上下文”,SDK中对其说明如下:

         Interface to global information about an application environment. This is